1- package com.example.ide.css
1+ package com.example.ide.completion
22
33import com.intellij.codeInsight.completion.*
4+ import com.intellij.codeInsight.lookup.LookupElementBuilder
45import com.intellij.lang.ecmascript6.psi.ES6ImportedBinding
56import com.intellij.lang.javascript.JavascriptLanguage
6- import com.intellij.lang.javascript.psi.JSIndexedPropertyAccessExpression
77import com.intellij.lang.javascript.psi.JSLiteralExpression
88import com.intellij.lang.javascript.psi.JSReferenceExpression
99import com.intellij.patterns.PlatformPatterns
1010import com.intellij.psi.PsiElement
11+ import com.intellij.psi.css.CssSelectorSuffix
1112import com.intellij.psi.css.StylesheetFile
13+ import com.intellij.psi.css.impl.stubs.index.CssClassIndex
14+ import com.intellij.psi.css.impl.util.CssUtil
15+ import com.intellij.psi.stubs.StubIndex
1216import com.intellij.util.ProcessingContext
1317
1418const val SplitChar = " -"
@@ -17,17 +21,17 @@ const val DotChar = "."
1721class CssModulesClassNameCompletionContributor : CompletionContributor () {
1822
1923 init {
20- extend(
21- CompletionType .BASIC ,
22- PlatformPatterns
23- .psiElement()
24- .withLanguage(JavascriptLanguage .INSTANCE )
25- // must in '' or ""
26- .withParent(JSLiteralExpression ::class .java)
27- // styles["xxx"]
28- .withSuperParent(2 , JSIndexedPropertyAccessExpression ::class .java),
29- CssModulesClassNameCompletionContributorProvider ()
30- )
24+ // extend(
25+ // CompletionType.BASIC,
26+ // PlatformPatterns
27+ // .psiElement()
28+ // .withLanguage(JavascriptLanguage.INSTANCE)
29+ // // must in '' or ""
30+ // .withParent(JSLiteralExpression::class.java)
31+ // // styles["xxx"]
32+ // .withSuperParent(2, JSIndexedPropertyAccessExpression::class.java),
33+ // CssModulesClassNameCompletionContributorProvider()
34+ // )
3135 extend(
3236 CompletionType .BASIC ,
3337 PlatformPatterns
@@ -59,26 +63,41 @@ class CssModulesClassNameCompletionContributor : CompletionContributor() {
5963 context : ProcessingContext ,
6064 resultSet : CompletionResultSet
6165 ) {
62-
66+ val time = System .nanoTime();
6367 val position = parameters.position
68+ val project = position.project
69+ val originalFile = parameters.originalFile
70+ val scope = CssUtil .getCompletionAndResolvingScopeForElement(position);
71+ val validSet = mutableMapOf<String , Boolean >()
6472 if (position.prevSibling is PsiElement
6573 && position.prevSibling.text == DotChar
6674 && position.prevSibling.prevSibling is JSReferenceExpression
6775 ) {
6876 val style = position.prevSibling.prevSibling
69- style.reference?.resolve()?.let {
70- if (it !is ES6ImportedBinding || it.findReferencedElements().isEmpty()) return
71- val first = it.findReferencedElements().first()
72- first.let {
73- resultSet.addAllElements(generateLookupElementList(it as StylesheetFile , true ).map {
74- // if choose completion with - , auto make to IndexedAccess
75- it.withInsertHandler { context, item ->
76- StylesInsertHandler (item.lookupString.contains(SplitChar )).handleInsert(context, item)
77- }
78- })
77+ val styleFile = style.reference?.resolve() as ES6ImportedBinding
78+ val file = styleFile.findReferencedElements().first() as StylesheetFile
79+ val importedFiles =
80+ CssUtil .getImportedFiles(file, file.lastChild, false )
81+ println (importedFiles.map { it.name })
82+ for (name in StubIndex .getInstance().getAllKeys(CssClassIndex .KEY , project)) {
83+ if (validSet[name] == false ) continue
84+ StubIndex .getInstance().processElements(
85+ CssClassIndex .KEY ,
86+ name,
87+ project,
88+ scope,
89+ CssSelectorSuffix ::class .java
90+ ) {
91+ val valid = importedFiles.contains(it.containingFile.virtualFile)
92+ if (valid) {
93+ resultSet.addElement(LookupElementBuilder .create(name))
94+ }
95+ true
7996 }
8097 }
8198 }
99+ val end = System .nanoTime();
100+ println (" time is ${(end - time)} /ns " )
82101 }
83102 }
84103}
0 commit comments