language: prepare for struct support

This commit is contained in:
2023-11-06 21:37:27 -08:00
parent e3bfa3fbfc
commit 8c48c93663
18 changed files with 42 additions and 41 deletions

View File

@ -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

View File

@ -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]
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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 =

View File

@ -50,7 +50,7 @@ interface NodeParser {
fun parseLongLiteral(): LongLiteral
fun parseNative(): Native
fun parseNativeFunctionDescriptor(): NativeFunctionDescriptor
fun parseNoneLiteral(): NoneLiteral

View File

@ -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}")
}

View File

@ -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),

View File

@ -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

View File

@ -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)
}