14
14
import fr .adrienbrault .idea .symfony2plugin .util .PhpElementsUtil ;
15
15
import fr .adrienbrault .idea .symfony2plugin .util .PsiElementUtils ;
16
16
import org .apache .commons .lang .StringUtils ;
17
+ import org .jetbrains .annotations .NotNull ;
17
18
import org .jetbrains .annotations .Nullable ;
18
19
19
20
import javax .swing .*;
@@ -23,21 +24,21 @@ public class TwigExtensionParser {
23
24
24
25
private Project project ;
25
26
26
- private HashMap <String , TwigExtension > functions ;
27
- private HashMap <String , TwigExtension > filters ;
27
+ private Map <String , TwigExtension > functions ;
28
+ private Map <String , TwigExtension > filters ;
28
29
29
30
public TwigExtensionParser (Project project ) {
30
31
this .project = project ;
31
32
}
32
33
33
- public HashMap <String , TwigExtension > getFunctions () {
34
+ public Map <String , TwigExtension > getFunctions () {
34
35
if (functions == null ) {
35
36
this .parseElementType (TwigElementType .METHOD );
36
37
}
37
38
return functions ;
38
39
}
39
40
40
- public HashMap <String , TwigExtension > getFilters () {
41
+ public Map <String , TwigExtension > getFilters () {
41
42
if (filters == null ) {
42
43
this .parseElementType (TwigElementType .FILTER );
43
44
}
@@ -98,7 +99,7 @@ private void parseFunctions(Collection<String> classNames) {
98
99
}
99
100
}
100
101
101
- protected Map <String , TwigExtension > parseFunctions (final Method method , final HashMap <String , TwigExtension > filters ) {
102
+ protected Map <String , TwigExtension > parseFunctions (final Method method , final Map <String , TwigExtension > filters ) {
102
103
103
104
final PhpClass containingClass = method .getContainingClass ();
104
105
if (containingClass == null ) {
@@ -152,7 +153,7 @@ private static String getCallableSignature(PsiElement psiElement, Method method)
152
153
return null ;
153
154
}
154
155
155
- protected HashMap <String , TwigExtension > parseFilter (Method method , HashMap <String , TwigExtension > filters ) {
156
+ protected Map <String , TwigExtension > parseFilter (Method method , Map <String , TwigExtension > filters ) {
156
157
157
158
158
159
final PhpClass containingClass = method .getContainingClass ();
@@ -188,10 +189,10 @@ public static Icon getIcon(TwigExtensionType twigExtensionType) {
188
189
}
189
190
private static class TwigFilterVisitor extends PsiRecursiveElementWalkingVisitor {
190
191
private final Method method ;
191
- private final HashMap <String , TwigExtension > filters ;
192
+ private final Map <String , TwigExtension > filters ;
192
193
private final PhpClass containingClass ;
193
194
194
- public TwigFilterVisitor (Method method , HashMap <String , TwigExtension > filters , PhpClass containingClass ) {
195
+ public TwigFilterVisitor (Method method , Map <String , TwigExtension > filters , PhpClass containingClass ) {
195
196
this .method = method ;
196
197
this .filters = filters ;
197
198
this .containingClass = containingClass ;
@@ -226,7 +227,13 @@ private void visitNewExpression(NewExpressionImpl element) {
226
227
signature = getCallableSignature (psiElement [1 ], method );
227
228
}
228
229
229
- filters .put (funcName , new TwigExtension (TwigExtensionType .FILTER , signature ));
230
+ TwigExtension twigExtension = new TwigExtension (TwigExtensionType .FILTER , signature );
231
+
232
+ if (psiElement .length > 2 && psiElement [2 ] instanceof ArrayCreationExpression ) {
233
+ decorateOptions ((ArrayCreationExpression ) psiElement [2 ], twigExtension );
234
+ }
235
+
236
+ filters .put (funcName , twigExtension );
230
237
}
231
238
232
239
}
@@ -293,12 +300,27 @@ private void visitNewExpression(NewExpressionImpl element) {
293
300
}
294
301
}
295
302
303
+ /**
304
+ * Add needs_environment, needs_context values to twig extension object
305
+ */
306
+ private static void decorateOptions (@ NotNull ArrayCreationExpression arrayCreationExpression , @ NotNull TwigExtension twigExtension ) {
307
+ for (String optionTrue : new String [] {"needs_environment" , "needs_context" }) {
308
+ PhpPsiElement phpPsiElement = PhpElementsUtil .getArrayValue (arrayCreationExpression , optionTrue );
309
+ if (phpPsiElement instanceof ConstantReference ) {
310
+ String value = phpPsiElement .getName ();
311
+ if (value != null && value .toLowerCase ().equals ("true" )) {
312
+ twigExtension .putOption (optionTrue , "true" );
313
+ }
314
+ }
315
+ }
316
+ }
317
+
296
318
private static class TwigFunctionVisitor extends PsiRecursiveElementWalkingVisitor {
297
319
private final Method method ;
298
- private final HashMap <String , TwigExtension > filters ;
320
+ private final Map <String , TwigExtension > filters ;
299
321
private final PhpClass containingClass ;
300
322
301
- public TwigFunctionVisitor (Method method , HashMap <String , TwigExtension > filters , PhpClass containingClass ) {
323
+ public TwigFunctionVisitor (Method method , Map <String , TwigExtension > filters , PhpClass containingClass ) {
302
324
this .method = method ;
303
325
this .filters = filters ;
304
326
this .containingClass = containingClass ;
@@ -333,7 +355,12 @@ private void visitNewExpression(NewExpressionImpl element) {
333
355
signature = getCallableSignature (psiElement [1 ], method );
334
356
}
335
357
336
- filters .put (funcName , new TwigExtension (TwigExtensionType .SIMPLE_FUNCTION , signature ));
358
+ TwigExtension twigExtension = new TwigExtension (TwigExtensionType .SIMPLE_FUNCTION , signature );
359
+ if (psiElement .length > 2 && psiElement [2 ] instanceof ArrayCreationExpression ) {
360
+ decorateOptions ((ArrayCreationExpression ) psiElement [2 ], twigExtension );
361
+ }
362
+
363
+ filters .put (funcName , twigExtension );
337
364
338
365
}
339
366
0 commit comments