44import  com .intellij .openapi .util .Key ;
55import  com .intellij .patterns .PlatformPatterns ;
66import  com .intellij .psi .PsiElement ;
7+ import  com .intellij .psi .search .GlobalSearchScope ;
78import  com .intellij .psi .util .*;
89import  com .jetbrains .php .PhpIcons ;
910import  com .jetbrains .php .PhpIndex ;
11+ import  com .jetbrains .php .lang .PhpFileType ;
1012import  com .jetbrains .php .lang .parser .PhpElementTypes ;
1113import  com .jetbrains .php .lang .psi .PhpPsiUtil ;
1214import  com .jetbrains .php .lang .psi .elements .*;
15+ import  fr .adrienbrault .idea .symfony2plugin .stubs .cache .FileIndexCaches ;
16+ import  fr .adrienbrault .idea .symfony2plugin .stubs .indexes .TwigAttributeIndex ;
1317import  fr .adrienbrault .idea .symfony2plugin .templating .dict .TwigExtension ;
1418import  fr .adrienbrault .idea .symfony2plugin .util .PhpElementsUtil ;
1519import  fr .adrienbrault .idea .symfony2plugin .util .PsiElementUtils ;
@@ -30,6 +34,15 @@ public class TwigExtensionParser  {
3034    private  static  final  Key <CachedValue <Map <String , TwigExtension >>> FILTERS_CACHE  = new  Key <>("TWIG_EXTENSIONS_FILTERS" );
3135    private  static  final  Key <CachedValue <Map <String , TwigExtension >>> OPERATORS_CACHE  = new  Key <>("TWIG_EXTENSIONS_OPERATORS" );
3236
37+     private  static  final  Key <CachedValue <Map <String , List <String >>>> TWIG_ATTRIBUTE_FUNCTION_INDEX  = new  Key <>("TWIG_ATTRIBUTE_FUNCTION_INDEX" );
38+     private  static  final  Key <CachedValue <Set <String >>> TWIG_ATTRIBUTE_FUNCTION_INDEX_NAMES  = new  Key <>("TWIG_ATTRIBUTE_FUNCTION_INDEX_NAMES" );
39+ 
40+     private  static  final  Key <CachedValue <Map <String , List <String >>>> TWIG_ATTRIBUTE_FILTER_INDEX  = new  Key <>("TWIG_ATTRIBUTE_FILTER_INDEX" );
41+     private  static  final  Key <CachedValue <Set <String >>> TWIG_ATTRIBUTE_FILTER_NAMES  = new  Key <>("TWIG_ATTRIBUTE_FILTER_NAMES" );
42+ 
43+     private  static  final  Key <CachedValue <Map <String , List <String >>>> TWIG_ATTRIBUTE_TEST_INDEX  = new  Key <>("TWIG_ATTRIBUTE_TEST_INDEX" );
44+     private  static  final  Key <CachedValue <Set <String >>> TWIG_ATTRIBUTE_TEST_NAMES  = new  Key <>("TWIG_ATTRIBUTE_FUNCTION_FILTER_NAMES" );
45+ 
3346    public  enum  TwigExtensionType  {
3447        FUNCTION_METHOD , FUNCTION_NODE , SIMPLE_FUNCTION , FILTER , SIMPLE_TEST , OPERATOR 
3548    }
@@ -39,7 +52,7 @@ public static Map<String, TwigExtension> getFunctions(@NotNull Project project)
3952        return  CachedValuesManager .getManager (project ).getCachedValue (
4053            project ,
4154            FUNCTION_CACHE ,
42-             () -> CachedValueProvider .Result .create (parseFunctions (TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
55+             () -> CachedValueProvider .Result .create (parseFunctions (project ,  TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
4356            false 
4457        );
4558    }
@@ -49,7 +62,7 @@ public static Map<String, TwigExtension> getFilters(@NotNull Project project) {
4962        return  CachedValuesManager .getManager (project ).getCachedValue (
5063            project ,
5164            FILTERS_CACHE ,
52-             () -> CachedValueProvider .Result .create (parseFilters (TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
65+             () -> CachedValueProvider .Result .create (parseFilters (project ,  TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
5366            false 
5467        );
5568    }
@@ -59,7 +72,7 @@ public static Map<String, TwigExtension> getSimpleTest(@NotNull Project project)
5972        return  CachedValuesManager .getManager (project ).getCachedValue (
6073            project ,
6174            TEST_CACHE ,
62-             () -> CachedValueProvider .Result .create (parseTests (TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
75+             () -> CachedValueProvider .Result .create (parseTests (project ,  TwigUtil .getTwigExtensionClasses (project )), PsiModificationTracker .MODIFICATION_COUNT ),
6376            false 
6477        );
6578    }
@@ -75,7 +88,7 @@ public static Map<String, TwigExtension> getOperators(@NotNull Project project)
7588    }
7689
7790    @ NotNull 
78-     private  static  Map <String , TwigExtension > parseFilters (@ NotNull  Collection <PhpClass > phpClasses ) {
91+     private  static  Map <String , TwigExtension > parseFilters (@ NotNull  Project   project ,  @ NotNull   Collection <PhpClass > phpClasses ) {
7992        Map <String , TwigExtension > extensions  = new  HashMap <>();
8093
8194        for  (PhpClass  phpClass  : phpClasses ) {
@@ -92,11 +105,15 @@ private static Map<String, TwigExtension> parseFilters(@NotNull Collection<PhpCl
92105            }
93106        }
94107
108+         for  (Map .Entry <String , List <String >> entry  : FileIndexCaches .getStringDataCache (project , TWIG_ATTRIBUTE_FILTER_INDEX , TWIG_ATTRIBUTE_FILTER_NAMES , TwigAttributeIndex .KEY , GlobalSearchScope .getScopeRestrictedByFileTypes (GlobalSearchScope .allScope (project ), PhpFileType .INSTANCE )).entrySet ()) {
109+             extensions .put (entry .getKey (), new  TwigExtension (TwigExtensionType .FILTER , entry .getValue ().getFirst ()));
110+         }
111+ 
95112        return  Collections .unmodifiableMap (extensions );
96113    }
97114
98115    @ NotNull 
99-     private  static  Map <String , TwigExtension > parseFunctions (@ NotNull  Collection <PhpClass > phpClasses ) {
116+     private  static  Map <String , TwigExtension > parseFunctions (@ NotNull  Project   project ,  @ NotNull   Collection <PhpClass > phpClasses ) {
100117        Map <String , TwigExtension > extensions  = new  HashMap <>();
101118
102119        for  (PhpClass  phpClass  : phpClasses ) {
@@ -113,11 +130,15 @@ private static Map<String, TwigExtension> parseFunctions(@NotNull Collection<Php
113130            }
114131        }
115132
133+         for  (Map .Entry <String , List <String >> entry  : FileIndexCaches .getStringDataCache (project , TWIG_ATTRIBUTE_FUNCTION_INDEX , TWIG_ATTRIBUTE_FUNCTION_INDEX_NAMES , TwigAttributeIndex .KEY , GlobalSearchScope .getScopeRestrictedByFileTypes (GlobalSearchScope .allScope (project ), PhpFileType .INSTANCE )).entrySet ()) {
134+             extensions .put (entry .getKey (), new  TwigExtension (TwigExtensionType .FUNCTION_METHOD , entry .getValue ().getFirst ()));
135+         }
136+ 
116137        return  Collections .unmodifiableMap (extensions );
117138    }
118139
119140    @ NotNull 
120-     private  static  Map <String , TwigExtension > parseTests (@ NotNull  Collection <PhpClass > phpClasses ) {
141+     private  static  Map <String , TwigExtension > parseTests (@ NotNull  Project   project ,  @ NotNull   Collection <PhpClass > phpClasses ) {
121142        Map <String , TwigExtension > extensions  = new  HashMap <>();
122143
123144        for  (PhpClass  phpClass  : phpClasses ) {
@@ -129,6 +150,10 @@ private static Map<String, TwigExtension> parseTests(@NotNull Collection<PhpClas
129150            }
130151        }
131152
153+         for  (Map .Entry <String , List <String >> entry  : FileIndexCaches .getStringDataCache (project , TWIG_ATTRIBUTE_TEST_INDEX , TWIG_ATTRIBUTE_TEST_NAMES , TwigAttributeIndex .KEY , GlobalSearchScope .getScopeRestrictedByFileTypes (GlobalSearchScope .allScope (project ), PhpFileType .INSTANCE )).entrySet ()) {
154+             extensions .put (entry .getKey (), new  TwigExtension (TwigExtensionType .SIMPLE_TEST , entry .getValue ().getFirst ()));
155+         }
156+ 
132157        return  Collections .unmodifiableMap (extensions );
133158    }
134159
0 commit comments