添加stubIndex

This commit is contained in:
me
2024-05-24 00:37:16 +08:00
parent ebd3916edd
commit 20b3fb7d66
15 changed files with 129 additions and 40 deletions

View File

@@ -137,6 +137,7 @@ Component ::= ComponentKeyword ComponentName InheritDeclaration? ComponentBody {
"me.zhouxi.slint.lang.psi.SlintPsiNamedElement" "me.zhouxi.slint.lang.psi.SlintPsiNamedElement"
"com.intellij.psi.StubBasedPsiElement<me.zhouxi.slint.stubs.stub.SlintComponentStub>" "com.intellij.psi.StubBasedPsiElement<me.zhouxi.slint.stubs.stub.SlintComponentStub>"
] ]
elementTypeClass="me.zhouxi.slint.stubs.types.SlintComponentStubType"
stubClass="me.zhouxi.slint.stubs.stub.SlintComponentStub" stubClass="me.zhouxi.slint.stubs.stub.SlintComponentStub"
mixin="me.zhouxi.slint.lang.psi.impl.SlintStubBasedPsiNamedElementImpl<me.zhouxi.slint.stubs.stub.SlintComponentStub>" mixin="me.zhouxi.slint.lang.psi.impl.SlintStubBasedPsiNamedElementImpl<me.zhouxi.slint.stubs.stub.SlintComponentStub>"
} }
@@ -187,7 +188,7 @@ PropertyChanged ::= ChangedKeyword LocalVariable '=>' CodeBlock{
// 回调定义 pure callback abc()->int; callback abc; callback(..);callback()->type; // 回调定义 pure callback abc()->int; callback abc; callback(..);callback()->type;
CallbackDeclaration ::= PureKeyword? CallbackKeyword FunctionName CallbackBinding? ';'{ CallbackDeclaration ::= PureKeyword? CallbackKeyword FunctionName CallbackBinding? ';'{
pin=2 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" mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl"
} }
//回调参数定义 //回调参数定义

View File

@@ -10,14 +10,14 @@ import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFile;
import com.intellij.psi.tree.IFileElementType; 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 com.intellij.psi.tree.TokenSet;
import me.zhouxi.slint.lang.lexer.SlintLexer; import me.zhouxi.slint.lang.lexer.SlintLexer;
import me.zhouxi.slint.lang.parser.SlintParser; import me.zhouxi.slint.lang.parser.SlintParser;
import me.zhouxi.slint.lang.psi.SlintFile; import me.zhouxi.slint.lang.psi.SlintFile;
import me.zhouxi.slint.lang.psi.SlintTypes; import me.zhouxi.slint.lang.psi.SlintTypes;
import me.zhouxi.slint.stubs.impl.SlintFileStub; import me.zhouxi.slint.stubs.types.SlintComponentStubType;
import org.jetbrains.annotations.NonNls; import me.zhouxi.slint.stubs.types.SlintFileElementType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import static me.zhouxi.slint.lang.psi.SlintTypes.*; import static me.zhouxi.slint.lang.psi.SlintTypes.*;
@@ -38,15 +38,9 @@ public class SlintParserDefinition implements ParserDefinition {
@Override @Override
public @NotNull IFileElementType getFileNodeType() { public @NotNull IFileElementType getFileNodeType() {
return FileType; return SlintFileElementType.INSTANCE;
} }
public static final ILightStubFileElementType<SlintFileStub> FileType = new ILightStubFileElementType<>("SlintFile", SlintLanguage.INSTANCE) {
@Override
public @NonNls @NotNull String getExternalId() {
return "slint.FILE";
}
};
@Override @Override
public @NotNull TokenSet getCommentTokens() { public @NotNull TokenSet getCommentTokens() {
@@ -60,6 +54,9 @@ public class SlintParserDefinition implements ParserDefinition {
@Override @Override
public @NotNull PsiElement createElement(ASTNode node) { public @NotNull PsiElement createElement(ASTNode node) {
if (node.getElementType() instanceof SlintComponentStubType) {
return ((SlintComponentStubType) node.getElementType()).createPsi(node);
}
return SlintTypes.Factory.createElement(node); return SlintTypes.Factory.createElement(node);
} }

View File

@@ -1,23 +1,29 @@
package me.zhouxi.slint.lang.psi; package me.zhouxi.slint.lang.psi;
import com.intellij.extapi.psi.PsiFileBase;
import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.FileType;
import com.intellij.psi.FileViewProvider; import com.intellij.psi.FileViewProvider;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile; 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; import org.jetbrains.annotations.NotNull;
/** /**
* @author zhouxi 2024/4/30 * @author zhouxi 2024/4/30
*/ */
public class SlintFile extends PsiFileBase implements PsiFile { public class SlintFile extends PsiFileImpl implements PsiFile {
public SlintFile(@NotNull FileViewProvider viewProvider) { public SlintFile(@NotNull FileViewProvider viewProvider) {
super(viewProvider, SlintLanguage.INSTANCE); super(SlintFileElementType.INSTANCE, SlintFileElementType.INSTANCE, viewProvider);
} }
@Override @Override
public @NotNull FileType getFileType() { public @NotNull FileType getFileType() {
return SlintFileType.INSTANCE; return SlintFileType.INSTANCE;
} }
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
visitor.visitFile(this);
}
} }

View File

@@ -2,6 +2,7 @@ package me.zhouxi.slint.lang.psi.impl;
import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.intellij.extapi.psi.ASTWrapperPsiElement;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.text.StringUtil;
import me.zhouxi.slint.lang.psi.SlintPsiElement; import me.zhouxi.slint.lang.psi.SlintPsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,4 +11,11 @@ public abstract class SlintPsiElementImpl extends ASTWrapperPsiElement implement
public SlintPsiElementImpl(@NotNull ASTNode node) { public SlintPsiElementImpl(@NotNull ASTNode node) {
super(node); super(node);
} }
@Override
public String toString() {
final String className = getClass().getSimpleName();
return StringUtil.trimEnd(className, "Impl") + "(" + getNode().getElementType() + ")";
}
} }

View File

@@ -3,16 +3,15 @@ package me.zhouxi.slint.lang.psi.impl
import com.intellij.extapi.psi.StubBasedPsiElementBase import com.intellij.extapi.psi.StubBasedPsiElementBase
import com.intellij.lang.ASTNode import com.intellij.lang.ASTNode
import com.intellij.openapi.util.NlsSafe import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.stubs.IStubElementType import com.intellij.psi.stubs.IStubElementType
import com.intellij.psi.stubs.StubElement import com.intellij.psi.stubs.StubElement
import com.intellij.psi.tree.IElementType
import com.intellij.util.IncorrectOperationException import com.intellij.util.IncorrectOperationException
import me.zhouxi.slint.lang.createIdentifier import me.zhouxi.slint.lang.createIdentifier
import me.zhouxi.slint.lang.psi.SlintNamed import me.zhouxi.slint.lang.psi.SlintNamed
import me.zhouxi.slint.lang.psi.SlintPsiElement import me.zhouxi.slint.lang.psi.SlintPsiElement
import me.zhouxi.slint.lang.psi.SlintPsiNamedElement import me.zhouxi.slint.lang.psi.SlintPsiNamedElement
import me.zhouxi.slint.stubs.SlintPsiStub
/** /**
* @author zhouxi 2024/5/23 * @author zhouxi 2024/5/23
@@ -46,4 +45,8 @@ abstract class SlintStubBasedPsiNamedElementImpl<T : StubElement<out PsiElement>
element.replace(createIdentifier(project, name)) element.replace(createIdentifier(project, name))
return this return this
} }
override fun toString(): String {
return StringUtil.trimEnd(this::class.java.simpleName, "Impl") + "(" + elementType + ")"
}
} }

View File

@@ -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.SlintTypes
import me.zhouxi.slint.lang.psi.utils.exportedElements import me.zhouxi.slint.lang.psi.utils.exportedElements
import me.zhouxi.slint.lang.psi.utils.inheritDeclaredElements import me.zhouxi.slint.lang.psi.utils.inheritDeclaredElements
import me.zhouxi.slint.stubs.types.SlintFileElementType
class SlintCompletionContributor : CompletionContributor() { class SlintCompletionContributor : CompletionContributor() {
init { init {
//文件级别 //文件级别
extend( extend(
CompletionType.BASIC, CompletionType.BASIC,
PlatformPatterns.psiElement().withAncestor(4, PlatformPatterns.psiElement(SlintParserDefinition.FileType)), PlatformPatterns.psiElement().withAncestor(4, PlatformPatterns.psiElement(SlintFileElementType)),
object : CompletionProvider<CompletionParameters>() { object : CompletionProvider<CompletionParameters>() {
override fun addCompletions( override fun addCompletions(
parameters: CompletionParameters, parameters: CompletionParameters,

View File

@@ -1,10 +1,15 @@
package me.zhouxi.slint.stubs 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 import me.zhouxi.slint.stubs.types.SlintComponentStubType
/** /**
* @author zhouxi 2024/5/23 * @author zhouxi 2024/5/23
*/ */
object SlintStubTypes { interface SlintStubTypes {
val ComponentType = SlintComponentStubType() companion object {
// val Component: IStubElementType<SlintComponentStub, SlintComponent> = SlintComponentStubType()
}
} }

View File

@@ -1,14 +1,12 @@
package me.zhouxi.slint.stubs; package me.zhouxi.slint.stubs
import com.intellij.psi.stubs.StubIndexKey; import com.intellij.psi.stubs.StubIndexKey
import me.zhouxi.slint.lang.psi.SlintComponentName; import me.zhouxi.slint.lang.psi.SlintComponent
import me.zhouxi.slint.lang.psi.SlintComponentName
/** /**
* @author zhouxi 2024/5/23 * @author zhouxi 2024/5/23
*/ */
public class StubKeys { object StubKeys {
val Component: StubIndexKey<String, SlintComponent> = StubIndexKey.createIndexKey("slint.component")
public static final StubIndexKey<String, SlintComponentName> COMPONENT = StubIndexKey.createIndexKey("slint.component");
} }

View File

@@ -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<SlintFile>(file)

View File

@@ -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<SlintFile>(file), SlintFileStub {
override fun getType(): IStubFileElementType<*> {
return SlintFileElementType
}
}

View File

@@ -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<SlintComponent>() {
override fun getKey(): StubIndexKey<String, SlintComponent> {
return StubKeys.Component
}
}

View File

@@ -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<SlintFile> {
}

View File

@@ -1,26 +1,38 @@
package me.zhouxi.slint.stubs.types 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.PsiElement
import com.intellij.psi.stubs.* import com.intellij.psi.stubs.*
import com.intellij.psi.util.parentOfType import com.intellij.psi.util.parentOfType
import me.zhouxi.slint.lang.SlintLanguage import me.zhouxi.slint.lang.SlintLanguage
import me.zhouxi.slint.lang.psi.SlintComponent import me.zhouxi.slint.lang.psi.SlintComponent
import me.zhouxi.slint.lang.psi.SlintExport 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.lang.psi.impl.SlintComponentImpl
import me.zhouxi.slint.stubs.StubKeys import me.zhouxi.slint.stubs.StubKeys
import me.zhouxi.slint.stubs.impl.SlintComponentStubImpl import me.zhouxi.slint.stubs.impl.SlintComponentStubImpl
import me.zhouxi.slint.stubs.stub.SlintComponentStub import me.zhouxi.slint.stubs.stub.SlintComponentStub
import org.mozilla.javascript.ast.AstNode
import java.io.IOException import java.io.IOException
/** /**
* @author zhouxi 2024/5/23 * @author zhouxi 2024/5/23
*/ */
class SlintComponentStubType : class SlintComponentStubType(debugName: String) :
IStubElementType<SlintComponentStub, SlintComponent>("SlintComponentStub", SlintLanguage.INSTANCE) { ILightStubElementType<SlintComponentStub, SlintComponent>(debugName, SlintLanguage.INSTANCE) {
override fun createPsi(stub: SlintComponentStub): SlintComponent { override fun createPsi(stub: SlintComponentStub): SlintComponent {
return SlintComponentImpl(stub, this) return SlintComponentImpl(stub, this)
} }
fun createPsi(node: ASTNode): SlintComponent {
return SlintComponentImpl(node)
}
override fun createStub(psi: SlintComponent, parentStub: StubElement<out PsiElement?>): SlintComponentStub { override fun createStub(psi: SlintComponent, parentStub: StubElement<out PsiElement?>): SlintComponentStub {
return SlintComponentStubImpl( return SlintComponentStubImpl(
parentStub, parentStub,
@@ -47,7 +59,23 @@ class SlintComponentStubType :
return SlintComponentStubImpl(parentStub, this, exported, identifier!!) 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) { override fun indexStub(stub: SlintComponentStub, sink: IndexSink) {
sink.occurrence(StubKeys.COMPONENT, stub.identifier) sink.occurrence(StubKeys.Component, stub.identifier)
} }
} }

View File

@@ -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<SlintFileStubImpl?>("SlintFile", SlintLanguage.INSTANCE) {
override fun getStubVersion(): Int {
return 1
}
}

View File

@@ -49,6 +49,8 @@
<stubElementTypeHolder class="me.zhouxi.slint.stubs.SlintStubTypes" externalIdPrefix="slint."/> <stubElementTypeHolder class="me.zhouxi.slint.stubs.SlintStubTypes" externalIdPrefix="slint."/>
<stubIndex implementation="me.zhouxi.slint.stubs.index.ComponentNameIndex"/>
</extensions> </extensions>
<actions> <actions>
<action id="slint.preview" class="me.zhouxi.slint.preview.PreviewAction" <action id="slint.preview" class="me.zhouxi.slint.preview.PreviewAction"