initial commit

This commit is contained in:
me
2024-05-23 19:27:43 +08:00
parent 70275b14e9
commit b9a77b4453
14 changed files with 88 additions and 27 deletions

View File

@@ -2,7 +2,7 @@
generate=[token-case="as-is" element-case="as-is"] generate=[token-case="as-is" element-case="as-is"]
parserClass="me.zhouxi.slint.lang.parser.SlintParser" parserClass="me.zhouxi.slint.lang.parser.SlintParser"
implements="me.zhouxi.slint.lang.psi.SlintPsiElement" implements="me.zhouxi.slint.lang.psi.SlintPsiElement"
extends="me.zhouxi.slint.lang.psi.SlintPsiElementImpl" extends="me.zhouxi.slint.lang.psi.impl.SlintPsiElementImpl"
elementTypeHolderClass="me.zhouxi.slint.lang.psi.SlintTypes" elementTypeHolderClass="me.zhouxi.slint.lang.psi.SlintTypes"
elementTypeClass="me.zhouxi.slint.lang.SlintElementType" elementTypeClass="me.zhouxi.slint.lang.SlintElementType"
tokenTypeClass="me.zhouxi.slint.lang.SlintTokenType" tokenTypeClass="me.zhouxi.slint.lang.SlintTokenType"
@@ -133,8 +133,12 @@ ExportModule ::= '*' FromKeyword ModuleLocation ';'{
Component ::= ComponentKeyword ComponentName InheritDeclaration? ComponentBody { Component ::= ComponentKeyword ComponentName InheritDeclaration? ComponentBody {
pin=1 pin=1
implements=["me.zhouxi.slint.lang.psi.SlintPsiNamedElement"] implements=[
mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl" "me.zhouxi.slint.lang.psi.SlintPsiNamedElement"
"com.intellij.psi.StubBasedPsiElement<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>"
} }
//组件定义 //组件定义
//private LegacyComponent ::= (ComponentName|NamedIdentifier ':=' ) ComponentBody //private LegacyComponent ::= (ComponentName|NamedIdentifier ':=' ) ComponentBody
@@ -183,7 +187,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"] implements=["me.zhouxi.slint.lang.psi.SlintPsiNamedElement""me.zhouxi.slint.stubs.SlintPsiStubElement<>"]
mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl" mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl"
} }
//回调参数定义 //回调参数定义
@@ -502,7 +506,7 @@ Named ::= PropertyName | TypeName |ExternalName | InternalName|ComponentName|Fu
pin=1 pin=1
} }
{ {
extends("PropertyName|TypeName|ComponentName|FunctionName")=Named extends("PropertyName|TypeName|ComponentName|FunctionName|InternalName|ExternalName")=Named
} }
LocalVariable ::= GenericIdentifier{ LocalVariable ::= GenericIdentifier{
mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl" mixin="me.zhouxi.slint.lang.psi.impl.SlintPsiNamedElementMixinImpl"

View File

@@ -8,7 +8,7 @@ public final class SlintElementType extends IElementType {
public SlintElementType(@NonNls @NotNull String rawKind) { public SlintElementType(@NonNls @NotNull String rawKind) {
super(rawKind, Slint.INSTANCE); super(rawKind, SlintLanguage.INSTANCE);
} }

View File

@@ -9,13 +9,13 @@ import static com.intellij.openapi.util.IconLoader.getIcon;
/** /**
* @author zhouxi 2024/4/30 * @author zhouxi 2024/4/30
*/ */
public class Slint extends Language { public class SlintLanguage extends Language {
public static final Slint INSTANCE = new Slint(); public static final SlintLanguage INSTANCE = new SlintLanguage();
protected Slint() { protected SlintLanguage() {
super("Slint"); super("Slint");
} }
public static final Icon ICON = getIcon("META-INF/pluginIcon.svg", Slint.class); public static final Icon ICON = getIcon("META-INF/pluginIcon.svg", SlintLanguage.class);
} }

View File

@@ -10,11 +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.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 org.jetbrains.annotations.NonNls;
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,7 +41,12 @@ public class SlintParserDefinition implements ParserDefinition {
return FileType; return FileType;
} }
public static final IFileElementType FileType = new IFileElementType("SlintFile",Slint.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() {

View File

@@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull;
public class SlintTokenType extends IElementType { public class SlintTokenType extends IElementType {
public SlintTokenType(@NonNls @NotNull String kind) { public SlintTokenType(@NonNls @NotNull String kind) {
super(kind, Slint.INSTANCE); super(kind, SlintLanguage.INSTANCE);
} }
} }

View File

@@ -4,7 +4,7 @@ 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.PsiFile; import com.intellij.psi.PsiFile;
import me.zhouxi.slint.lang.Slint; import me.zhouxi.slint.lang.SlintLanguage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
public class SlintFile extends PsiFileBase implements PsiFile { public class SlintFile extends PsiFileBase implements PsiFile {
public SlintFile(@NotNull FileViewProvider viewProvider) { public SlintFile(@NotNull FileViewProvider viewProvider) {
super(viewProvider, Slint.INSTANCE); super(viewProvider, SlintLanguage.INSTANCE);
} }
@Override @Override

View File

@@ -3,7 +3,7 @@ package me.zhouxi.slint.lang.psi;
import com.intellij.openapi.fileTypes.LanguageFileType; import com.intellij.openapi.fileTypes.LanguageFileType;
import com.intellij.openapi.util.NlsContexts; import com.intellij.openapi.util.NlsContexts;
import com.intellij.openapi.util.NlsSafe; import com.intellij.openapi.util.NlsSafe;
import me.zhouxi.slint.lang.Slint; import me.zhouxi.slint.lang.SlintLanguage;
import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -17,7 +17,7 @@ public class SlintFileType extends LanguageFileType {
public static final SlintFileType INSTANCE = new SlintFileType(); public static final SlintFileType INSTANCE = new SlintFileType();
protected SlintFileType() { protected SlintFileType() {
super(Slint.INSTANCE); super(SlintLanguage.INSTANCE);
} }
@Override @Override
@@ -37,6 +37,6 @@ public class SlintFileType extends LanguageFileType {
@Override @Override
public Icon getIcon() { public Icon getIcon() {
return Slint.ICON; return SlintLanguage.ICON;
} }
} }

View File

@@ -1,10 +1,11 @@
package me.zhouxi.slint.lang.psi; 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 me.zhouxi.slint.lang.psi.SlintPsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class SlintPsiElementImpl extends ASTWrapperPsiElement implements SlintPsiElement { public abstract class SlintPsiElementImpl extends ASTWrapperPsiElement implements SlintPsiElement {
public SlintPsiElementImpl(@NotNull ASTNode node) { public SlintPsiElementImpl(@NotNull ASTNode node) {
super(node); super(node);

View File

@@ -3,7 +3,6 @@ package me.zhouxi.slint.lang.psi.impl;
import com.intellij.lang.ASTNode; import com.intellij.lang.ASTNode;
import com.intellij.psi.PsiReference; import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry;
import me.zhouxi.slint.lang.psi.SlintPsiElementImpl;
import me.zhouxi.slint.lang.psi.SlintPsiReferencedIdentifier; import me.zhouxi.slint.lang.psi.SlintPsiReferencedIdentifier;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;

View File

@@ -0,0 +1,49 @@
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.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
*/
abstract class SlintStubBasedPsiNamedElementImpl<T : StubElement<out PsiElement>> :
StubBasedPsiElementBase<T>, SlintPsiElement, SlintPsiNamedElement {
constructor(node: ASTNode) : super(node)
constructor(stub: T, nodeType: IStubElementType<*, *>) : super(stub, nodeType)
override fun getNameIdentifier(): PsiElement? {
return findChildByClass(SlintNamed::class.java)
}
override fun getName(): String? {
return nameIdentifier?.text ?: this.text
}
override fun canNavigate(): Boolean {
return true
}
override fun getTextOffset(): Int {
return nameIdentifier?.textOffset ?: super.getTextOffset()
}
@Throws(IncorrectOperationException::class)
override fun setName(name: @NlsSafe String): PsiElement {
val element = nameIdentifier ?: throw IncorrectOperationException()
element.replace(createIdentifier(project, name))
return this
}
}

View File

@@ -5,7 +5,7 @@ import com.intellij.psi.TokenType
import com.intellij.psi.impl.source.codeStyle.SemanticEditorPosition.SyntaxElement import com.intellij.psi.impl.source.codeStyle.SemanticEditorPosition.SyntaxElement
import com.intellij.psi.impl.source.codeStyle.lineIndent.JavaLikeLangLineIndentProvider import com.intellij.psi.impl.source.codeStyle.lineIndent.JavaLikeLangLineIndentProvider
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import me.zhouxi.slint.lang.Slint import me.zhouxi.slint.lang.SlintLanguage
import me.zhouxi.slint.lang.psi.SlintTypes import me.zhouxi.slint.lang.psi.SlintTypes
class SlintLineIndentProvider : JavaLikeLangLineIndentProvider() { class SlintLineIndentProvider : JavaLikeLangLineIndentProvider() {
@@ -16,7 +16,7 @@ class SlintLineIndentProvider : JavaLikeLangLineIndentProvider() {
override fun isSuitableForLanguage(language: Language): Boolean { override fun isSuitableForLanguage(language: Language): Boolean {
return language.isKindOf(Slint.INSTANCE) return language.isKindOf(SlintLanguage.INSTANCE)
} }
companion object { companion object {

View File

@@ -12,7 +12,7 @@ import me.zhouxi.slint.lang.psi.SlintFile
fun createIdentifier(project: Project?, text: String): PsiElement { fun createIdentifier(project: Project?, text: String): PsiElement {
val factory = PsiFileFactory.getInstance(project) val factory = PsiFileFactory.getInstance(project)
val file = factory.createFileFromText("dummy.slint", Slint.INSTANCE, "component $text{}") as SlintFile val file = factory.createFileFromText("dummy.slint", SlintLanguage.INSTANCE, "component $text{}") as SlintFile
return file.findChildByClass(SlintComponent::class.java)!!.componentName!!.identifier return file.findChildByClass(SlintComponent::class.java)!!.componentName!!.identifier
} }

View File

@@ -2,7 +2,7 @@ package me.zhouxi.slint.preview
import com.intellij.execution.configurations.ConfigurationTypeBase import com.intellij.execution.configurations.ConfigurationTypeBase
import com.intellij.openapi.util.NotNullLazyValue import com.intellij.openapi.util.NotNullLazyValue
import me.zhouxi.slint.lang.Slint import me.zhouxi.slint.lang.SlintLanguage
/** /**
* @author zhouxi 2024/5/16 * @author zhouxi 2024/5/16
@@ -11,7 +11,7 @@ object PreviewConfigurationType : ConfigurationTypeBase(
"SlintViewerConfiguration", "SlintViewerConfiguration",
"Slint viewer", "Slint viewer",
"Slint component preview", "Slint component preview",
NotNullLazyValue.createValue { Slint.ICON } NotNullLazyValue.createValue { SlintLanguage.ICON }
) { ) {
init { init {
addFactory(PreviewConfigurationFactory(this)) addFactory(PreviewConfigurationFactory(this))

View File

@@ -3,7 +3,7 @@ package me.zhouxi.slint.preview
import com.intellij.execution.lineMarker.ExecutorAction import com.intellij.execution.lineMarker.ExecutorAction
import com.intellij.execution.lineMarker.RunLineMarkerContributor import com.intellij.execution.lineMarker.RunLineMarkerContributor
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import me.zhouxi.slint.lang.Slint import me.zhouxi.slint.lang.SlintLanguage
import me.zhouxi.slint.lang.psi.SlintComponentName import me.zhouxi.slint.lang.psi.SlintComponentName
/** /**
@@ -13,7 +13,7 @@ class PreviewRunLineMarkerContributor : RunLineMarkerContributor() {
override fun getInfo(element: PsiElement): Info? { override fun getInfo(element: PsiElement): Info? {
if (element.parent is SlintComponentName) { if (element.parent is SlintComponentName) {
return Info( return Info(
Slint.ICON, null, SlintLanguage.ICON, null,
*ExecutorAction.getActions(1) *ExecutorAction.getActions(1)
) )
} }