From 20b3fb7d66f7a6161f843a4ad7b6dc823e238bc1 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 24 May 2024 00:37:16 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0stubIndex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/grammar/main.bnf | 3 +- .../slint/lang/SlintParserDefinition.java | 17 ++++------ .../me/zhouxi/slint/lang/psi/SlintFile.java | 14 +++++--- .../lang/psi/impl/SlintPsiElementImpl.java | 8 +++++ .../impl/SlintStubBasedPsiNamedElementImpl.kt | 7 ++-- .../completion/SlintCompletionContributor.kt | 3 +- .../me/zhouxi/slint/stubs/SlintStubTypes.kt | 9 +++-- .../kotlin/me/zhouxi/slint/stubs/StubKeys.kt | 14 ++++---- .../zhouxi/slint/stubs/impl/SlintFileStub.kt | 9 ----- .../slint/stubs/impl/SlintFileStubImpl.kt | 17 ++++++++++ .../slint/stubs/index/ComponentNameIndex.kt | 12 +++++++ .../slint/stubs/stub/SlintFileStub.java | 7 ++++ .../stubs/types/SlintComponentStubType.kt | 34 +++++++++++++++++-- .../slint/stubs/types/SlintFileElementType.kt | 13 +++++++ src/main/resources/META-INF/plugin.xml | 2 ++ 15 files changed, 129 insertions(+), 40 deletions(-) delete mode 100644 src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStub.kt create mode 100644 src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStubImpl.kt create mode 100644 src/main/kotlin/me/zhouxi/slint/stubs/index/ComponentNameIndex.kt create mode 100644 src/main/kotlin/me/zhouxi/slint/stubs/stub/SlintFileStub.java create mode 100644 src/main/kotlin/me/zhouxi/slint/stubs/types/SlintFileElementType.kt diff --git a/src/main/grammar/main.bnf b/src/main/grammar/main.bnf index 2270d38..a5c8ecf 100644 --- a/src/main/grammar/main.bnf +++ b/src/main/grammar/main.bnf @@ -137,6 +137,7 @@ Component ::= ComponentKeyword ComponentName InheritDeclaration? ComponentBody { "me.zhouxi.slint.lang.psi.SlintPsiNamedElement" "com.intellij.psi.StubBasedPsiElement" ] + elementTypeClass="me.zhouxi.slint.stubs.types.SlintComponentStubType" stubClass="me.zhouxi.slint.stubs.stub.SlintComponentStub" mixin="me.zhouxi.slint.lang.psi.impl.SlintStubBasedPsiNamedElementImpl" } @@ -187,7 +188,7 @@ PropertyChanged ::= ChangedKeyword LocalVariable '=>' CodeBlock{ // 回调定义 pure callback abc()->int; callback abc; callback(..);callback()->type; CallbackDeclaration ::= PureKeyword? CallbackKeyword FunctionName CallbackBinding? ';'{ pin=2 - implements=["me.zhouxi.slint.lang.psi.SlintPsiNamedElement""me.zhouxi.slint.stubs.SlintPsiStubElement<>"] + implements=["me.zhouxi.slint.lang.psi.SlintPsiNamedElement"] mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl" } //回调参数定义 diff --git a/src/main/java/me/zhouxi/slint/lang/SlintParserDefinition.java b/src/main/java/me/zhouxi/slint/lang/SlintParserDefinition.java index bf0b8cf..93022b9 100644 --- a/src/main/java/me/zhouxi/slint/lang/SlintParserDefinition.java +++ b/src/main/java/me/zhouxi/slint/lang/SlintParserDefinition.java @@ -10,14 +10,14 @@ import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IFileElementType; -import com.intellij.psi.tree.ILightStubFileElementType; +import com.intellij.psi.tree.IStubFileElementType; import com.intellij.psi.tree.TokenSet; import me.zhouxi.slint.lang.lexer.SlintLexer; import me.zhouxi.slint.lang.parser.SlintParser; import me.zhouxi.slint.lang.psi.SlintFile; import me.zhouxi.slint.lang.psi.SlintTypes; -import me.zhouxi.slint.stubs.impl.SlintFileStub; -import org.jetbrains.annotations.NonNls; +import me.zhouxi.slint.stubs.types.SlintComponentStubType; +import me.zhouxi.slint.stubs.types.SlintFileElementType; import org.jetbrains.annotations.NotNull; import static me.zhouxi.slint.lang.psi.SlintTypes.*; @@ -38,15 +38,9 @@ public class SlintParserDefinition implements ParserDefinition { @Override public @NotNull IFileElementType getFileNodeType() { - return FileType; + return SlintFileElementType.INSTANCE; } - public static final ILightStubFileElementType FileType = new ILightStubFileElementType<>("SlintFile", SlintLanguage.INSTANCE) { - @Override - public @NonNls @NotNull String getExternalId() { - return "slint.FILE"; - } - }; @Override public @NotNull TokenSet getCommentTokens() { @@ -60,6 +54,9 @@ public class SlintParserDefinition implements ParserDefinition { @Override public @NotNull PsiElement createElement(ASTNode node) { + if (node.getElementType() instanceof SlintComponentStubType) { + return ((SlintComponentStubType) node.getElementType()).createPsi(node); + } return SlintTypes.Factory.createElement(node); } diff --git a/src/main/java/me/zhouxi/slint/lang/psi/SlintFile.java b/src/main/java/me/zhouxi/slint/lang/psi/SlintFile.java index 34b3446..31adfa2 100644 --- a/src/main/java/me/zhouxi/slint/lang/psi/SlintFile.java +++ b/src/main/java/me/zhouxi/slint/lang/psi/SlintFile.java @@ -1,23 +1,29 @@ package me.zhouxi.slint.lang.psi; -import com.intellij.extapi.psi.PsiFileBase; import com.intellij.openapi.fileTypes.FileType; import com.intellij.psi.FileViewProvider; +import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; -import me.zhouxi.slint.lang.SlintLanguage; +import com.intellij.psi.impl.source.PsiFileImpl; +import me.zhouxi.slint.stubs.types.SlintFileElementType; import org.jetbrains.annotations.NotNull; /** * @author zhouxi 2024/4/30 */ -public class SlintFile extends PsiFileBase implements PsiFile { +public class SlintFile extends PsiFileImpl implements PsiFile { public SlintFile(@NotNull FileViewProvider viewProvider) { - super(viewProvider, SlintLanguage.INSTANCE); + super(SlintFileElementType.INSTANCE, SlintFileElementType.INSTANCE, viewProvider); } @Override public @NotNull FileType getFileType() { return SlintFileType.INSTANCE; } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + visitor.visitFile(this); + } } diff --git a/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintPsiElementImpl.java b/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintPsiElementImpl.java index 27eec9a..92be27c 100644 --- a/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintPsiElementImpl.java +++ b/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintPsiElementImpl.java @@ -2,6 +2,7 @@ package me.zhouxi.slint.lang.psi.impl; import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.text.StringUtil; import me.zhouxi.slint.lang.psi.SlintPsiElement; import org.jetbrains.annotations.NotNull; @@ -10,4 +11,11 @@ public abstract class SlintPsiElementImpl extends ASTWrapperPsiElement implement public SlintPsiElementImpl(@NotNull ASTNode node) { super(node); } + + + @Override + public String toString() { + final String className = getClass().getSimpleName(); + return StringUtil.trimEnd(className, "Impl") + "(" + getNode().getElementType() + ")"; + } } diff --git a/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintStubBasedPsiNamedElementImpl.kt b/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintStubBasedPsiNamedElementImpl.kt index 5aaab20..287fe52 100644 --- a/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintStubBasedPsiNamedElementImpl.kt +++ b/src/main/java/me/zhouxi/slint/lang/psi/impl/SlintStubBasedPsiNamedElementImpl.kt @@ -3,16 +3,15 @@ package me.zhouxi.slint.lang.psi.impl import com.intellij.extapi.psi.StubBasedPsiElementBase import com.intellij.lang.ASTNode import com.intellij.openapi.util.NlsSafe +import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiElement import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.stubs.StubElement -import com.intellij.psi.tree.IElementType import com.intellij.util.IncorrectOperationException import me.zhouxi.slint.lang.createIdentifier import me.zhouxi.slint.lang.psi.SlintNamed import me.zhouxi.slint.lang.psi.SlintPsiElement import me.zhouxi.slint.lang.psi.SlintPsiNamedElement -import me.zhouxi.slint.stubs.SlintPsiStub /** * @author zhouxi 2024/5/23 @@ -46,4 +45,8 @@ abstract class SlintStubBasedPsiNamedElementImpl element.replace(createIdentifier(project, name)) return this } + + override fun toString(): String { + return StringUtil.trimEnd(this::class.java.simpleName, "Impl") + "(" + elementType + ")" + } } diff --git a/src/main/kotlin/me/zhouxi/slint/completion/SlintCompletionContributor.kt b/src/main/kotlin/me/zhouxi/slint/completion/SlintCompletionContributor.kt index 4062bca..0d32353 100644 --- a/src/main/kotlin/me/zhouxi/slint/completion/SlintCompletionContributor.kt +++ b/src/main/kotlin/me/zhouxi/slint/completion/SlintCompletionContributor.kt @@ -15,13 +15,14 @@ import me.zhouxi.slint.lang.psi.SlintPsiUtils.InternalTypes import me.zhouxi.slint.lang.psi.SlintTypes import me.zhouxi.slint.lang.psi.utils.exportedElements import me.zhouxi.slint.lang.psi.utils.inheritDeclaredElements +import me.zhouxi.slint.stubs.types.SlintFileElementType class SlintCompletionContributor : CompletionContributor() { init { //文件级别 extend( CompletionType.BASIC, - PlatformPatterns.psiElement().withAncestor(4, PlatformPatterns.psiElement(SlintParserDefinition.FileType)), + PlatformPatterns.psiElement().withAncestor(4, PlatformPatterns.psiElement(SlintFileElementType)), object : CompletionProvider() { override fun addCompletions( parameters: CompletionParameters, diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/SlintStubTypes.kt b/src/main/kotlin/me/zhouxi/slint/stubs/SlintStubTypes.kt index a9438ca..035c86e 100644 --- a/src/main/kotlin/me/zhouxi/slint/stubs/SlintStubTypes.kt +++ b/src/main/kotlin/me/zhouxi/slint/stubs/SlintStubTypes.kt @@ -1,10 +1,15 @@ package me.zhouxi.slint.stubs +import com.intellij.psi.stubs.IStubElementType +import me.zhouxi.slint.lang.psi.SlintComponent +import me.zhouxi.slint.stubs.stub.SlintComponentStub import me.zhouxi.slint.stubs.types.SlintComponentStubType /** * @author zhouxi 2024/5/23 */ -object SlintStubTypes { - val ComponentType = SlintComponentStubType() +interface SlintStubTypes { + companion object { +// val Component: IStubElementType = SlintComponentStubType() + } } diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/StubKeys.kt b/src/main/kotlin/me/zhouxi/slint/stubs/StubKeys.kt index b1052fa..ee6e272 100644 --- a/src/main/kotlin/me/zhouxi/slint/stubs/StubKeys.kt +++ b/src/main/kotlin/me/zhouxi/slint/stubs/StubKeys.kt @@ -1,14 +1,12 @@ -package me.zhouxi.slint.stubs; +package me.zhouxi.slint.stubs -import com.intellij.psi.stubs.StubIndexKey; -import me.zhouxi.slint.lang.psi.SlintComponentName; +import com.intellij.psi.stubs.StubIndexKey +import me.zhouxi.slint.lang.psi.SlintComponent +import me.zhouxi.slint.lang.psi.SlintComponentName /** * @author zhouxi 2024/5/23 */ -public class StubKeys { - - public static final StubIndexKey COMPONENT = StubIndexKey.createIndexKey("slint.component"); - - +object StubKeys { + val Component: StubIndexKey = StubIndexKey.createIndexKey("slint.component") } diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStub.kt b/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStub.kt deleted file mode 100644 index 4aa3a69..0000000 --- a/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStub.kt +++ /dev/null @@ -1,9 +0,0 @@ -package me.zhouxi.slint.stubs.impl - -import com.intellij.psi.stubs.PsiFileStubImpl -import me.zhouxi.slint.lang.psi.SlintFile - -/** - * @author zhouxi 2024/5/23 - */ -class SlintFileStub(file: SlintFile) : PsiFileStubImpl(file) diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStubImpl.kt b/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStubImpl.kt new file mode 100644 index 0000000..4eaccaf --- /dev/null +++ b/src/main/kotlin/me/zhouxi/slint/stubs/impl/SlintFileStubImpl.kt @@ -0,0 +1,17 @@ +package me.zhouxi.slint.stubs.impl + +import com.intellij.psi.stubs.PsiFileStubImpl +import com.intellij.psi.tree.IStubFileElementType +import me.zhouxi.slint.lang.psi.SlintFile +import me.zhouxi.slint.stubs.stub.SlintFileStub +import me.zhouxi.slint.stubs.types.SlintFileElementType + +/** + * @author zhouxi 2024/5/23 + */ +class SlintFileStubImpl(file: SlintFile) : PsiFileStubImpl(file), SlintFileStub { + + override fun getType(): IStubFileElementType<*> { + return SlintFileElementType + } +} diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/index/ComponentNameIndex.kt b/src/main/kotlin/me/zhouxi/slint/stubs/index/ComponentNameIndex.kt new file mode 100644 index 0000000..463d55c --- /dev/null +++ b/src/main/kotlin/me/zhouxi/slint/stubs/index/ComponentNameIndex.kt @@ -0,0 +1,12 @@ +package me.zhouxi.slint.stubs.index + +import com.intellij.psi.stubs.StringStubIndexExtension +import com.intellij.psi.stubs.StubIndexKey +import me.zhouxi.slint.lang.psi.SlintComponent +import me.zhouxi.slint.stubs.StubKeys + +class ComponentNameIndex : StringStubIndexExtension() { + override fun getKey(): StubIndexKey { + return StubKeys.Component + } +} diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/stub/SlintFileStub.java b/src/main/kotlin/me/zhouxi/slint/stubs/stub/SlintFileStub.java new file mode 100644 index 0000000..40d55e4 --- /dev/null +++ b/src/main/kotlin/me/zhouxi/slint/stubs/stub/SlintFileStub.java @@ -0,0 +1,7 @@ +package me.zhouxi.slint.stubs.stub; + +import com.intellij.psi.stubs.PsiFileStub; +import me.zhouxi.slint.lang.psi.SlintFile; + +public interface SlintFileStub extends PsiFileStub { +} diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintComponentStubType.kt b/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintComponentStubType.kt index ab78e4b..ea05abe 100644 --- a/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintComponentStubType.kt +++ b/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintComponentStubType.kt @@ -1,26 +1,38 @@ package me.zhouxi.slint.stubs.types +import com.intellij.lang.ASTNode +import com.intellij.lang.LighterAST +import com.intellij.lang.LighterASTNode +import com.intellij.lang.LighterASTTokenNode +import com.intellij.lang.TreeBackedLighterAST import com.intellij.psi.PsiElement import com.intellij.psi.stubs.* import com.intellij.psi.util.parentOfType import me.zhouxi.slint.lang.SlintLanguage import me.zhouxi.slint.lang.psi.SlintComponent import me.zhouxi.slint.lang.psi.SlintExport +import me.zhouxi.slint.lang.psi.SlintTypes.ComponentName +import me.zhouxi.slint.lang.psi.SlintTypes.Export import me.zhouxi.slint.lang.psi.impl.SlintComponentImpl import me.zhouxi.slint.stubs.StubKeys import me.zhouxi.slint.stubs.impl.SlintComponentStubImpl import me.zhouxi.slint.stubs.stub.SlintComponentStub +import org.mozilla.javascript.ast.AstNode import java.io.IOException /** * @author zhouxi 2024/5/23 */ -class SlintComponentStubType : - IStubElementType("SlintComponentStub", SlintLanguage.INSTANCE) { +class SlintComponentStubType(debugName: String) : + ILightStubElementType(debugName, SlintLanguage.INSTANCE) { override fun createPsi(stub: SlintComponentStub): SlintComponent { return SlintComponentImpl(stub, this) } + fun createPsi(node: ASTNode): SlintComponent { + return SlintComponentImpl(node) + } + override fun createStub(psi: SlintComponent, parentStub: StubElement): SlintComponentStub { return SlintComponentStubImpl( parentStub, @@ -47,7 +59,23 @@ class SlintComponentStubType : return SlintComponentStubImpl(parentStub, this, exported, identifier!!) } + override fun createStub(tree: LighterAST, node: LighterASTNode, parentStub: StubElement<*>): SlintComponentStub { + var exported = false + var parent = tree.getParent(node) + while (parent != null) { + if (parent.tokenType == Export) { + exported = true + break + } + parent = tree.getParent(parent) + } + val identifier = tree.getChildren(node).first { it.tokenType == ComponentName } + val token = tree.getChildren(identifier)[0] as LighterASTTokenNode + + return SlintComponentStubImpl(parentStub, this, exported, tree.charTable.intern(token.text).toString()) + } + override fun indexStub(stub: SlintComponentStub, sink: IndexSink) { - sink.occurrence(StubKeys.COMPONENT, stub.identifier) + sink.occurrence(StubKeys.Component, stub.identifier) } } diff --git a/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintFileElementType.kt b/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintFileElementType.kt new file mode 100644 index 0000000..254202f --- /dev/null +++ b/src/main/kotlin/me/zhouxi/slint/stubs/types/SlintFileElementType.kt @@ -0,0 +1,13 @@ +package me.zhouxi.slint.stubs.types + +import com.intellij.psi.tree.ILightStubFileElementType +import me.zhouxi.slint.lang.SlintLanguage +import me.zhouxi.slint.stubs.impl.SlintFileStubImpl + +object SlintFileElementType : ILightStubFileElementType("SlintFile", SlintLanguage.INSTANCE) { + + override fun getStubVersion(): Int { + return 1 + } + +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index af0577f..2dfe9cc 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -49,6 +49,8 @@ + +