From 088dbd5661da1cab4d495befcb9abda00a38ff62 Mon Sep 17 00:00:00 2001 From: me Date: Sun, 26 May 2024 23:56:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4componentBody?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../completion/provider/ComponentProvider.kt | 39 +++++++++++++++---- .../zhouxi/slint/lang/SlintElementFactory.kt | 16 ++++++++ .../slint/lang/psi/stubs/index/StubIndexEx.kt | 6 --- .../stubs/types/SlintComponentElementType.kt | 7 +--- 4 files changed, 49 insertions(+), 19 deletions(-) diff --git a/src/main/kotlin/me/zhouxi/slint/completion/provider/ComponentProvider.kt b/src/main/kotlin/me/zhouxi/slint/completion/provider/ComponentProvider.kt index f8be5b4..f3c4c4d 100644 --- a/src/main/kotlin/me/zhouxi/slint/completion/provider/ComponentProvider.kt +++ b/src/main/kotlin/me/zhouxi/slint/completion/provider/ComponentProvider.kt @@ -7,10 +7,18 @@ import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.codeInsight.lookup.LookupElementDecorator import com.intellij.icons.AllIcons import com.intellij.openapi.vfs.VfsUtil +import com.intellij.psi.PsiDocumentManager +import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope.projectScope import com.intellij.psi.stubs.StubIndex +import com.intellij.psi.util.childrenOfType +import com.intellij.refactoring.extractMethod.newImpl.ExtractMethodHelper.addSiblingAfter +import com.intellij.testFramework.utils.editor.commitToPsi import com.intellij.util.ProcessingContext +import me.zhouxi.slint.lang.createImport +import me.zhouxi.slint.lang.createImportSpecifier import me.zhouxi.slint.lang.psi.SlintComponent +import me.zhouxi.slint.lang.psi.SlintImport import me.zhouxi.slint.lang.psi.stubs.index.StubIndexKeys object ComponentProvider : CompletionProvider() { @@ -35,13 +43,30 @@ object ComponentProvider : CompletionProvider() { true } val lookups = components.map { - val targetFile = it.containingFile.originalFile.virtualFile - val currentFile = parameters.position.containingFile.originalFile.virtualFile - val path = VfsUtil.findRelativePath(currentFile, targetFile, '/') - val builder = - LookupElementBuilder.create(it).withTypeText(path).withIcon(AllIcons.Nodes.Class) - LookupElementDecorator.withInsertHandler(builder) { _, item -> - println(item.psiElement) + val targetFile = it.containingFile.originalFile + val currentFile = parameters.position.containingFile.originalFile + val path = VfsUtil.findRelativePath(currentFile.virtualFile, targetFile.virtualFile, '/') + val builder = LookupElementBuilder.create(it).withTypeText(path).withIcon(AllIcons.Nodes.Class) + LookupElementDecorator.withInsertHandler(builder) { context, item -> +// val caretOffset: Int = context.editor.caretModel.offset +// context.document.insertString(caretOffset, "{}") +// context.editor.caretModel.moveToOffset(caretOffset + 1) + val currentFile = PsiDocumentManager.getInstance(project).getPsiFile(context.document)!! + val element = item.psiElement as SlintComponent + val targetImport = currentFile.childrenOfType().find { import -> + val target = import.importElement?.moduleLocation?.reference?.resolve() + PsiManager.getInstance(project).areElementsEquivalent(target, targetFile) + } + if (targetImport == null) { + currentFile.addBefore( + createImport(project, element.componentName!!.text, path!!), + currentFile.firstChild + ) + } else { + val importElement = targetImport.importElement!! + val specifier = createImportSpecifier(project, element.componentName!!.text) + importElement.addAfter(specifier,importElement.importSpecifierList.last()) + } } } result.addAllElements(lookups) diff --git a/src/main/kotlin/me/zhouxi/slint/lang/SlintElementFactory.kt b/src/main/kotlin/me/zhouxi/slint/lang/SlintElementFactory.kt index 88e1df9..4f5c553 100644 --- a/src/main/kotlin/me/zhouxi/slint/lang/SlintElementFactory.kt +++ b/src/main/kotlin/me/zhouxi/slint/lang/SlintElementFactory.kt @@ -3,8 +3,10 @@ package me.zhouxi.slint.lang import com.intellij.openapi.project.Project import com.intellij.psi.PsiElement import com.intellij.psi.PsiFileFactory +import com.intellij.psi.util.PsiTreeUtil import me.zhouxi.slint.lang.psi.SlintComponent import me.zhouxi.slint.lang.psi.SlintFile +import me.zhouxi.slint.lang.psi.SlintImportSpecifier /** * @author zhouxi 2024/5/8 @@ -16,3 +18,17 @@ fun createIdentifier(project: Project?, text: String): PsiElement { return file.findChildByClass(SlintComponent::class.java)!!.componentName!!.identifier } +fun createImport(project: Project?, text: String, location: String): PsiElement { + val factory = PsiFileFactory.getInstance(project) + val file = factory.createFileFromText( + "dummy.slint", + SlintLanguage.INSTANCE, + """import {$text} from "$location";""" + ) as SlintFile + return file.firstChild +} + +fun createImportSpecifier(project: Project?, text: String): PsiElement { + val element = createImport(project, text, "-") + return PsiTreeUtil.findChildOfType(element, SlintImportSpecifier::class.java)!! +} \ No newline at end of file diff --git a/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/index/StubIndexEx.kt b/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/index/StubIndexEx.kt index 4c9f416..bff2334 100644 --- a/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/index/StubIndexEx.kt +++ b/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/index/StubIndexEx.kt @@ -1,7 +1,6 @@ package me.zhouxi.slint.lang.psi.stubs.index import com.intellij.openapi.project.Project -import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubIndex @@ -16,9 +15,4 @@ fun searchComponent(key: String, project: Project, psiFile: PsiFile? = null): Co project, scope, SlintComponent::class.java ) -} -fun searchProperty(key: String,project: Project,psiElement: PsiElement){ -// GlobalSearchScope; -// StubIndex.getInstance().getAllKeys() - } \ No newline at end of file diff --git a/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/types/SlintComponentElementType.kt b/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/types/SlintComponentElementType.kt index 44dbe87..2d32e60 100644 --- a/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/types/SlintComponentElementType.kt +++ b/src/main/kotlin/me/zhouxi/slint/lang/psi/stubs/types/SlintComponentElementType.kt @@ -1,6 +1,5 @@ package me.zhouxi.slint.lang.psi.stubs.types -import com.intellij.lang.ASTNode import com.intellij.lang.LighterAST import com.intellij.lang.LighterASTNode import com.intellij.lang.LighterASTTokenNode @@ -10,9 +9,9 @@ import me.zhouxi.slint.lang.SlintLanguage import me.zhouxi.slint.lang.psi.SlintComponent import me.zhouxi.slint.lang.psi.SlintTypes.* import me.zhouxi.slint.lang.psi.impl.SlintComponentImpl -import me.zhouxi.slint.lang.psi.stubs.stub.impl.SlintComponentStubImpl import me.zhouxi.slint.lang.psi.stubs.index.StubIndexKeys import me.zhouxi.slint.lang.psi.stubs.stub.SlintComponentStub +import me.zhouxi.slint.lang.psi.stubs.stub.impl.SlintComponentStubImpl import java.io.IOException /** @@ -24,10 +23,6 @@ object SlintComponentElementType : return SlintComponentImpl(stub, this) } - fun createPsi(node: ASTNode): SlintComponent { - return SlintComponentImpl(node) - } - override fun createStub(psi: SlintComponent, parentStub: StubElement): SlintComponentStub { return SlintComponentStubImpl( parentStub,