idea: significant enhancements to ide experience

This commit is contained in:
Alex Zenla 2023-09-22 22:38:06 -07:00
parent 83c24843a3
commit c340cfb86d
Signed by: alex
GPG Key ID: C0780728420EBFE5
46 changed files with 450 additions and 131 deletions

View File

@ -261,6 +261,7 @@ types:
parent: Expression
referencedElementValue: symbol
referencedElementType: Node
namedElementValue: symbol
values:
- name: symbol
type: Symbol

View File

@ -1,9 +1,9 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.ast
import kotlinx.serialization.Transient
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.Transient
@Serializable
@SerialName("node")

View File

@ -70,13 +70,15 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) :
),
inherits = mutableListOf("${baseType}(node)"),
imports = mutableListOf(
"com.intellij.lang.ASTNode"
"com.intellij.lang.ASTNode",
"gay.pizza.pork.idea.psi.PorkElementHelpers",
"javax.swing.Icon",
"com.intellij.navigation.ItemPresentation"
)
)
if (baseType == "PorkNamedElement") {
kotlinClass.imports.add(0, "com.intellij.psi.PsiElement")
kotlinClass.imports.add("gay.pizza.pork.idea.psi.PorkElementHelpers")
val getNameFunction = KotlinFunction(
"getName",
overridden = true,
@ -111,7 +113,6 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) :
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",
@ -123,6 +124,27 @@ class AstPorkIdeaCodegen(pkg: String, outputDirectory: Path, world: AstWorld) :
kotlinClass.functions.add(getReferenceFunction)
}
val getIconFunction = KotlinFunction(
"getIcon",
overridden = true,
returnType = "Icon?",
parameters = mutableListOf(
KotlinParameter("flags", "Int")
),
isImmediateExpression = true
)
getIconFunction.body.add("PorkElementHelpers.iconOf(this)")
kotlinClass.functions.add(getIconFunction)
val getPresentationFunction = KotlinFunction(
"getPresentation",
overridden = true,
returnType = "ItemPresentation?",
isImmediateExpression = true
)
getPresentationFunction.body.add("PorkElementHelpers.presentationOf(this)")
kotlinClass.functions.add(getPresentationFunction)
write("${type.name}Element.kt", KotlinWriter(kotlinClass))
}

View File

