global: idea generation support

This commit is contained in:
2023-09-17 00:37:58 -07:00
parent 821aa3563a
commit 3b101bd48a
57 changed files with 618 additions and 47 deletions

View File

@ -1,12 +1,19 @@
import gay.pizza.pork.buildext.AstCodegenType
plugins {
id("org.jetbrains.intellij") version "1.15.0"
id("gay.pizza.pork.module")
id("gay.pizza.pork.ast")
}
dependencies {
implementation(project(":parser"))
}
porkAst {
astCodegenType.set(AstCodegenType.PorkIdea)
}
intellij {
pluginName.set(properties["pluginName"].toString())
version.set(properties["platformVersion"].toString())

View File

@ -1,10 +1,7 @@
package gay.pizza.pork.idea
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType
import com.intellij.psi.tree.TokenSet
import gay.pizza.pork.ast.Node
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.parser.TokenType

View File

@ -9,5 +9,5 @@ class PorkFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, PorkL
return PorkFileType
}
override fun toString(): String = "Pork File"
override fun toString(): String = "Pork"
}

View File

@ -9,7 +9,7 @@ import javax.swing.Icon
@Suppress("UnstableApiUsage")
object PorkFileType : LanguageFileType(PorkLanguage) {
override fun getName(): @NonNls String {
return "Pork File"
return "Pork"
}
override fun getDescription(): @NlsContexts.Label String {

View File

@ -1,6 +1,5 @@
package gay.pizza.pork.idea
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode
import com.intellij.lang.ParserDefinition
import com.intellij.lang.PsiParser
@ -11,6 +10,8 @@ import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFile
import com.intellij.psi.tree.IFileElementType
import com.intellij.psi.tree.TokenSet
import gay.pizza.pork.idea.psi.gen.PorkElementFactory
import gay.pizza.pork.parser.TokenType
class PorkParserDefinition : ParserDefinition {
val fileElementType = IFileElementType(PorkLanguage)
@ -35,8 +36,12 @@ class PorkParserDefinition : ParserDefinition {
return PorkElementTypes.StringSet
}
override fun getWhitespaceTokens(): TokenSet {
return TokenSet.create(PorkElementTypes.elementTypeFor(TokenType.Whitespace))
}
override fun createElement(node: ASTNode): PsiElement {
return ASTWrapperPsiElement(node)
return PorkElementFactory.create(node)
}
override fun createFile(viewProvider: FileViewProvider): PsiFile {

View File

@ -28,5 +28,5 @@ class PsiBuilderTokenSource(val builder: PsiBuilder) : TokenSource {
return Token(tokenType, builder.currentOffset, builder.tokenText!!)
}
class BadCharacterError(val error: String) : RuntimeException(error)
class BadCharacterError(error: String) : RuntimeException(error)
}

View File

@ -0,0 +1,11 @@
package gay.pizza.pork.idea.psi
import gay.pizza.pork.ast.Node
import gay.pizza.pork.idea.PorkNodeKey
import gay.pizza.pork.idea.psi.gen.PorkElement
val PorkElement.porkNode: Node?
get() = node.getUserData(PorkNodeKey)
val PorkElement.porkNodeChecked: Node
get() = porkNode!!

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class BlockElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class BooleanLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class BreakElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class CompilationUnitElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class ContinueElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class DoubleLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class ForInElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class FunctionCallElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class FunctionDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.FunctionDefinition))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class IfElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class ImportDeclarationElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class InfixOperationElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class IntegerLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class LetAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.LetAssignment))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class LetDefinitionElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.LetDefinition))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class ListLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class LongLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class NativeElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class NoneLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class ParenthesesElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,7 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode
abstract class PorkElement(node: ASTNode) : ASTWrapperPsiElement(node)

View File

@ -0,0 +1,43 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.extapi.psi.ASTWrapperPsiElement
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiElement
import gay.pizza.pork.ast.NodeType
import gay.pizza.pork.idea.PorkElementTypes
object PorkElementFactory {
fun create(node: ASTNode): PsiElement =
when (PorkElementTypes.nodeTypeFor(node.elementType)) {
NodeType.Symbol -> SymbolElement(node)
NodeType.Block -> BlockElement(node)
NodeType.CompilationUnit -> CompilationUnitElement(node)
NodeType.LetAssignment -> LetAssignmentElement(node)
NodeType.VarAssignment -> VarAssignmentElement(node)
NodeType.SetAssignment -> SetAssignmentElement(node)
NodeType.InfixOperation -> InfixOperationElement(node)
NodeType.BooleanLiteral -> BooleanLiteralElement(node)
NodeType.FunctionCall -> FunctionCallElement(node)
NodeType.FunctionDefinition -> FunctionDefinitionElement(node)
NodeType.LetDefinition -> LetDefinitionElement(node)
NodeType.If -> IfElement(node)
NodeType.ImportDeclaration -> ImportDeclarationElement(node)
NodeType.IntegerLiteral -> IntegerLiteralElement(node)
NodeType.LongLiteral -> LongLiteralElement(node)
NodeType.DoubleLiteral -> DoubleLiteralElement(node)
NodeType.ListLiteral -> ListLiteralElement(node)
NodeType.Parentheses -> ParenthesesElement(node)
NodeType.PrefixOperation -> PrefixOperationElement(node)
NodeType.SuffixOperation -> SuffixOperationElement(node)
NodeType.StringLiteral -> StringLiteralElement(node)
NodeType.SymbolReference -> SymbolReferenceElement(node)
NodeType.While -> WhileElement(node)
NodeType.ForIn -> ForInElement(node)
NodeType.Break -> BreakElement(node)
NodeType.Continue -> ContinueElement(node)
NodeType.NoneLiteral -> NoneLiteralElement(node)
NodeType.Native -> NativeElement(node)
else -> ASTWrapperPsiElement(node)
}
}

View File

@ -0,0 +1,7 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
import com.intellij.psi.PsiNamedElement
abstract class PorkNamedElement(node: ASTNode) : PorkElement(node), PsiNamedElement

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class PrefixOperationElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class SetAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.SetAssignment))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class StringLiteralElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class SuffixOperationElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class SymbolElement(node: ASTNode) : PorkElement(node)

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class SymbolReferenceElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.SymbolReference))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,15 @@
// GENERATED CODE FROM PORK AST CODEGEN
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
class VarAssignmentElement(node: ASTNode) : PorkNamedElement(node) {
override fun getName(): String? =
node.findChildByType(PorkElementTypes.elementTypeFor(NodeType.VarAssignment))?.text
override fun setName(name: String): PsiElement =
this
}

View File

@ -0,0 +1,6 @@
// GENERATED CODE FROM PORK AST CODEGEN
package gay.pizza.pork.idea.psi.gen
import com.intellij.lang.ASTNode
class WhileElement(node: ASTNode) : PorkElement(node)

View File

@ -6,7 +6,7 @@
<vendor>Gay Pizza Specifications</vendor>
<depends>com.intellij.modules.platform</depends>
<extensions defaultExtensionNs="com.intellij">
<fileType name="Pork File" language="Pork" extensions="pork" fieldName="INSTANCE"
<fileType name="Pork" language="Pork" extensions="pork" fieldName="INSTANCE"
implementationClass="gay.pizza.pork.idea.PorkFileType"/>
<lang.syntaxHighlighterFactory
language="Pork"