mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 13:11:32 +00:00
global: idea generation support
This commit is contained in:
@ -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())
|
||||
|
@ -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
|
||||
|
||||
|
@ -9,5 +9,5 @@ class PorkFile(viewProvider: FileViewProvider) : PsiFileBase(viewProvider, PorkL
|
||||
return PorkFileType
|
||||
}
|
||||
|
||||
override fun toString(): String = "Pork File"
|
||||
override fun toString(): String = "Pork"
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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!!
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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
|
||||
}
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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)
|
||||
}
|
||||
}
|
@ -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
|
@ -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)
|
@ -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
|
||||
}
|
@ -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)
|
@ -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)
|
@ -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)
|
@ -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
|
||||
}
|
@ -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
|
||||
}
|
@ -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)
|
@ -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"
|
||||
|
Reference in New Issue
Block a user