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