fix: 语法问题
This commit is contained in:
@@ -2,11 +2,7 @@ package me.zhouxi.slint.completion
|
||||
|
||||
import com.intellij.codeInsight.completion.CompletionContributor
|
||||
import com.intellij.codeInsight.completion.CompletionParameters
|
||||
import com.intellij.codeInsight.completion.CompletionProvider
|
||||
import com.intellij.codeInsight.completion.CompletionType
|
||||
import com.intellij.openapi.util.Pair
|
||||
import com.intellij.patterns.ElementPattern
|
||||
import com.intellij.psi.PsiElement
|
||||
import me.zhouxi.slint.completion.provider.*
|
||||
|
||||
class SlintCompletionContributor : CompletionContributor() {
|
||||
@@ -14,8 +10,8 @@ class SlintCompletionContributor : CompletionContributor() {
|
||||
extend(TopKeywordProvider)
|
||||
extend(BasicTypeProvider)
|
||||
extend(AtChildrenCompletionProvider)
|
||||
extend(ElementKeywordProvider)
|
||||
extend(ComponentProvider)
|
||||
extend(ComponentElementKeywordProvider)
|
||||
extend(ComponentNameProvider)
|
||||
extend(PropertyBindingProvider)
|
||||
extend(InheritsCompletionProvider)
|
||||
}
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package me.zhouxi.slint.completion.provider
|
||||
|
||||
import com.intellij.codeInsight.completion.CompletionParameters
|
||||
import com.intellij.codeInsight.completion.CompletionProvider
|
||||
import com.intellij.codeInsight.completion.CompletionResultSet
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||
import com.intellij.patterns.ElementPattern
|
||||
@@ -10,7 +9,7 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.util.ProcessingContext
|
||||
import me.zhouxi.slint.lang.psi.SlintTypes.Component
|
||||
|
||||
object ElementKeywordProvider : AbstractSlintCompletionProvider<CompletionParameters>() {
|
||||
object ComponentElementKeywordProvider : AbstractSlintCompletionProvider<CompletionParameters>() {
|
||||
override fun addCompletions(
|
||||
parameters: CompletionParameters,
|
||||
context: ProcessingContext,
|
||||
@@ -18,7 +18,6 @@ import com.intellij.psi.search.GlobalSearchScope.projectScope
|
||||
import com.intellij.psi.stubs.StubIndex
|
||||
import com.intellij.psi.util.PsiTreeUtil
|
||||
import com.intellij.psi.util.childrenOfType
|
||||
import com.intellij.psi.util.parentOfType
|
||||
import com.intellij.util.ProcessingContext
|
||||
import me.zhouxi.slint.lang.createComma
|
||||
import me.zhouxi.slint.lang.createImport
|
||||
@@ -31,7 +30,7 @@ import me.zhouxi.slint.lang.psi.SlintTypes.InheritDeclaration
|
||||
import me.zhouxi.slint.lang.psi.extension.importNames
|
||||
import me.zhouxi.slint.lang.psi.stubs.index.StubIndexKeys
|
||||
|
||||
object ComponentProvider : AbstractSlintCompletionProvider<CompletionParameters>() {
|
||||
object ComponentNameProvider : AbstractSlintCompletionProvider<CompletionParameters>() {
|
||||
override fun addCompletions(
|
||||
parameters: CompletionParameters,
|
||||
context: ProcessingContext,
|
||||
@@ -72,8 +71,8 @@ object ComponentProvider : AbstractSlintCompletionProvider<CompletionParameters>
|
||||
val caretOffset: Int = context.editor.caretModel.offset
|
||||
val elementAt = context.file.findElementAt(caretOffset)
|
||||
if (elementAt?.prevSibling !is SlintInheritDeclaration) {
|
||||
context.document.insertString(caretOffset, "{}")
|
||||
context.editor.caretModel.moveToOffset(caretOffset + 1)
|
||||
context.document.insertString(caretOffset, " { }")
|
||||
context.editor.caretModel.moveToOffset(caretOffset + 3)
|
||||
PsiDocumentManager.getInstance(context.project).commitDocument(context.document)
|
||||
}
|
||||
val component = item.psiElement as SlintComponent
|
||||
@@ -2,11 +2,20 @@ package me.zhouxi.slint.completion.provider
|
||||
|
||||
import com.intellij.codeInsight.completion.CompletionParameters
|
||||
import com.intellij.codeInsight.completion.CompletionResultSet
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder
|
||||
import com.intellij.codeInsight.completion.InsertHandler
|
||||
import com.intellij.codeInsight.completion.InsertionContext
|
||||
import com.intellij.codeInsight.lookup.LookupElement
|
||||
import com.intellij.codeInsight.lookup.LookupElementBuilder.*
|
||||
import com.intellij.codeInsight.template.Template
|
||||
import com.intellij.codeInsight.template.TemplateEditingAdapter
|
||||
import com.intellij.codeInsight.template.TemplateManager
|
||||
import com.intellij.codeInsight.template.impl.ConstantNode
|
||||
import com.intellij.icons.AllIcons
|
||||
import com.intellij.patterns.ElementPattern
|
||||
import com.intellij.patterns.PlatformPatterns.psiElement
|
||||
import com.intellij.psi.PsiElement
|
||||
import com.intellij.util.ProcessingContext
|
||||
import me.zhouxi.slint.lang.psi.SlintTypes.Component
|
||||
import me.zhouxi.slint.lang.psi.stubs.types.SlintFileElementType
|
||||
|
||||
object TopKeywordProvider : AbstractSlintCompletionProvider<CompletionParameters>() {
|
||||
@@ -15,13 +24,42 @@ object TopKeywordProvider : AbstractSlintCompletionProvider<CompletionParameters
|
||||
context: ProcessingContext,
|
||||
result: CompletionResultSet
|
||||
) {
|
||||
result.addAllElements(topKeywords)
|
||||
result.addAllElements(completion)
|
||||
result.addElement(create("component"))
|
||||
}
|
||||
|
||||
val completion = arrayListOf(create("component "), create("struct "), create("enum "))
|
||||
.flatMap {
|
||||
arrayListOf(
|
||||
it,
|
||||
it.withPresentableText(it.lookupString)
|
||||
.withTailText("\$Name$ {...}")
|
||||
.withInsertHandler(MyInsertHandler()),
|
||||
create("export ${it.lookupString}"),
|
||||
create("export ${it.lookupString}")
|
||||
.withTailText("\$Name$ {...}")
|
||||
.withInsertHandler(MyInsertHandler()),
|
||||
)
|
||||
}
|
||||
|
||||
private val topKeywords =
|
||||
arrayOf("export", "component", "global", "enum", "struct").map { LookupElementBuilder.create(it) }
|
||||
|
||||
override fun pattern(): ElementPattern<out PsiElement> {
|
||||
return psiElement().withSuperParent(1, psiElement(SlintFileElementType))
|
||||
return psiElement().withSuperParent(2, psiElement(SlintFileElementType))
|
||||
.andNot(psiElement().withParent(psiElement(Component)))
|
||||
}
|
||||
|
||||
class MyInsertHandler : InsertHandler<LookupElement> {
|
||||
override fun handleInsert(context: InsertionContext, item: LookupElement) {
|
||||
val manager = TemplateManager.getInstance(context.project)
|
||||
val template = manager.createTemplate("", "", " \$Name$ { \n }")
|
||||
template.isToReformat = true
|
||||
template.addVariable("Name", ConstantNode(""), true)
|
||||
manager.startTemplate(context.editor, template, object : TemplateEditingAdapter() {
|
||||
override fun templateFinished(template: Template, brokenOff: Boolean) {
|
||||
context.editor.caretModel.moveToOffset(context.tailOffset - 2);
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,10 +50,13 @@ object SlintComponentElementType :
|
||||
|
||||
override fun createStub(tree: LighterAST, node: LighterASTNode, parentStub: StubElement<*>): SlintComponentStub {
|
||||
val exported = tree.getChildren(node).any { it.tokenType == ExportKeyword }
|
||||
val identifier = tree.getChildren(node).first { it.tokenType == ComponentName }
|
||||
val token = tree.getChildren(identifier)[0] as LighterASTTokenNode
|
||||
val token = tree.getChildren(node).find { it.tokenType == ComponentName }
|
||||
?.let {
|
||||
val text = tree.getChildren(it)[0] as LighterASTTokenNode
|
||||
tree.charTable.intern(text.text)
|
||||
}
|
||||
|
||||
return SlintComponentStubImpl(parentStub, exported, tree.charTable.intern(token.text).toString())
|
||||
return SlintComponentStubImpl(parentStub, exported, token.toString())
|
||||
}
|
||||
|
||||
override fun indexStub(stub: SlintComponentStub, sink: IndexSink) {
|
||||
|
||||
Reference in New Issue
Block a user