mirror of
https://github.com/GayPizzaSpecifications/pork.git
synced 2025-08-03 21:21:33 +00:00
language: prepare for struct support
This commit is contained in:
@ -157,8 +157,8 @@ types:
|
||||
type: List<ArgumentSpec>
|
||||
- name: block
|
||||
type: Block?
|
||||
- name: native
|
||||
type: Native?
|
||||
- name: nativeFunctionDescriptor
|
||||
type: NativeFunctionDescriptor?
|
||||
LetDefinition:
|
||||
parent: Definition
|
||||
namedElementValue: symbol
|
||||
@ -303,7 +303,7 @@ types:
|
||||
NoneLiteral:
|
||||
parent: Expression
|
||||
values: []
|
||||
Native:
|
||||
NativeFunctionDescriptor:
|
||||
parent: Node
|
||||
values:
|
||||
- name: form
|
||||
|
@ -37,7 +37,7 @@ digraph A {
|
||||
type_Break [shape=box,label="Break"]
|
||||
type_Continue [shape=box,label="Continue"]
|
||||
type_NoneLiteral [shape=box,label="NoneLiteral"]
|
||||
type_Native [shape=box,label="Native"]
|
||||
type_NativeFunctionDescriptor [shape=box,label="NativeFunctionDescriptor"]
|
||||
type_IndexedBy [shape=box,label="IndexedBy"]
|
||||
type_Node -> type_Expression
|
||||
type_Node -> type_Symbol
|
||||
@ -48,7 +48,7 @@ digraph A {
|
||||
type_Node -> type_ArgumentSpec
|
||||
type_Node -> type_ImportPath
|
||||
type_Node -> type_ForInItem
|
||||
type_Node -> type_Native
|
||||
type_Node -> type_NativeFunctionDescriptor
|
||||
type_Expression -> type_LetAssignment
|
||||
type_Expression -> type_VarAssignment
|
||||
type_Expression -> type_SetAssignment
|
||||
@ -94,7 +94,7 @@ digraph A {
|
||||
type_FunctionDefinition -> type_Symbol [style=dotted]
|
||||
type_FunctionDefinition -> type_ArgumentSpec [style=dotted]
|
||||
type_FunctionDefinition -> type_Block [style=dotted]
|
||||
type_FunctionDefinition -> type_Native [style=dotted]
|
||||
type_FunctionDefinition -> type_NativeFunctionDescriptor [style=dotted]
|
||||
type_LetDefinition -> type_DefinitionModifiers [style=dotted]
|
||||
type_LetDefinition -> type_Symbol [style=dotted]
|
||||
type_LetDefinition -> type_Expression [style=dotted]
|
||||
@ -116,7 +116,7 @@ digraph A {
|
||||
type_ForIn -> type_ForInItem [style=dotted]
|
||||
type_ForIn -> type_Expression [style=dotted]
|
||||
type_ForIn -> type_Block [style=dotted]
|
||||
type_Native -> type_Symbol [style=dotted]
|
||||
type_Native -> type_StringLiteral [style=dotted]
|
||||
type_NativeFunctionDescriptor -> type_Symbol [style=dotted]
|
||||
type_NativeFunctionDescriptor -> type_StringLiteral [style=dotted]
|
||||
type_IndexedBy -> type_Expression [style=dotted]
|
||||
}
|
||||
|
@ -6,18 +6,18 @@ import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
@SerialName("functionDefinition")
|
||||
class FunctionDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val arguments: List<ArgumentSpec>, val block: Block?, val native: Native?) : Definition() {
|
||||
class FunctionDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val arguments: List<ArgumentSpec>, val block: Block?, val nativeFunctionDescriptor: NativeFunctionDescriptor?) : Definition() {
|
||||
override val type: NodeType = NodeType.FunctionDefinition
|
||||
|
||||
override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
|
||||
visitor.visitAll(listOf(symbol), arguments, listOf(block), listOf(native))
|
||||
visitor.visitAll(listOf(symbol), arguments, listOf(block), listOf(nativeFunctionDescriptor))
|
||||
|
||||
override fun <T> visit(visitor: NodeVisitor<T>): T =
|
||||
visitor.visitFunctionDefinition(this)
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is FunctionDefinition) return false
|
||||
return other.modifiers == modifiers && other.symbol == symbol && other.arguments == arguments && other.block == block && other.native == native
|
||||
return other.modifiers == modifiers && other.symbol == symbol && other.arguments == arguments && other.block == block && other.nativeFunctionDescriptor == nativeFunctionDescriptor
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
@ -25,7 +25,7 @@ class FunctionDefinition(override val modifiers: DefinitionModifiers, override v
|
||||
result = 31 * result + symbol.hashCode()
|
||||
result = 31 * result + arguments.hashCode()
|
||||
result = 31 * result + block.hashCode()
|
||||
result = 31 * result + native.hashCode()
|
||||
result = 31 * result + nativeFunctionDescriptor.hashCode()
|
||||
result = 31 * result + type.hashCode()
|
||||
return result
|
||||
}
|
||||
|
@ -5,18 +5,18 @@ import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@Serializable
|
||||
@SerialName("native")
|
||||
class Native(val form: Symbol, val definitions: List<StringLiteral>) : Node() {
|
||||
override val type: NodeType = NodeType.Native
|
||||
@SerialName("nativeFunctionDescriptor")
|
||||
class NativeFunctionDescriptor(val form: Symbol, val definitions: List<StringLiteral>) : Node() {
|
||||
override val type: NodeType = NodeType.NativeFunctionDescriptor
|
||||
|
||||
override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
|
||||
visitor.visitAll(listOf(form), definitions)
|
||||
|
||||
override fun <T> visit(visitor: NodeVisitor<T>): T =
|
||||
visitor.visitNative(this)
|
||||
visitor.visitNativeFunctionDescriptor(this)
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is Native) return false
|
||||
if (other !is NativeFunctionDescriptor) return false
|
||||
return other.form == form && other.definitions == definitions
|
||||
}
|
||||
|
@ -65,7 +65,7 @@ class NodeCoalescer(val followChildren: Boolean = true, val handler: (Node) -> U
|
||||
override fun visitLongLiteral(node: LongLiteral): Unit =
|
||||
handle(node)
|
||||
|
||||
override fun visitNative(node: Native): Unit =
|
||||
override fun visitNativeFunctionDescriptor(node: NativeFunctionDescriptor): Unit =
|
||||
handle(node)
|
||||
|
||||
override fun visitNoneLiteral(node: NoneLiteral): Unit =
|
||||
|
@ -50,7 +50,7 @@ interface NodeParser {
|
||||
|
||||
fun parseLongLiteral(): LongLiteral
|
||||
|
||||
fun parseNative(): Native
|
||||
fun parseNativeFunctionDescriptor(): NativeFunctionDescriptor
|
||||
|
||||
fun parseNoneLiteral(): NoneLiteral
|
||||
|
||||
|
@ -36,7 +36,7 @@ fun NodeParser.parse(type: NodeType): Node =
|
||||
NodeType.Break -> parseBreak()
|
||||
NodeType.Continue -> parseContinue()
|
||||
NodeType.NoneLiteral -> parseNoneLiteral()
|
||||
NodeType.Native -> parseNative()
|
||||
NodeType.NativeFunctionDescriptor -> parseNativeFunctionDescriptor()
|
||||
NodeType.IndexedBy -> parseIndexedBy()
|
||||
else -> throw RuntimeException("Unable to automatically parse type: ${type.name}")
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ enum class NodeType(val parent: NodeType? = null) {
|
||||
LetDefinition(Definition),
|
||||
ListLiteral(Expression),
|
||||
LongLiteral(Expression),
|
||||
Native(Node),
|
||||
NativeFunctionDescriptor(Node),
|
||||
NoneLiteral(Expression),
|
||||
Parentheses(Expression),
|
||||
PrefixOperation(Expression),
|
||||
|
@ -44,7 +44,7 @@ interface NodeVisitor<T> {
|
||||
|
||||
fun visitLongLiteral(node: LongLiteral): T
|
||||
|
||||
fun visitNative(node: Native): T
|
||||
fun visitNativeFunctionDescriptor(node: NativeFunctionDescriptor): T
|
||||
|
||||
fun visitNoneLiteral(node: NoneLiteral): T
|
||||
|
||||
|
@ -33,7 +33,7 @@ fun <T> NodeVisitor<T>.visit(node: Node): T =
|
||||
is Break -> visitBreak(node)
|
||||
is Continue -> visitContinue(node)
|
||||
is NoneLiteral -> visitNoneLiteral(node)
|
||||
is Native -> visitNative(node)
|
||||
is NativeFunctionDescriptor -> visitNativeFunctionDescriptor(node)
|
||||
is IndexedBy -> visitIndexedBy(node)
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user