2
2
* Copyright © Magento, Inc. All rights reserved.
3
3
* See COPYING.txt for license details.
4
4
*/
5
+
5
6
package com .magento .idea .magento2plugin .linemarker .php ;
6
7
7
8
import com .intellij .codeInsight .daemon .LineMarkerInfo ;
8
9
import com .intellij .codeInsight .daemon .LineMarkerProvider ;
9
10
import com .intellij .codeInsight .navigation .NavigationGutterIconBuilder ;
10
11
import com .intellij .icons .AllIcons ;
11
12
import com .intellij .psi .PsiElement ;
13
+ import com .intellij .psi .util .PsiTreeUtil ;
12
14
import com .jetbrains .php .PhpIndex ;
13
15
import com .jetbrains .php .lang .psi .elements .Method ;
14
16
import com .jetbrains .php .lang .psi .elements .PhpClass ;
15
17
import com .magento .idea .magento2plugin .magento .files .Plugin ;
16
18
import com .magento .idea .magento2plugin .project .Settings ;
19
+ import com .magento .idea .magento2plugin .util .magento .plugin .GetTargetClassNamesByPluginClassName ;
20
+ import java .util .ArrayList ;
21
+ import java .util .Collection ;
22
+ import java .util .HashMap ;
23
+ import java .util .List ;
17
24
import org .jetbrains .annotations .NotNull ;
18
25
import org .jetbrains .annotations .Nullable ;
19
- import com .magento .idea .magento2plugin .util .magento .plugin .GetTargetClassNamesByPluginClassName ;
20
- import com .intellij .psi .util .PsiTreeUtil ;
21
-
22
- import java .util .*;
23
26
24
27
public class PluginTargetLineMarkerProvider implements LineMarkerProvider {
25
28
@ Nullable
26
29
@ Override
27
- public LineMarkerInfo getLineMarkerInfo (@ NotNull PsiElement psiElement ) {
30
+ public LineMarkerInfo getLineMarkerInfo (@ NotNull final PsiElement psiElement ) {
28
31
return null ;
29
32
}
30
33
31
34
@ Override
32
- public void collectSlowLineMarkers (@ NotNull List <PsiElement > psiElements , @ NotNull Collection <LineMarkerInfo > collection ) {
33
- if (psiElements .size () > 0 ) {
34
- if (!Settings .isEnabled (psiElements .get (0 ).getProject ())) {
35
- return ;
36
- }
35
+ public void collectSlowLineMarkers (
36
+ @ NotNull final List <PsiElement > psiElements ,
37
+ @ NotNull final Collection <LineMarkerInfo > collection
38
+ ) {
39
+ if (!psiElements .isEmpty () && !Settings .isEnabled (psiElements .get (0 ).getProject ())) {
40
+ return ;
37
41
}
38
- PluginClassCache pluginClassCache = new PluginClassCache ();
39
- TargetClassesCollector TargetClassesCollector = new TargetClassesCollector (pluginClassCache );
40
- TargetMethodsCollector TargetMethodsCollector = new TargetMethodsCollector (pluginClassCache );
42
+ final PluginClassCache pluginClassCache = new PluginClassCache ();
43
+ final TargetClassesCollector targetClassesCollector =
44
+ new TargetClassesCollector (pluginClassCache );
45
+ final TargetMethodsCollector targetMethodsCollector =
46
+ new TargetMethodsCollector (pluginClassCache );
41
47
42
- for (PsiElement psiElement : psiElements ) {
48
+ for (final PsiElement psiElement : psiElements ) {
43
49
if (psiElement instanceof PhpClass || psiElement instanceof Method ) {
44
50
List <? extends PsiElement > results ;
45
51
46
52
if (psiElement instanceof PhpClass ) {
47
- results = TargetClassesCollector .collect ((PhpClass ) psiElement );
48
- if (results .size () > 0 ) {
53
+ results = targetClassesCollector .collect ((PhpClass ) psiElement );
54
+ if (! results .isEmpty () ) {
49
55
collection .add (NavigationGutterIconBuilder
50
56
.create (AllIcons .Nodes .Class )
51
57
.setTargets (results )
@@ -54,8 +60,8 @@ public void collectSlowLineMarkers(@NotNull List<PsiElement> psiElements, @NotNu
54
60
);
55
61
}
56
62
} else {
57
- results = TargetMethodsCollector .collect ((Method ) psiElement );
58
- if (results .size () > 0 ) {
63
+ results = targetMethodsCollector .collect ((Method ) psiElement );
64
+ if (! results .isEmpty () ) {
59
65
collection .add (NavigationGutterIconBuilder
60
66
.create (AllIcons .Nodes .Method )
61
67
.setTargets (results )
@@ -70,37 +76,49 @@ public void collectSlowLineMarkers(@NotNull List<PsiElement> psiElements, @NotNu
70
76
}
71
77
72
78
private static class PluginClassCache {
73
- private HashMap <String , List <PhpClass >> pluginClassesMap = new HashMap <String , List <PhpClass >>();
79
+ private final HashMap <String , List <PhpClass >> pluginClassesMap = // NOPMD
80
+ new HashMap <>();
74
81
75
- List <PhpClass > getTargetClassesForPlugin (@ NotNull PhpClass phpClass , @ NotNull String classFQN ) {
76
- List <PhpClass > results = new ArrayList <>();
82
+ private List <PhpClass > getTargetClassesForPlugin (
83
+ @ NotNull final PhpClass phpClass ,
84
+ @ NotNull final String classFQN
85
+ ) {
77
86
78
87
if (pluginClassesMap .containsKey (classFQN )) {
79
88
return pluginClassesMap .get (classFQN );
80
89
}
81
90
82
- GetTargetClassNamesByPluginClassName targetClassesService = GetTargetClassNamesByPluginClassName .getInstance (phpClass .getProject ());
83
- ArrayList <String > targetClassNames = targetClassesService .execute (classFQN );
91
+ final GetTargetClassNamesByPluginClassName targetClassesService =
92
+ GetTargetClassNamesByPluginClassName .getInstance (phpClass .getProject ());
93
+ final ArrayList <String > targetClassNames = targetClassesService .execute (classFQN );
94
+
95
+ final List <PhpClass > results = new ArrayList <>();
84
96
85
- if (targetClassNames .size () == 0 ) {
97
+ if (targetClassNames .isEmpty () ) {
86
98
pluginClassesMap .put (classFQN , results );
87
99
return results ;
88
100
}
89
101
90
- PhpIndex phpIndex = PhpIndex .getInstance (phpClass .getProject ());
102
+ final PhpIndex phpIndex = PhpIndex .getInstance (phpClass .getProject ());
91
103
92
- for (String targetClassName : targetClassNames ) {
93
- Collection <PhpClass > targets = phpIndex .getClassesByFQN (targetClassName );
104
+ for (final String targetClassName : targetClassNames ) {
105
+ Collection <PhpClass > targets = phpIndex .getInterfacesByFQN (targetClassName );
106
+
107
+ if (targets .isEmpty ()) {
108
+ targets = phpIndex .getClassesByFQN (targetClassName );
109
+ }
94
110
95
111
results .addAll (targets );
96
112
}
97
113
98
114
return results ;
99
115
}
100
116
101
- List <PhpClass > getTargetClassesForPlugin (@ NotNull PhpClass phpClass ) {
102
- List <PhpClass > classesForPlugin = getTargetClassesForPlugin (phpClass , phpClass .getPresentableFQN ());
103
- for (PhpClass parent : phpClass .getSupers ()) {
117
+ protected List <PhpClass > getTargetClassesForPlugin (@ NotNull final PhpClass phpClass ) {
118
+ final List <PhpClass > classesForPlugin = getTargetClassesForPlugin (
119
+ phpClass , phpClass .getPresentableFQN ()
120
+ );
121
+ for (final PhpClass parent : phpClass .getSupers ()) {
104
122
classesForPlugin .addAll (getTargetClassesForPlugin (parent ));
105
123
}
106
124
@@ -109,52 +127,59 @@ List<PhpClass> getTargetClassesForPlugin(@NotNull PhpClass phpClass) {
109
127
}
110
128
111
129
private static class TargetClassesCollector implements Collector <PhpClass , PhpClass > {
112
- private PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ;
130
+ private final PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ;
113
131
114
- TargetClassesCollector (PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ) {
132
+ TargetClassesCollector (// NOPMD
133
+ final PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache
134
+ ) {
115
135
this .pluginClassCache = pluginClassCache ;
116
136
}
117
137
118
138
@ Override
119
- public List <PhpClass > collect (@ NotNull PhpClass psiElement ) {
139
+ public List <PhpClass > collect (@ NotNull final PhpClass psiElement ) {
120
140
return pluginClassCache .getTargetClassesForPlugin (psiElement );
121
141
}
122
142
}
123
143
124
144
private static class TargetMethodsCollector implements Collector <Method , Method > {
125
- private PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ;
145
+ private final PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ;
126
146
127
- TargetMethodsCollector (PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache ) {
147
+ TargetMethodsCollector (// NOPMD
148
+ final PluginTargetLineMarkerProvider .PluginClassCache pluginClassCache
149
+ ) {
128
150
this .pluginClassCache = pluginClassCache ;
129
151
}
130
152
131
153
@ Override
132
- public List <Method > collect (@ NotNull Method pluginMethod ) {
133
- List <Method > results = new ArrayList <>();
154
+ public List <Method > collect (@ NotNull final Method pluginMethod ) {
155
+ final List <Method > results = new ArrayList <>();
134
156
135
157
/* Check if the method is a plugin */
136
158
if (null == getPluginPrefix (pluginMethod )) {
137
159
return results ;
138
160
}
139
161
140
- PhpClass pluginClass = pluginMethod .getContainingClass ();
162
+ final PhpClass pluginClass = pluginMethod .getContainingClass ();
141
163
if (pluginClass == null ) {
142
164
return results ;
143
165
}
144
166
145
- List <PhpClass > targetClasses = pluginClassCache .getTargetClassesForPlugin (pluginClass );
146
- if (targetClasses .size () == 0 ) {
167
+ final List <PhpClass > targetClasses
168
+ = pluginClassCache .getTargetClassesForPlugin (pluginClass );
169
+ if (targetClasses .isEmpty ()) {
147
170
return results ;
148
171
}
149
172
150
- for (PhpClass targetClass : targetClasses ) {
151
- String pluginPrefix = getPluginPrefix (pluginMethod );
152
- String targetClassMethodName = getTargetMethodName (pluginMethod , pluginPrefix );
173
+ for (final PhpClass targetClass : targetClasses ) {
174
+ final String pluginPrefix = getPluginPrefix (pluginMethod );
175
+ final String targetClassMethodName = getTargetMethodName (
176
+ pluginMethod , pluginPrefix
177
+ );
153
178
if (targetClassMethodName == null ) {
154
179
continue ;
155
180
}
156
181
157
- Method targetMethod = targetClass .findMethodByName (targetClassMethodName );
182
+ final Method targetMethod = targetClass .findMethodByName (targetClassMethodName );
158
183
if (targetMethod == null ) {
159
184
continue ;
160
185
}
@@ -165,23 +190,21 @@ public List<Method> collect(@NotNull Method pluginMethod) {
165
190
return results ;
166
191
}
167
192
168
- private String getTargetMethodName (Method pluginMethod , String pluginPrefix ) {
169
- String pluginMethodName = pluginMethod .getName ();
170
- String targetClassMethodName = pluginMethodName .
171
- replace (pluginPrefix , "" );
193
+ private String getTargetMethodName (final Method pluginMethod , final String pluginPrefix ) {
194
+ final String targetClassMethodName = pluginMethod .getName ().replace (pluginPrefix , "" );
172
195
if (targetClassMethodName .isEmpty ()) {
173
196
return null ;
174
197
}
175
- char firstCharOfTargetName = targetClassMethodName .charAt (0 );
176
- int charType = Character .getType (firstCharOfTargetName );
177
- if (charType == Character .LOWERCASE_LETTER ) {
198
+ final char firstCharOfTargetName = targetClassMethodName .charAt (0 );
199
+ if (Character .getType (firstCharOfTargetName ) == Character .LOWERCASE_LETTER ) {
178
200
return null ;
179
201
}
180
- return Character .toLowerCase (firstCharOfTargetName ) + targetClassMethodName .substring (1 );
202
+ return Character .toLowerCase (firstCharOfTargetName )
203
+ + targetClassMethodName .substring (1 );
181
204
}
182
205
183
- private String getPluginPrefix (Method pluginMethod ) {
184
- String pluginMethodName = pluginMethod .getName ();
206
+ private String getPluginPrefix (final Method pluginMethod ) {
207
+ final String pluginMethodName = pluginMethod .getName ();
185
208
if (pluginMethodName .startsWith (Plugin .PluginType .around .toString ())) {
186
209
return Plugin .PluginType .around .toString ();
187
210
}
0 commit comments