@ -195,7 +195,7 @@ class KotlinWriter() {
appendLine("package $pkg")
appendLine()
for (import in imports) {
for (import in imports.toSortedSet()) {
appendLine("import $import")
}

View File

@ -0,0 +1,23 @@
package gay.pizza.pork.idea
import com.intellij.openapi.util.TextRange
import com.intellij.psi.AbstractElementManipulator
import com.intellij.psi.PsiFileFactory
import com.intellij.psi.impl.PsiFileFactoryImpl
import com.intellij.psi.util.elementType
import gay.pizza.pork.idea.psi.gen.PorkElement
class PorkElementManipulator : AbstractElementManipulator<PorkElement>() {
override fun handleContentChange(element: PorkElement, range: TextRange, newContent: String): PorkElement? {
val sourceText = element.text
val beforeText = sourceText.substring(0, range.startOffset)
val afterText = sourceText.substring(range.endOffset)
val changedText = beforeText + newContent + afterText
return element.replace(produce(element, changedText)) as PorkElement?
}
fun produce(element: PorkElement, changed: String): PorkElement {
val factory = PsiFileFactory.getInstance(element.project) as PsiFileFactoryImpl
return factory.createElementFromText(changed, PorkLanguage, element.elementType!!, element.context) as PorkElement
}
}

View File

@ -1,11 +0,0 @@
package gay.pizza.pork.idea
import com.intellij.model.Pointer
import com.intellij.model.Symbol
@Suppress("UnstableApiUsage")
data class PorkFunctionSymbol(val id: String) : Symbol {
override fun createPointer(): Pointer<out Symbol> {
return Pointer { this }
}
}

View File

@ -1,6 +0,0 @@
package gay.pizza.pork.idea
import com.intellij.openapi.util.Key
import gay.pizza.pork.ast.Node
object PorkNodeKey : Key<Node>("PorkAstNode")

View File

@ -3,18 +3,26 @@ 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 com.intellij.psi.tree.IFileElementType
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.ast.parse
import gay.pizza.pork.parser.Parser
class PorkParser : PsiParser {
override fun parse(root: IElementType, builder: PsiBuilder): ASTNode {
val nodeTypeForParse = if (root is IFileElementType) {
NodeType.CompilationUnit
} else {
PorkElementTypes.nodeTypeFor(root) ?:
throw RuntimeException("Unable to parse element type: $root")
}
val marker = builder.mark()
val psiBuilderMarkAttribution = PsiBuilderMarkAttribution(builder)
val source = PsiBuilderTokenSource(builder)
val parser = Parser(source, psiBuilderMarkAttribution)
try {
parser.parseCompilationUnit()
parser.parse(nodeTypeForParse)
} catch (_: ExitParser) {}
marker.done(root)
return builder.treeBuilt

View File

@ -1,27 +0,0 @@
package gay.pizza.pork.idea
import com.intellij.model.Symbol
import com.intellij.model.psi.PsiSymbolDeclaration
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiElement
import com.intellij.psi.util.elementType
import gay.pizza.pork.ast.NodeType
@Suppress("UnstableApiUsage")
class PorkSymbolDeclaration(val element: PsiElement) : PsiSymbolDeclaration {
override fun getDeclaringElement(): PsiElement = element
override fun getRangeInDeclaringElement(): TextRange {
return getSymbolElement().textRange
}
override fun getSymbol(): Symbol {
val element = getSymbolElement()
return PorkFunctionSymbol(element.text.trim())
}
private fun getSymbolElement(): PsiElement {
return element.children.first {
it.elementType == PorkElementTypes.elementTypeFor(NodeType.Symbol)
}
}
}

View File

@ -1,21 +0,0 @@
package gay.pizza.pork.idea
import com.intellij.model.psi.PsiSymbolDeclaration
import com.intellij.model.psi.PsiSymbolDeclarationProvider
import com.intellij.psi.PsiElement
import com.intellij.psi.util.elementType
import gay.pizza.pork.ast.NodeType
@Suppress("UnstableApiUsage")
class PorkSymbolDeclarationProvider : PsiSymbolDeclarationProvider {
override fun getDeclarations(
element: PsiElement,
offsetInElement: Int
): MutableCollection<out PsiSymbolDeclaration> {
val symbolDeclarations = mutableListOf<PsiSymbolDeclaration>()
if (element.elementType == PorkElementTypes.elementTypeFor(NodeType.FunctionDefinition)) {
symbolDeclarations.add(PorkSymbolDeclaration(element))
}
return symbolDeclarations
}
}

View File

@ -5,11 +5,8 @@ import gay.pizza.pork.ast.Node
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.parser.ParseError
import gay.pizza.pork.parser.ParserNodeAttribution
import java.util.IdentityHashMap
class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution() {
private val map = IdentityHashMap<Node, Node>()
override fun <T : Node> guarded(type: NodeType?, block: () -> T): T {
val marker = builder.mark()
val result = try {
@ -32,10 +29,6 @@ class PsiBuilderMarkAttribution(val builder: PsiBuilder) : ParserNodeAttribution
marker.done(PorkElementTypes.FailedToParse)
throw e
}
if (map[result] != null) {
marker.drop()
}
map[result] = result
return result
}
}

View File

@ -1,31 +1,74 @@
package gay.pizza.pork.idea.psi
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileFactory
import com.intellij.psi.PsiReference
import com.intellij.psi.impl.PsiFileFactoryImpl
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.childrenOfType
import com.intellij.util.PlatformIcons
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
import gay.pizza.pork.idea.PorkLanguage
import gay.pizza.pork.idea.psi.gen.*
import javax.swing.Icon
object PorkElementHelpers {
private val symbolElementType = PorkElementTypes.elementTypeFor(NodeType.Symbol)
fun nameOfNamedElement(element: PorkNamedElement): String? {
val child = element.node.findChildByType(symbolElementType)
return child?.text
val child = symbolOf(element) ?: return null
return child.text
}
fun setNameOfNamedElement(element: PorkNamedElement, name: String): PsiElement = element
fun setNameOfNamedElement(element: PorkNamedElement, name: String): PsiElement {
val child = symbolOf(element) ?: return element
val factory = PsiFileFactory.getInstance(element.project) as PsiFileFactoryImpl
val created = factory.createElementFromText(name, PorkLanguage, child.elementType, element.context) as PorkElement
element.node.replaceChild(child, created.node)
return element
}
fun symbolOf(element: PorkElement): ASTNode? {
var child = element.node.findChildByType(symbolElementType)
if (child == null) {
child = PsiTreeUtil.collectElementsOfType(element, SymbolElement::class.java).firstOrNull()?.node
}
return child
}
fun nameIdentifierOfNamedElement(element: PorkNamedElement): PsiElement? {
val child = element.node.findChildByType(symbolElementType)
return child?.psi
return symbolOf(element)?.psi
}
fun referenceOfElement(element: PorkElement, type: NodeType): PsiReference? {
val textRangeOfSymbolInElement = element.childrenOfType<SymbolElement>().firstOrNull()?.textRangeInParent ?: return null
return PorkIdentifierReference(element, textRangeOfSymbolInElement)
}
fun iconOf(element: PorkElement): Icon? {
return when (element) {
is LetDefinitionElement -> PlatformIcons.FIELD_ICON
is FunctionDefinitionElement -> PlatformIcons.FUNCTION_ICON
is LetAssignmentElement -> PlatformIcons.VARIABLE_READ_ACCESS
is VarAssignmentElement -> PlatformIcons.VARIABLE_RW_ACCESS
is ArgumentSpecElement -> PlatformIcons.VARIABLE_READ_ACCESS
else -> null
}
}
fun presentationOf(element: PorkElement): ItemPresentation? {
val icon = iconOf(element)
if (element is FunctionDefinitionElement || element is LetDefinitionElement) {
return PorkPresentable(element.name, icon, element.containingFile.virtualFile?.name)
}
if (element is LetAssignmentElement || element is VarAssignmentElement) {
return PorkPresentable(element.name, icon)
}
return null
}
}

View File

@ -17,7 +17,8 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
}
override fun getVariants(): Array<Any> {
return findAllCandidates().toTypedArray()
val candidates = findAllCandidates()
return candidates.toTypedArray()
}
fun findAllCandidates(name: String? = null): List<PorkElement> =
@ -25,9 +26,7 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
fun findAnyLocals(name: String? = null): List<PorkElement> {
val functionDefinitionElement = PsiTreeUtil.getParentOfType(element, FunctionDefinitionElement::class.java)
if (functionDefinitionElement == null) {
return emptyList()
}
?: return emptyList()
val locals = mutableListOf<PorkElement>()
fun check(localCandidate: PsiElement, upward: Boolean) {
@ -35,10 +34,6 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
return
}
if (localCandidate == element) {
return
}
if (localCandidate is ArgumentSpecElement ||
localCandidate is LetAssignmentElement ||
localCandidate is VarAssignmentElement) {
@ -46,8 +41,10 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
}
if (localCandidate is ForInElement) {
val forInItem = localCandidate.childrenOfType<ForInItemElement>().first()
locals.add(forInItem)
val forInItem = localCandidate.childrenOfType<ForInItemElement>().firstOrNull()
if (forInItem != null) {
locals.add(forInItem)
}
}
localCandidate.children.forEach { check(it, false) }
@ -55,6 +52,9 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
PsiTreeUtil.treeWalkUp(element, functionDefinitionElement) { _, localCandidate ->
if (localCandidate != null) {
if (element == functionDefinitionElement) {
return@treeWalkUp true
}
check(localCandidate, true)
}
true
@ -62,7 +62,8 @@ class PorkIdentifierReference(element: PorkElement, textRange: TextRange) : Pork
val argumentSpecElements = functionDefinitionElement.childrenOfType<ArgumentSpecElement>()
locals.addAll(argumentSpecElements)
return locals.filter { it.name == name }
val finalLocals = locals.distinctBy { it.textRange }
return finalLocals.filter { if (name != null) it.name == name else true }
}
fun findAnyDefinitions(name: String? = null): List<PorkElement> {

View File

@ -0,0 +1,10 @@
package gay.pizza.pork.idea.psi
import com.intellij.navigation.ItemPresentation
import javax.swing.Icon
class PorkPresentable(val porkText: String?, val porkIcon: Icon? = null, val porkLocation: String? = null) : ItemPresentation {
override fun getPresentableText(): String? = porkText
override fun getIcon(unused: Boolean): Icon? = porkIcon
override fun getLocationString(): String? = porkLocation
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ArgumentSpecElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class ArgumentSpecElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class BlockElement(node: ASTNode) : PorkElement(node)
class BlockElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class BooleanLiteralElement(node: ASTNode) : PorkElement(node)
class BooleanLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class BreakElement(node: ASTNode) : PorkElement(node)
class BreakElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class CompilationUnitElement(node: ASTNode) : PorkElement(node)
class CompilationUnitElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ContinueElement(node: ASTNode) : PorkElement(node)
class ContinueElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class DoubleLiteralElement(node: ASTNode) : PorkElement(node)
class DoubleLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ForInElement(node: ASTNode) : PorkElement(node)
class ForInElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ForInItemElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class ForInItemElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,12 +1,20 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiReference
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiReference
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class FunctionCallElement(node: ASTNode) : PorkElement(node) {
override fun getReference(): PsiReference? =
PorkElementHelpers.referenceOfElement(this, NodeType.FunctionDefinition)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class FunctionDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class FunctionDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class IfElement(node: ASTNode) : PorkElement(node)
class IfElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ImportDeclarationElement(node: ASTNode) : PorkElement(node)
class ImportDeclarationElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class IndexedByElement(node: ASTNode) : PorkElement(node)
class IndexedByElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class InfixOperationElement(node: ASTNode) : PorkElement(node)
class InfixOperationElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class IntegerLiteralElement(node: ASTNode) : PorkElement(node)
class IntegerLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class LetAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class LetAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class LetDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class LetDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ListLiteralElement(node: ASTNode) : PorkElement(node)
class ListLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class LongLiteralElement(node: ASTNode) : PorkElement(node)
class LongLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class NativeElement(node: ASTNode) : PorkElement(node)
class NativeElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class NoneLiteralElement(node: ASTNode) : PorkElement(node)
class NoneLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class ParenthesesElement(node: ASTNode) : PorkElement(node)
class ParenthesesElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class PrefixOperationElement(node: ASTNode) : PorkElement(node)
class PrefixOperationElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class SetAssignmentElement(node: ASTNode) : PorkElement(node)
class SetAssignmentElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class StringLiteralElement(node: ASTNode) : PorkElement(node)
class StringLiteralElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class SuffixOperationElement(node: ASTNode) : PorkElement(node)
class SuffixOperationElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class SymbolElement(node: ASTNode) : PorkElement(node)
class SymbolElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,12 +1,30 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiReference
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiReference
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class SymbolReferenceElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
PorkElementHelpers.nameOfNamedElement(this)
override fun setName(name: String): PsiElement =
PorkElementHelpers.setNameOfNamedElement(this, name)
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
class SymbolReferenceElement(node: ASTNode) : PorkElement(node) {
override fun getReference(): PsiReference? =
PorkElementHelpers.referenceOfElement(this, NodeType.Node)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -1,9 +1,11 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.psi.PsiElement
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import com.intellij.psi.PsiElement
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class VarAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
@ -14,4 +16,10 @@ class VarAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getNameIdentifier(): PsiElement? =
PorkElementHelpers.nameIdentifierOfNamedElement(this)
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -2,5 +2,14 @@
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.navigation.ItemPresentation
import gay.pizza.pork.idea.psi.PorkElementHelpers
import javax.swing.Icon
class WhileElement(node: ASTNode) : PorkElement(node)
class WhileElement(node: ASTNode) : PorkElement(node) {
override fun getIcon(flags: Int): Icon? =
PorkElementHelpers.iconOf(this)
override fun getPresentation(): ItemPresentation? =
PorkElementHelpers.presentationOf(this)
}

View File

@ -23,7 +23,9 @@
<lang.refactoringSupport
language="Pork"
implementationClass="gay.pizza.pork.idea.PorkRefactoringSupportProvider"/>
<psi.declarationProvider implementation="gay.pizza.pork.idea.PorkSymbolDeclarationProvider"/>
<lang.elementManipulator
implementationClass="gay.pizza.pork.idea.PorkElementManipulator"
forClass="gay.pizza.pork.idea.psi.gen.PorkElement"/>
</extensions>
<applicationListeners>