@@ -3,6 +3,9 @@ package com.example.ide.psi
33
44import com.example.ide.completion.findReferenceStyleFile
55import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
6+ import com.intellij.lang.javascript.JSTokenTypes
7+ import com.intellij.lang.javascript.psi.JSFile
8+ import com.intellij.lang.javascript.psi.JSIndexedPropertyAccessExpression
69import com.intellij.lang.javascript.psi.JSLiteralExpression
710import com.intellij.lang.javascript.psi.JSReferenceExpression
811import com.intellij.patterns.PlatformPatterns
@@ -64,32 +67,31 @@ class CssModuleDotReferenceProvider : PsiReferenceProvider() {
6467 }
6568}
6669
67-
68- // Filter for styles.className syntax
69- private val DOT_ACCESS_FILTER = PlatformPatterns .psiElement(JSReferenceExpression ::class .java).and (
70+ // Filter for styles["className"] syntax
71+ private val INDEXED_ACCESS_FILTER = PlatformPatterns .psiElement(JSLiteralExpression ::class .java).and (
7072 FilterPattern (
7173 object : ElementFilter {
7274 override fun isAcceptable (element : Any? , context : PsiElement ? ): Boolean {
73-
74- return element is JSReferenceExpression
75- && element.reference?.resolve() != = null
76- && (element.reference?.resolve() as ES6ImportedBinding ).findReferencedElements()
77- .isNotEmpty()
78- && (element.reference?.resolve() as ES6ImportedBinding ).findReferencedElements()
79- .first() is StylesheetFile
75+ return element is JSLiteralExpression
76+ && element.parent is JSIndexedPropertyAccessExpression
77+ && context != null
78+ && context.containingFile is JSFile
79+ && isStyleIndex(element)
80+ && element.node.firstChildNode?.elementType == JSTokenTypes .STRING_LITERAL
8081 }
8182
8283 override fun isClassAcceptable (hintClass : Class <* >? ): Boolean {
83- return JSReferenceExpression ::class .java.isAssignableFrom(hintClass!! )
84+ return JSLiteralExpression ::class .java.isAssignableFrom(hintClass!! )
8485 }
8586 }
8687 ))
8788
89+
8890class CssModulesIndexedStylesVarPsiReferenceContributor : PsiReferenceContributor () {
8991 override fun registerReferenceProviders (@NotNull registrar : PsiReferenceRegistrar ) {
90- // Register provider for styles. className syntax
92+ // Register provider for styles[" className"] syntax
9193 registrar.registerReferenceProvider(
92- DOT_ACCESS_FILTER , CssModuleDotReferenceProvider ()
94+ INDEXED_ACCESS_FILTER , CssModuleIndexedReferenceProvider ()
9395 )
9496 }
9597}
0 commit comments