diff --git a/ast/src/main/ast/pork.yml b/ast/src/main/ast/pork.yml index 74c6bcc..1e31aa9 100644 --- a/ast/src/main/ast/pork.yml +++ b/ast/src/main/ast/pork.yml @@ -130,6 +130,8 @@ types: type: Boolean FunctionCall: parent: Expression + referencedElementValue: symbol + referencedElementType: FunctionDefinition values: - name: symbol type: Symbol @@ -256,7 +258,8 @@ types: type: String SymbolReference: parent: Expression - namedElementValue: symbol + referencedElementValue: symbol + referencedElementType: Node values: - name: symbol type: Symbol diff --git a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstPorkIdeaCodegen.kt b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstPorkIdeaCodegen.kt index 55976df..1ddb2de 100644 --- a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstPorkIdeaCodegen.kt +++ b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstPorkIdeaCodegen.kt @@ -76,15 +76,14 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) : if (baseType == "PorkNamedElement") { kotlinClass.imports.add(0, "com.intellij.psi.PsiElement") - kotlinClass.imports.add("gay.pizza.pork.ast.NodeType") - kotlinClass.imports.add("gay.pizza.pork.idea.PorkElementTypes") + kotlinClass.imports.add("gay.pizza.pork.idea.psi.PorkElementHelpers") val getNameFunction = KotlinFunction( "getName", overridden = true, returnType = "String?", isImmediateExpression = true ) - getNameFunction.body.add("node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.${type.name}))?.text") + getNameFunction.body.add("PorkElementHelpers.nameOfNamedElement(this)") kotlinClass.functions.add(getNameFunction) val setNameFunction = KotlinFunction( @@ -96,8 +95,32 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) : KotlinParameter("name", "String") ) ) - setNameFunction.body.add("this") + setNameFunction.body.add("PorkElementHelpers.setNameOfNamedElement(this, name)") kotlinClass.functions.add(setNameFunction) + + val getNameIdentifierFunction = KotlinFunction( + "getNameIdentifier", + overridden = true, + returnType = "PsiElement?", + isImmediateExpression = true + ) + getNameIdentifierFunction.body.add("PorkElementHelpers.nameIdentifierOfNamedElement(this)") + kotlinClass.functions.add(getNameIdentifierFunction) + } + + if (type.referencedElementValue != null && type.referencedElementType != null) { + kotlinClass.imports.add(0, "com.intellij.psi.PsiReference") + kotlinClass.imports.add("gay.pizza.pork.ast.NodeType") + kotlinClass.imports.add("gay.pizza.pork.idea.psi.PorkElementHelpers") + + val getReferenceFunction = KotlinFunction( + "getReference", + overridden = true, + returnType = "PsiReference?", + isImmediateExpression = true + ) + getReferenceFunction.body.add("PorkElementHelpers.referenceOfElement(this, NodeType.${type.referencedElementType})") + kotlinClass.functions.add(getReferenceFunction) } write("${type.name}Element.kt", KotlinWriter(kotlinClass)) @@ -153,10 +176,12 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) : ), inherits = mutableListOf( "PorkElement(node)", - "PsiNamedElement" + "PsiNamedElement", + "PsiNameIdentifierOwner" ), imports = mutableListOf( "com.intellij.lang.ASTNode", + "com.intellij.psi.PsiNameIdentifierOwner", "com.intellij.psi.PsiNamedElement" ) ) diff --git a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstType.kt b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstType.kt index 7ea5116..a14a86b 100644 --- a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstType.kt +++ b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstType.kt @@ -1,6 +1,11 @@ package gay.pizza.pork.buildext.ast -class AstType(val name: String, var parent: AstType? = null, var namedElementValue: String? = null) { +class AstType( + val name: String, var parent: AstType? = null, + var namedElementValue: String? = null, + var referencedElementValue: String? = null, + var referencedElementType: String? = null +) { private var internalValues: MutableList? = null private val internalEnums = mutableListOf() diff --git a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstTypeDescription.kt b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstTypeDescription.kt index 4ec1545..20cd5d0 100644 --- a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstTypeDescription.kt +++ b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstTypeDescription.kt @@ -7,5 +7,7 @@ data class AstTypeDescription( val parent: String? = null, val values: List? = null, val enums: List = emptyList(), - val namedElementValue: String? = null + val namedElementValue: String? = null, + val referencedElementValue: String? = null, + val referencedElementType: String? = null ) diff --git a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstWorld.kt b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstWorld.kt index c4ce2f9..3fb885a 100644 --- a/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstWorld.kt +++ b/buildext/src/main/kotlin/gay/pizza/pork/buildext/ast/AstWorld.kt @@ -57,6 +57,14 @@ class AstWorld { type.namedElementValue = typeDescription.namedElementValue } + if (typeDescription.referencedElementValue != null) { + type.referencedElementValue = typeDescription.referencedElementValue + } + + if (typeDescription.referencedElementType != null) { + type.referencedElementType = typeDescription.referencedElementType + } + if (typeDescription.values != null) { type.markHasValues() for (value in typeDescription.values) { diff --git a/parser/src/main/kotlin/gay/pizza/pork/parser/TokenType.kt b/parser/src/main/kotlin/gay/pizza/pork/parser/TokenType.kt index 73793b5..e21d0ea 100644 --- a/parser/src/main/kotlin/gay/pizza/pork/parser/TokenType.kt +++ b/parser/src/main/kotlin/gay/pizza/pork/parser/TokenType.kt @@ -39,9 +39,9 @@ enum class TokenType(vararg properties: TokenTypeProperty) { RightBracket(SingleChar(']')), LeftParentheses(SingleChar('(')), RightParentheses(SingleChar(')')), - Not(ManyChars("not"), OperatorFamily), - Mod(ManyChars("mod"), OperatorFamily), - Rem(ManyChars("rem"), OperatorFamily), + Not(ManyChars("not"), KeywordFamily), + Mod(ManyChars("mod"), KeywordFamily), + Rem(ManyChars("rem"), KeywordFamily), Comma(SingleChar(',')), DotDotDot(ManyChars("...")), DotDot(ManyChars(".."), Promotion('.', DotDotDot)), diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkBraceMatcher.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkBraceMatcher.kt new file mode 100644 index 0000000..bc5ee42 --- /dev/null +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkBraceMatcher.kt @@ -0,0 +1,35 @@ +package gay.pizza.pork.idea + +import com.intellij.lang.BracePair +import com.intellij.lang.PairedBraceMatcher +import com.intellij.psi.PsiFile +import com.intellij.psi.tree.IElementType +import gay.pizza.pork.parser.TokenType + +class PorkBraceMatcher : PairedBraceMatcher { + override fun getPairs(): Array = arrayOf( + BracePair( + PorkElementTypes.elementTypeFor(TokenType.LeftCurly), + PorkElementTypes.elementTypeFor(TokenType.RightCurly), + true + ), + BracePair( + PorkElementTypes.elementTypeFor(TokenType.LeftParentheses), + PorkElementTypes.elementTypeFor(TokenType.RightParentheses), + false + ), + BracePair( + PorkElementTypes.elementTypeFor(TokenType.LeftBracket), + PorkElementTypes.elementTypeFor(TokenType.RightBracket), + false + ) + ) + + override fun isPairedBracesAllowedBeforeType(lbraceType: IElementType, contextType: IElementType?): Boolean { + return true + } + + override fun getCodeConstructStart(file: PsiFile?, openingBraceOffset: Int): Int { + return openingBraceOffset + } +} diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLanguage.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLanguage.kt index 769133d..93515cf 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLanguage.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLanguage.kt @@ -2,4 +2,5 @@ package gay.pizza.pork.idea import com.intellij.lang.Language +@Suppress("JavaIoSerializableObjectMustHaveReadResolve") object PorkLanguage : Language("Pork") diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLexer.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLexer.kt index 1223691..5da10a0 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLexer.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkLexer.kt @@ -61,10 +61,12 @@ class PorkLexer : LexerBase() { internalTokenEnd = currentToken.sourceIndex.index + currentToken.text.length } catch (e: ProcessCanceledException) { throw e - } catch (e: Throwable) { + } catch (e: BadCharacterError) { + currentTokenType = PsiTokenType.BAD_CHARACTER + internalTokenEnd = bufferEnd + } catch (e: UnterminatedTokenError) { currentTokenType = PsiTokenType.BAD_CHARACTER internalTokenEnd = bufferEnd - log.warn(Tokenizer::class.java.name, e) } } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkParser.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkParser.kt index f6f6129..c04ab2e 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkParser.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/PorkParser.kt @@ -3,17 +3,20 @@ package gay.pizza.pork.idea import com.intellij.lang.ASTNode import com.intellij.lang.PsiBuilder import com.intellij.lang.PsiParser +import com.intellij.psi.impl.PsiElementBase import com.intellij.psi.tree.IElementType import gay.pizza.pork.parser.Parser class PorkParser : PsiParser { override fun parse(root: IElementType, builder: PsiBuilder): ASTNode { + val marker = builder.mark() val psiBuilderMarkAttribution = PsiBuilderMarkAttribution(builder) val source = PsiBuilderTokenSource(builder) val parser = Parser(source, psiBuilderMarkAttribution) try { parser.parseCompilationUnit() } catch (_: ExitParser) {} + marker.done(root) return builder.treeBuilt } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkElementHelpers.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkElementHelpers.kt index fc872ac..94369f0 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkElementHelpers.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkElementHelpers.kt @@ -1,11 +1,34 @@ package gay.pizza.pork.idea.psi -import gay.pizza.pork.ast.Node -import gay.pizza.pork.idea.PorkNodeKey +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference +import com.intellij.psi.util.childrenOfType +import gay.pizza.pork.ast.NodeType +import gay.pizza.pork.idea.PorkElementTypes import gay.pizza.pork.idea.psi.gen.PorkElement +import gay.pizza.pork.idea.psi.gen.PorkNamedElement +import gay.pizza.pork.idea.psi.gen.SymbolElement -val PorkElement.porkNode: Node? - get() = node.getUserData(PorkNodeKey) +object PorkElementHelpers { + private val symbolElementType = PorkElementTypes.elementTypeFor(NodeType.Symbol) -val PorkElement.porkNodeChecked: Node - get() = porkNode!! + fun nameOfNamedElement(element: PorkNamedElement): String? { + val child = element.node.findChildByType(symbolElementType) + return child?.text + } + + fun setNameOfNamedElement(element: PorkNamedElement, name: String): PsiElement = element + + fun nameIdentifierOfNamedElement(element: PorkNamedElement): PsiElement? { + val child = element.node.findChildByType(symbolElementType) + return child?.psi + } + + fun referenceOfElement(element: PorkElement, type: NodeType): PsiReference? { + val textRangeOfSymbolInElement = element.childrenOfType().firstOrNull()?.textRangeInParent ?: return null + if (type == NodeType.FunctionDefinition) { + return PorkFunctionReference(element, textRangeOfSymbolInElement) + } + return null + } +} diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkFunctionReference.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkFunctionReference.kt new file mode 100644 index 0000000..4fb1f6e --- /dev/null +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkFunctionReference.kt @@ -0,0 +1,22 @@ +package gay.pizza.pork.idea.psi + +import com.intellij.openapi.util.TextRange +import com.intellij.psi.util.PsiTreeUtil +import gay.pizza.pork.idea.psi.gen.FunctionDefinitionElement +import gay.pizza.pork.idea.psi.gen.PorkElement + +class PorkFunctionReference(element: PorkElement, textRange: TextRange) : PorkReference(element, textRange) { + override fun resolve(): PorkElement? { + val functionName = canonicalText + for (file in getRelevantFiles()) { + val thisFileFunctionDefinitions = PsiTreeUtil.collectElementsOfType(file, FunctionDefinitionElement::class.java) + val thisFileFoundFunctionDefinition = thisFileFunctionDefinitions.firstOrNull { + it.name == functionName + } + if (thisFileFoundFunctionDefinition != null) { + return thisFileFoundFunctionDefinition + } + } + return null + } +} diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkReference.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkReference.kt new file mode 100644 index 0000000..cc0bd89 --- /dev/null +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/PorkReference.kt @@ -0,0 +1,34 @@ +package gay.pizza.pork.idea.psi + +import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.PsiManager +import com.intellij.psi.PsiReferenceBase +import com.intellij.psi.util.PsiTreeUtil +import com.intellij.psi.util.childrenOfType +import gay.pizza.pork.idea.psi.gen.ImportDeclarationElement +import gay.pizza.pork.idea.psi.gen.PorkElement +import gay.pizza.pork.idea.psi.gen.SymbolElement + +abstract class PorkReference(element: PorkElement, textRange: TextRange) : PsiReferenceBase(element, textRange) { + fun getRelevantFiles(): List { + val containingFile = element.containingFile + val importDeclarationElements = PsiTreeUtil.collectElementsOfType(containingFile, ImportDeclarationElement::class.java) + val files = mutableListOf(containingFile) + for (importDeclaration in importDeclarationElements) { + val symbolElements = importDeclaration.childrenOfType() + val importType = importDeclaration.childrenOfType().first().text + if (importType != "local") { + continue + } + + val basicImportPath = symbolElements.drop(1).joinToString("/") { it.text.trim() } + val actualImportPath = "../${basicImportPath}.pork" + val virtualFile = containingFile.virtualFile.findFileByRelativePath(actualImportPath) ?: continue + val psiFile = PsiManager.getInstance(element.project).findFile(virtualFile) ?: continue + files.add(psiFile) + } + return files + } +} diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionCallElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionCallElement.kt index da18560..ef3230c 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionCallElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionCallElement.kt @@ -1,6 +1,12 @@ // GENERATED CODE FROM PORK AST CODEGEN package gay.pizza.pork.idea.psi.gen +import com.intellij.psi.PsiReference import com.intellij.lang.ASTNode +import gay.pizza.pork.ast.NodeType +import gay.pizza.pork.idea.psi.PorkElementHelpers -class FunctionCallElement(node: ASTNode) : PorkElement(node) +class FunctionCallElement(node: ASTNode) : PorkElement(node) { + override fun getReference(): PsiReference? = + PorkElementHelpers.referenceOfElement(this, NodeType.FunctionDefinition) +} diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionDefinitionElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionDefinitionElement.kt index 61900e2..4c2cbef 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionDefinitionElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/FunctionDefinitionElement.kt @@ -3,13 +3,15 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.psi.PsiElement import com.intellij.lang.ASTNode -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers class FunctionDefinitionElement(node: ASTNode) : PorkNamedElement(node) { override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.FunctionDefinition))?.text + PorkElementHelpers.nameOfNamedElement(this) override fun setName(name: String): PsiElement = - this + PorkElementHelpers.setNameOfNamedElement(this, name) + + override fun getNameIdentifier(): PsiElement? = + PorkElementHelpers.nameIdentifierOfNamedElement(this) } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetAssignmentElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetAssignmentElement.kt index 22a8652..9133d42 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetAssignmentElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetAssignmentElement.kt @@ -3,13 +3,15 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.psi.PsiElement import com.intellij.lang.ASTNode -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers class LetAssignmentElement(node: ASTNode) : PorkNamedElement(node) { override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.LetAssignment))?.text + PorkElementHelpers.nameOfNamedElement(this) override fun setName(name: String): PsiElement = - this + PorkElementHelpers.setNameOfNamedElement(this, name) + + override fun getNameIdentifier(): PsiElement? = + PorkElementHelpers.nameIdentifierOfNamedElement(this) } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetDefinitionElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetDefinitionElement.kt index 9961d86..1a124f8 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetDefinitionElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/LetDefinitionElement.kt @@ -3,13 +3,15 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.psi.PsiElement import com.intellij.lang.ASTNode -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers class LetDefinitionElement(node: ASTNode) : PorkNamedElement(node) { override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.LetDefinition))?.text + PorkElementHelpers.nameOfNamedElement(this) override fun setName(name: String): PsiElement = - this + PorkElementHelpers.setNameOfNamedElement(this, name) + + override fun getNameIdentifier(): PsiElement? = + PorkElementHelpers.nameIdentifierOfNamedElement(this) } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/PorkNamedElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/PorkNamedElement.kt index 30dc6c8..3e90442 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/PorkNamedElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/PorkNamedElement.kt @@ -2,6 +2,7 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.lang.ASTNode +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.psi.PsiNamedElement -abstract class PorkNamedElement(node: ASTNode) : PorkElement(node), PsiNamedElement +abstract class PorkNamedElement(node: ASTNode) : PorkElement(node), PsiNamedElement, PsiNameIdentifierOwner diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SetAssignmentElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SetAssignmentElement.kt index 5f7dbf4..2b875e5 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SetAssignmentElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SetAssignmentElement.kt @@ -3,13 +3,15 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.psi.PsiElement import com.intellij.lang.ASTNode -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers class SetAssignmentElement(node: ASTNode) : PorkNamedElement(node) { override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.SetAssignment))?.text + PorkElementHelpers.nameOfNamedElement(this) override fun setName(name: String): PsiElement = - this + PorkElementHelpers.setNameOfNamedElement(this, name) + + override fun getNameIdentifier(): PsiElement? = + PorkElementHelpers.nameIdentifierOfNamedElement(this) } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SymbolReferenceElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SymbolReferenceElement.kt index 7e9f148..936be11 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SymbolReferenceElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/SymbolReferenceElement.kt @@ -1,15 +1,12 @@ // GENERATED CODE FROM PORK AST CODEGEN package gay.pizza.pork.idea.psi.gen -import com.intellij.psi.PsiElement +import com.intellij.psi.PsiReference import com.intellij.lang.ASTNode import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers -class SymbolReferenceElement(node: ASTNode) : PorkNamedElement(node) { - override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.SymbolReference))?.text - - override fun setName(name: String): PsiElement = - this +class SymbolReferenceElement(node: ASTNode) : PorkElement(node) { + override fun getReference(): PsiReference? = + PorkElementHelpers.referenceOfElement(this, NodeType.Node) } diff --git a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/VarAssignmentElement.kt b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/VarAssignmentElement.kt index be381d0..c1f584f 100644 --- a/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/VarAssignmentElement.kt +++ b/support/pork-idea/src/main/kotlin/gay/pizza/pork/idea/psi/gen/VarAssignmentElement.kt @@ -3,13 +3,15 @@ package gay.pizza.pork.idea.psi.gen import com.intellij.psi.PsiElement import com.intellij.lang.ASTNode -import gay.pizza.pork.ast.NodeType -import gay.pizza.pork.idea.PorkElementTypes +import gay.pizza.pork.idea.psi.PorkElementHelpers class VarAssignmentElement(node: ASTNode) : PorkNamedElement(node) { override fun getName(): String? = - node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.VarAssignment))?.text + PorkElementHelpers.nameOfNamedElement(this) override fun setName(name: String): PsiElement = - this + PorkElementHelpers.setNameOfNamedElement(this, name) + + override fun getNameIdentifier(): PsiElement? = + PorkElementHelpers.nameIdentifierOfNamedElement(this) } diff --git a/support/pork-idea/src/main/resources/META-INF/plugin.xml b/support/pork-idea/src/main/resources/META-INF/plugin.xml index 04a7529..6087c44 100644 --- a/support/pork-idea/src/main/resources/META-INF/plugin.xml +++ b/support/pork-idea/src/main/resources/META-INF/plugin.xml @@ -17,6 +17,9 @@ +