删除componentBody

This commit is contained in:
me
2024-05-26 23:56:15 +08:00
parent 6fd71775c7
commit 088dbd5661
4 changed files with 49 additions and 19 deletions

View File

@@ -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<CompletionParameters>() {
@@ -35,13 +43,30 @@ object ComponentProvider : CompletionProvider<CompletionParameters>() {
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<SlintImport>().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)

View File

@@ -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)!!
}

View File

@@ -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
@@ -17,8 +16,3 @@ fun searchComponent(key: String, project: Project, psiFile: PsiFile? = null): Co
SlintComponent::class.java
)
}
fun searchProperty(key: String,project: Project,psiElement: PsiElement){
// GlobalSearchScope;
// StubIndex.getInstance().getAllKeys()
}

View File

@@ -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<out PsiElement?>): SlintComponentStub {
return SlintComponentStubImpl(
parentStub,