mirror of
				https://github.com/GayPizzaSpecifications/pork.git
				synced 2025-11-03 17:39:38 +00:00 
			
		
		
		
	implement basic type annotations (not yet used or declarable)
This commit is contained in:
		@ -18,6 +18,11 @@ types:
 | 
				
			|||||||
    - name: modifiers
 | 
					    - name: modifiers
 | 
				
			||||||
      type: DefinitionModifiers
 | 
					      type: DefinitionModifiers
 | 
				
			||||||
      required: true
 | 
					      required: true
 | 
				
			||||||
 | 
					  TypeSpec:
 | 
				
			||||||
 | 
					    parent: Node
 | 
				
			||||||
 | 
					    values:
 | 
				
			||||||
 | 
					    - name: symbol
 | 
				
			||||||
 | 
					      type: Symbol
 | 
				
			||||||
  DefinitionModifiers:
 | 
					  DefinitionModifiers:
 | 
				
			||||||
    values:
 | 
					    values:
 | 
				
			||||||
    - name: export
 | 
					    - name: export
 | 
				
			||||||
@ -42,6 +47,8 @@ types:
 | 
				
			|||||||
      type: Symbol
 | 
					      type: Symbol
 | 
				
			||||||
    - name: value
 | 
					    - name: value
 | 
				
			||||||
      type: Expression
 | 
					      type: Expression
 | 
				
			||||||
 | 
					    - name: typeSpec
 | 
				
			||||||
 | 
					      type: TypeSpec?
 | 
				
			||||||
  VarAssignment:
 | 
					  VarAssignment:
 | 
				
			||||||
    parent: Expression
 | 
					    parent: Expression
 | 
				
			||||||
    namedElementValue: symbol
 | 
					    namedElementValue: symbol
 | 
				
			||||||
@ -50,6 +57,8 @@ types:
 | 
				
			|||||||
      type: Symbol
 | 
					      type: Symbol
 | 
				
			||||||
    - name: value
 | 
					    - name: value
 | 
				
			||||||
      type: Expression
 | 
					      type: Expression
 | 
				
			||||||
 | 
					    - name: typeSpec
 | 
				
			||||||
 | 
					      type: TypeSpec?
 | 
				
			||||||
  SetAssignment:
 | 
					  SetAssignment:
 | 
				
			||||||
    parent: Expression
 | 
					    parent: Expression
 | 
				
			||||||
    values:
 | 
					    values:
 | 
				
			||||||
@ -142,6 +151,8 @@ types:
 | 
				
			|||||||
    values:
 | 
					    values:
 | 
				
			||||||
    - name: symbol
 | 
					    - name: symbol
 | 
				
			||||||
      type: Symbol
 | 
					      type: Symbol
 | 
				
			||||||
 | 
					    - name: typeSpec
 | 
				
			||||||
 | 
					      type: TypeSpec?
 | 
				
			||||||
    - name: multiple
 | 
					    - name: multiple
 | 
				
			||||||
      type: Boolean
 | 
					      type: Boolean
 | 
				
			||||||
      defaultValue: "false"
 | 
					      defaultValue: "false"
 | 
				
			||||||
@ -155,6 +166,8 @@ types:
 | 
				
			|||||||
      type: Symbol
 | 
					      type: Symbol
 | 
				
			||||||
    - name: arguments
 | 
					    - name: arguments
 | 
				
			||||||
      type: List<ArgumentSpec>
 | 
					      type: List<ArgumentSpec>
 | 
				
			||||||
 | 
					    - name: returnType
 | 
				
			||||||
 | 
					      type: TypeSpec?
 | 
				
			||||||
    - name: block
 | 
					    - name: block
 | 
				
			||||||
      type: Block?
 | 
					      type: Block?
 | 
				
			||||||
    - name: nativeFunctionDescriptor
 | 
					    - name: nativeFunctionDescriptor
 | 
				
			||||||
@ -167,6 +180,8 @@ types:
 | 
				
			|||||||
      type: DefinitionModifiers
 | 
					      type: DefinitionModifiers
 | 
				
			||||||
    - name: symbol
 | 
					    - name: symbol
 | 
				
			||||||
      type: Symbol
 | 
					      type: Symbol
 | 
				
			||||||
 | 
					    - name: typeSpec
 | 
				
			||||||
 | 
					      type: TypeSpec?
 | 
				
			||||||
    - name: value
 | 
					    - name: value
 | 
				
			||||||
      type: Expression
 | 
					      type: Expression
 | 
				
			||||||
  If:
 | 
					  If:
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ digraph A {
 | 
				
			|||||||
  type_Symbol [shape=box,label="Symbol"]
 | 
					  type_Symbol [shape=box,label="Symbol"]
 | 
				
			||||||
  type_Declaration [shape=box,label="Declaration"]
 | 
					  type_Declaration [shape=box,label="Declaration"]
 | 
				
			||||||
  type_Definition [shape=box,label="Definition"]
 | 
					  type_Definition [shape=box,label="Definition"]
 | 
				
			||||||
 | 
					  type_TypeSpec [shape=box,label="TypeSpec"]
 | 
				
			||||||
  type_DefinitionModifiers [shape=box,label="DefinitionModifiers"]
 | 
					  type_DefinitionModifiers [shape=box,label="DefinitionModifiers"]
 | 
				
			||||||
  type_Block [shape=box,label="Block"]
 | 
					  type_Block [shape=box,label="Block"]
 | 
				
			||||||
  type_CompilationUnit [shape=box,label="CompilationUnit"]
 | 
					  type_CompilationUnit [shape=box,label="CompilationUnit"]
 | 
				
			||||||
@ -44,6 +45,7 @@ digraph A {
 | 
				
			|||||||
  type_Node -> type_Symbol
 | 
					  type_Node -> type_Symbol
 | 
				
			||||||
  type_Node -> type_Declaration
 | 
					  type_Node -> type_Declaration
 | 
				
			||||||
  type_Node -> type_Definition
 | 
					  type_Node -> type_Definition
 | 
				
			||||||
 | 
					  type_Node -> type_TypeSpec
 | 
				
			||||||
  type_Node -> type_Block
 | 
					  type_Node -> type_Block
 | 
				
			||||||
  type_Node -> type_CompilationUnit
 | 
					  type_Node -> type_CompilationUnit
 | 
				
			||||||
  type_Node -> type_ArgumentSpec
 | 
					  type_Node -> type_ArgumentSpec
 | 
				
			||||||
@ -78,13 +80,16 @@ digraph A {
 | 
				
			|||||||
  type_Declaration -> type_ImportDeclaration
 | 
					  type_Declaration -> type_ImportDeclaration
 | 
				
			||||||
  type_Definition -> type_Symbol [style=dotted]
 | 
					  type_Definition -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_Definition -> type_DefinitionModifiers [style=dotted]
 | 
					  type_Definition -> type_DefinitionModifiers [style=dotted]
 | 
				
			||||||
 | 
					  type_TypeSpec -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_Block -> type_Expression [style=dotted]
 | 
					  type_Block -> type_Expression [style=dotted]
 | 
				
			||||||
  type_CompilationUnit -> type_Declaration [style=dotted]
 | 
					  type_CompilationUnit -> type_Declaration [style=dotted]
 | 
				
			||||||
  type_CompilationUnit -> type_Definition [style=dotted]
 | 
					  type_CompilationUnit -> type_Definition [style=dotted]
 | 
				
			||||||
  type_LetAssignment -> type_Symbol [style=dotted]
 | 
					  type_LetAssignment -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_LetAssignment -> type_Expression [style=dotted]
 | 
					  type_LetAssignment -> type_Expression [style=dotted]
 | 
				
			||||||
 | 
					  type_LetAssignment -> type_TypeSpec [style=dotted]
 | 
				
			||||||
  type_VarAssignment -> type_Symbol [style=dotted]
 | 
					  type_VarAssignment -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_VarAssignment -> type_Expression [style=dotted]
 | 
					  type_VarAssignment -> type_Expression [style=dotted]
 | 
				
			||||||
 | 
					  type_VarAssignment -> type_TypeSpec [style=dotted]
 | 
				
			||||||
  type_SetAssignment -> type_Symbol [style=dotted]
 | 
					  type_SetAssignment -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_SetAssignment -> type_Expression [style=dotted]
 | 
					  type_SetAssignment -> type_Expression [style=dotted]
 | 
				
			||||||
  type_InfixOperation -> type_Expression [style=dotted]
 | 
					  type_InfixOperation -> type_Expression [style=dotted]
 | 
				
			||||||
@ -92,13 +97,16 @@ digraph A {
 | 
				
			|||||||
  type_FunctionCall -> type_Symbol [style=dotted]
 | 
					  type_FunctionCall -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_FunctionCall -> type_Expression [style=dotted]
 | 
					  type_FunctionCall -> type_Expression [style=dotted]
 | 
				
			||||||
  type_ArgumentSpec -> type_Symbol [style=dotted]
 | 
					  type_ArgumentSpec -> type_Symbol [style=dotted]
 | 
				
			||||||
 | 
					  type_ArgumentSpec -> type_TypeSpec [style=dotted]
 | 
				
			||||||
  type_FunctionDefinition -> type_DefinitionModifiers [style=dotted]
 | 
					  type_FunctionDefinition -> type_DefinitionModifiers [style=dotted]
 | 
				
			||||||
  type_FunctionDefinition -> type_Symbol [style=dotted]
 | 
					  type_FunctionDefinition -> type_Symbol [style=dotted]
 | 
				
			||||||
  type_FunctionDefinition -> type_ArgumentSpec [style=dotted]
 | 
					  type_FunctionDefinition -> type_ArgumentSpec [style=dotted]
 | 
				
			||||||
 | 
					  type_FunctionDefinition -> type_TypeSpec [style=dotted]
 | 
				
			||||||
  type_FunctionDefinition -> type_Block [style=dotted]
 | 
					  type_FunctionDefinition -> type_Block [style=dotted]
 | 
				
			||||||
  type_FunctionDefinition -> type_NativeFunctionDescriptor [style=dotted]
 | 
					  type_FunctionDefinition -> type_NativeFunctionDescriptor [style=dotted]
 | 
				
			||||||
  type_LetDefinition -> type_DefinitionModifiers [style=dotted]
 | 
					  type_LetDefinition -> type_DefinitionModifiers [style=dotted]
 | 
				
			||||||
  type_LetDefinition -> type_Symbol [style=dotted]
 | 
					  type_LetDefinition -> type_Symbol [style=dotted]
 | 
				
			||||||
 | 
					  type_LetDefinition -> type_TypeSpec [style=dotted]
 | 
				
			||||||
  type_LetDefinition -> type_Expression [style=dotted]
 | 
					  type_LetDefinition -> type_Expression [style=dotted]
 | 
				
			||||||
  type_If -> type_Expression [style=dotted]
 | 
					  type_If -> type_Expression [style=dotted]
 | 
				
			||||||
  type_If -> type_Block [style=dotted]
 | 
					  type_If -> type_Block [style=dotted]
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,9 @@ abstract class FunctionLevelVisitor<T> : NodeVisitor<T> {
 | 
				
			|||||||
  override fun visitSymbol(node: Symbol): T =
 | 
					  override fun visitSymbol(node: Symbol): T =
 | 
				
			||||||
    throw RuntimeException("Visiting Symbol is not supported.")
 | 
					    throw RuntimeException("Visiting Symbol is not supported.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun visitTypeSpec(node: TypeSpec): T =
 | 
				
			||||||
 | 
					    throw RuntimeException("Visiting TypeSpec is not supported.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun visitLetDefinition(node: LetDefinition): T {
 | 
					  override fun visitLetDefinition(node: LetDefinition): T {
 | 
				
			||||||
    topLevelUsedError("LetDefinition")
 | 
					    topLevelUsedError("LetDefinition")
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -6,22 +6,23 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
@SerialName("argumentSpec")
 | 
					@SerialName("argumentSpec")
 | 
				
			||||||
class ArgumentSpec(val symbol: Symbol, val multiple: Boolean = false) : Node() {
 | 
					class ArgumentSpec(val symbol: Symbol, val typeSpec: TypeSpec?, val multiple: Boolean = false) : Node() {
 | 
				
			||||||
  override val type: NodeType = NodeType.ArgumentSpec
 | 
					  override val type: NodeType = NodeType.ArgumentSpec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
    visitor.visitNodes(symbol)
 | 
					    visitor.visitNodes(symbol, typeSpec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
    visitor.visitArgumentSpec(this)
 | 
					    visitor.visitArgumentSpec(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
    if (other !is ArgumentSpec) return false
 | 
					    if (other !is ArgumentSpec) return false
 | 
				
			||||||
    return other.symbol == symbol && other.multiple == multiple
 | 
					    return other.symbol == symbol && other.typeSpec == typeSpec && other.multiple == multiple
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun hashCode(): Int {
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
    var result = symbol.hashCode()
 | 
					    var result = symbol.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + typeSpec.hashCode()
 | 
				
			||||||
    result = 31 * result + multiple.hashCode()
 | 
					    result = 31 * result + multiple.hashCode()
 | 
				
			||||||
    result = 31 * result + type.hashCode()
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
 | 
				
			|||||||
@ -6,24 +6,25 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
@SerialName("functionDefinition")
 | 
					@SerialName("functionDefinition")
 | 
				
			||||||
class FunctionDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val arguments: List<ArgumentSpec>, val block: Block?, val nativeFunctionDescriptor: NativeFunctionDescriptor?) : Definition() {
 | 
					class FunctionDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val arguments: List<ArgumentSpec>, val returnType: TypeSpec?, val block: Block?, val nativeFunctionDescriptor: NativeFunctionDescriptor?) : Definition() {
 | 
				
			||||||
  override val type: NodeType = NodeType.FunctionDefinition
 | 
					  override val type: NodeType = NodeType.FunctionDefinition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
    visitor.visitAll(listOf(symbol), arguments, listOf(block), listOf(nativeFunctionDescriptor))
 | 
					    visitor.visitAll(listOf(symbol), arguments, listOf(returnType), listOf(block), listOf(nativeFunctionDescriptor))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
    visitor.visitFunctionDefinition(this)
 | 
					    visitor.visitFunctionDefinition(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
    if (other !is FunctionDefinition) return false
 | 
					    if (other !is FunctionDefinition) return false
 | 
				
			||||||
    return other.modifiers == modifiers && other.symbol == symbol && other.arguments == arguments && other.block == block && other.nativeFunctionDescriptor == nativeFunctionDescriptor
 | 
					    return other.modifiers == modifiers && other.symbol == symbol && other.arguments == arguments && other.returnType == returnType && other.block == block && other.nativeFunctionDescriptor == nativeFunctionDescriptor
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun hashCode(): Int {
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
    var result = modifiers.hashCode()
 | 
					    var result = modifiers.hashCode()
 | 
				
			||||||
    result = 31 * result + symbol.hashCode()
 | 
					    result = 31 * result + symbol.hashCode()
 | 
				
			||||||
    result = 31 * result + arguments.hashCode()
 | 
					    result = 31 * result + arguments.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + returnType.hashCode()
 | 
				
			||||||
    result = 31 * result + block.hashCode()
 | 
					    result = 31 * result + block.hashCode()
 | 
				
			||||||
    result = 31 * result + nativeFunctionDescriptor.hashCode()
 | 
					    result = 31 * result + nativeFunctionDescriptor.hashCode()
 | 
				
			||||||
    result = 31 * result + type.hashCode()
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
 | 
				
			|||||||
@ -6,23 +6,24 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
@SerialName("letAssignment")
 | 
					@SerialName("letAssignment")
 | 
				
			||||||
class LetAssignment(val symbol: Symbol, val value: Expression) : Expression() {
 | 
					class LetAssignment(val symbol: Symbol, val value: Expression, val typeSpec: TypeSpec?) : Expression() {
 | 
				
			||||||
  override val type: NodeType = NodeType.LetAssignment
 | 
					  override val type: NodeType = NodeType.LetAssignment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
    visitor.visitNodes(symbol, value)
 | 
					    visitor.visitNodes(symbol, value, typeSpec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
    visitor.visitLetAssignment(this)
 | 
					    visitor.visitLetAssignment(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
    if (other !is LetAssignment) return false
 | 
					    if (other !is LetAssignment) return false
 | 
				
			||||||
    return other.symbol == symbol && other.value == value
 | 
					    return other.symbol == symbol && other.value == value && other.typeSpec == typeSpec
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun hashCode(): Int {
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
    var result = symbol.hashCode()
 | 
					    var result = symbol.hashCode()
 | 
				
			||||||
    result = 31 * result + value.hashCode()
 | 
					    result = 31 * result + value.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + typeSpec.hashCode()
 | 
				
			||||||
    result = 31 * result + type.hashCode()
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -6,23 +6,24 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
@SerialName("letDefinition")
 | 
					@SerialName("letDefinition")
 | 
				
			||||||
class LetDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val value: Expression) : Definition() {
 | 
					class LetDefinition(override val modifiers: DefinitionModifiers, override val symbol: Symbol, val typeSpec: TypeSpec?, val value: Expression) : Definition() {
 | 
				
			||||||
  override val type: NodeType = NodeType.LetDefinition
 | 
					  override val type: NodeType = NodeType.LetDefinition
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
    visitor.visitNodes(symbol, value)
 | 
					    visitor.visitNodes(symbol, typeSpec, value)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
    visitor.visitLetDefinition(this)
 | 
					    visitor.visitLetDefinition(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
    if (other !is LetDefinition) return false
 | 
					    if (other !is LetDefinition) return false
 | 
				
			||||||
    return other.modifiers == modifiers && other.symbol == symbol && other.value == value
 | 
					    return other.modifiers == modifiers && other.symbol == symbol && other.typeSpec == typeSpec && other.value == value
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun hashCode(): Int {
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
    var result = modifiers.hashCode()
 | 
					    var result = modifiers.hashCode()
 | 
				
			||||||
    result = 31 * result + symbol.hashCode()
 | 
					    result = 31 * result + symbol.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + typeSpec.hashCode()
 | 
				
			||||||
    result = 31 * result + value.hashCode()
 | 
					    result = 31 * result + value.hashCode()
 | 
				
			||||||
    result = 31 * result + type.hashCode()
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
 | 
				
			|||||||
@ -95,6 +95,9 @@ class NodeCoalescer(val followChildren: Boolean = true, val handler: (Node) -> U
 | 
				
			|||||||
  override fun visitSymbolReference(node: SymbolReference): Unit =
 | 
					  override fun visitSymbolReference(node: SymbolReference): Unit =
 | 
				
			||||||
    handle(node)
 | 
					    handle(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun visitTypeSpec(node: TypeSpec): Unit =
 | 
				
			||||||
 | 
					    handle(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun visitVarAssignment(node: VarAssignment): Unit =
 | 
					  override fun visitVarAssignment(node: VarAssignment): Unit =
 | 
				
			||||||
    handle(node)
 | 
					    handle(node)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -70,6 +70,8 @@ interface NodeParser {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  fun parseSymbolReference(): SymbolReference
 | 
					  fun parseSymbolReference(): SymbolReference
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fun parseTypeSpec(): TypeSpec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun parseVarAssignment(): VarAssignment
 | 
					  fun parseVarAssignment(): VarAssignment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun parseWhile(): While
 | 
					  fun parseWhile(): While
 | 
				
			||||||
 | 
				
			|||||||
@ -7,6 +7,7 @@ fun NodeParser.parse(type: NodeType): Node =
 | 
				
			|||||||
    NodeType.Symbol -> parseSymbol()
 | 
					    NodeType.Symbol -> parseSymbol()
 | 
				
			||||||
    NodeType.Declaration -> parseDeclaration()
 | 
					    NodeType.Declaration -> parseDeclaration()
 | 
				
			||||||
    NodeType.Definition -> parseDefinition()
 | 
					    NodeType.Definition -> parseDefinition()
 | 
				
			||||||
 | 
					    NodeType.TypeSpec -> parseTypeSpec()
 | 
				
			||||||
    NodeType.Block -> parseBlock()
 | 
					    NodeType.Block -> parseBlock()
 | 
				
			||||||
    NodeType.CompilationUnit -> parseCompilationUnit()
 | 
					    NodeType.CompilationUnit -> parseCompilationUnit()
 | 
				
			||||||
    NodeType.LetAssignment -> parseLetAssignment()
 | 
					    NodeType.LetAssignment -> parseLetAssignment()
 | 
				
			||||||
 | 
				
			|||||||
@ -37,6 +37,7 @@ enum class NodeType(val parent: NodeType? = null) {
 | 
				
			|||||||
  SuffixOperation(Expression),
 | 
					  SuffixOperation(Expression),
 | 
				
			||||||
  Symbol(Node),
 | 
					  Symbol(Node),
 | 
				
			||||||
  SymbolReference(Expression),
 | 
					  SymbolReference(Expression),
 | 
				
			||||||
 | 
					  TypeSpec(Node),
 | 
				
			||||||
  VarAssignment(Expression),
 | 
					  VarAssignment(Expression),
 | 
				
			||||||
  While(Expression)
 | 
					  While(Expression)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -64,6 +64,8 @@ interface NodeVisitor<T> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  fun visitSymbolReference(node: SymbolReference): T
 | 
					  fun visitSymbolReference(node: SymbolReference): T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  fun visitTypeSpec(node: TypeSpec): T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun visitVarAssignment(node: VarAssignment): T
 | 
					  fun visitVarAssignment(node: VarAssignment): T
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  fun visitWhile(node: While): T
 | 
					  fun visitWhile(node: While): T
 | 
				
			||||||
 | 
				
			|||||||
@ -4,6 +4,7 @@ package gay.pizza.pork.ast.gen
 | 
				
			|||||||
fun <T> NodeVisitor<T>.visit(node: Node): T =
 | 
					fun <T> NodeVisitor<T>.visit(node: Node): T =
 | 
				
			||||||
  when (node) {
 | 
					  when (node) {
 | 
				
			||||||
    is Symbol -> visitSymbol(node)
 | 
					    is Symbol -> visitSymbol(node)
 | 
				
			||||||
 | 
					    is TypeSpec -> visitTypeSpec(node)
 | 
				
			||||||
    is Block -> visitBlock(node)
 | 
					    is Block -> visitBlock(node)
 | 
				
			||||||
    is CompilationUnit -> visitCompilationUnit(node)
 | 
					    is CompilationUnit -> visitCompilationUnit(node)
 | 
				
			||||||
    is LetAssignment -> visitLetAssignment(node)
 | 
					    is LetAssignment -> visitLetAssignment(node)
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										28
									
								
								ast/src/main/kotlin/gay/pizza/pork/ast/gen/TypeSpec.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								ast/src/main/kotlin/gay/pizza/pork/ast/gen/TypeSpec.kt
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,28 @@
 | 
				
			|||||||
 | 
					// GENERATED CODE FROM PORK AST CODEGEN
 | 
				
			||||||
 | 
					package gay.pizza.pork.ast.gen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import kotlinx.serialization.SerialName
 | 
				
			||||||
 | 
					import kotlinx.serialization.Serializable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Serializable
 | 
				
			||||||
 | 
					@SerialName("typeSpec")
 | 
				
			||||||
 | 
					class TypeSpec(val symbol: Symbol) : Node() {
 | 
				
			||||||
 | 
					  override val type: NodeType = NodeType.TypeSpec
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
 | 
					    visitor.visitNodes(symbol)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
 | 
					    visitor.visitTypeSpec(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
 | 
					    if (other !is TypeSpec) return false
 | 
				
			||||||
 | 
					    return other.symbol == symbol
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
 | 
					    var result = symbol.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
 | 
					    return result
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -6,23 +6,24 @@ import kotlinx.serialization.Serializable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@Serializable
 | 
					@Serializable
 | 
				
			||||||
@SerialName("varAssignment")
 | 
					@SerialName("varAssignment")
 | 
				
			||||||
class VarAssignment(val symbol: Symbol, val value: Expression) : Expression() {
 | 
					class VarAssignment(val symbol: Symbol, val value: Expression, val typeSpec: TypeSpec?) : Expression() {
 | 
				
			||||||
  override val type: NodeType = NodeType.VarAssignment
 | 
					  override val type: NodeType = NodeType.VarAssignment
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
					  override fun <T> visitChildren(visitor: NodeVisitor<T>): List<T> =
 | 
				
			||||||
    visitor.visitNodes(symbol, value)
 | 
					    visitor.visitNodes(symbol, value, typeSpec)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
					  override fun <T> visit(visitor: NodeVisitor<T>): T =
 | 
				
			||||||
    visitor.visitVarAssignment(this)
 | 
					    visitor.visitVarAssignment(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun equals(other: Any?): Boolean {
 | 
					  override fun equals(other: Any?): Boolean {
 | 
				
			||||||
    if (other !is VarAssignment) return false
 | 
					    if (other !is VarAssignment) return false
 | 
				
			||||||
    return other.symbol == symbol && other.value == value
 | 
					    return other.symbol == symbol && other.value == value && other.typeSpec == typeSpec
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun hashCode(): Int {
 | 
					  override fun hashCode(): Int {
 | 
				
			||||||
    var result = symbol.hashCode()
 | 
					    var result = symbol.hashCode()
 | 
				
			||||||
    result = 31 * result + value.hashCode()
 | 
					    result = 31 * result + value.hashCode()
 | 
				
			||||||
 | 
					    result = 31 * result + typeSpec.hashCode()
 | 
				
			||||||
    result = 31 * result + type.hashCode()
 | 
					    result = 31 * result + type.hashCode()
 | 
				
			||||||
    return result
 | 
					    return result
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -54,8 +54,6 @@ class EvaluationVisitor(root: Scope, val stack: CallStack) : FunctionLevelVisito
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  override fun visitLongLiteral(node: LongLiteral): Any = node.value
 | 
					  override fun visitLongLiteral(node: LongLiteral): Any = node.value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun visitSymbol(node: Symbol): Any = None
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  override fun visitFunctionCall(node: FunctionCall): Any {
 | 
					  override fun visitFunctionCall(node: FunctionCall): Any {
 | 
				
			||||||
    val arguments = node.arguments.map { it.visit(this) }
 | 
					    val arguments = node.arguments.map { it.visit(this) }
 | 
				
			||||||
    val functionValue = currentScope.value(node.symbol.id) as CallableFunction
 | 
					    val functionValue = currentScope.value(node.symbol.id) as CallableFunction
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,5 @@
 | 
				
			|||||||
/* fibonacci sequence */
 | 
					/* fibonacci sequence */
 | 
				
			||||||
func fib(n) {
 | 
					func fib(n: int32): int32 {
 | 
				
			||||||
  if n < 2 {
 | 
					  if n < 2 {
 | 
				
			||||||
    return n
 | 
					    return n
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
@ -8,6 +8,6 @@ func fib(n) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export func main() {
 | 
					export func main() {
 | 
				
			||||||
  let result = fib(28)
 | 
					  let result: int32 = fib(28)
 | 
				
			||||||
  println(result)
 | 
					  println(result)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -118,7 +118,7 @@ class FfiNativeProvider : ExpandedNativeProvider, NativeProvider {
 | 
				
			|||||||
    val buffer = HeapInvocationBuffer(context)
 | 
					    val buffer = HeapInvocationBuffer(context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    val useFunctionArguments = functionArgumentSpecs ?: functionArguments.map {
 | 
					    val useFunctionArguments = functionArgumentSpecs ?: functionArguments.map {
 | 
				
			||||||
      ArgumentSpec(symbol = Symbol(""), multiple = false)
 | 
					      ArgumentSpec(symbol = Symbol(""), typeSpec = null, multiple = false)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for ((index, spec) in useFunctionArguments.withIndex()) {
 | 
					    for ((index, spec) in useFunctionArguments.withIndex()) {
 | 
				
			||||||
 | 
				
			|||||||
@ -147,11 +147,13 @@ class JavaAutogen(val javaClass: Class<*>) {
 | 
				
			|||||||
      arguments = parameterNames.map {
 | 
					      arguments = parameterNames.map {
 | 
				
			||||||
        ArgumentSpec(
 | 
					        ArgumentSpec(
 | 
				
			||||||
          symbol = Symbol(it),
 | 
					          symbol = Symbol(it),
 | 
				
			||||||
          multiple = false
 | 
					          multiple = false,
 | 
				
			||||||
 | 
					          typeSpec = null,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      nativeFunctionDescriptor = asNative(functionDefinition),
 | 
					      nativeFunctionDescriptor = asNative(functionDefinition),
 | 
				
			||||||
      block = null
 | 
					      block = null,
 | 
				
			||||||
 | 
					      returnType = null,
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private fun asNative(functionDefinition: JavaFunctionDefinition): NativeFunctionDescriptor =
 | 
					  private fun asNative(functionDefinition: JavaFunctionDefinition): NativeFunctionDescriptor =
 | 
				
			||||||
 | 
				
			|||||||
@ -119,6 +119,10 @@ class ExternalSymbolUsageAnalyzer : FunctionLevelVisitor<Unit>() {
 | 
				
			|||||||
    checkAndContribute(node.symbol)
 | 
					    checkAndContribute(node.symbol)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun visitTypeSpec(node: TypeSpec) {
 | 
				
			||||||
 | 
					    checkAndContribute(node.symbol)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun visitVarAssignment(node: VarAssignment) {
 | 
					  override fun visitVarAssignment(node: VarAssignment) {
 | 
				
			||||||
    internalSymbols.last().add(node.symbol)
 | 
					    internalSymbols.last().add(node.symbol)
 | 
				
			||||||
    node.value.visit(this)
 | 
					    node.value.visit(this)
 | 
				
			||||||
 | 
				
			|||||||
@ -8,7 +8,11 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
 | 
				
			|||||||
  ParserBase(source, attribution) {
 | 
					  ParserBase(source, attribution) {
 | 
				
			||||||
  override fun parseArgumentSpec(): ArgumentSpec = produce(NodeType.ArgumentSpec) {
 | 
					  override fun parseArgumentSpec(): ArgumentSpec = produce(NodeType.ArgumentSpec) {
 | 
				
			||||||
    val symbol = parseSymbol()
 | 
					    val symbol = parseSymbol()
 | 
				
			||||||
    ArgumentSpec(symbol, next(TokenType.DotDotDot))
 | 
					    var typeSpec: TypeSpec? = null
 | 
				
			||||||
 | 
					    if (next(TokenType.Colon)) {
 | 
				
			||||||
 | 
					      typeSpec = parseTypeSpec()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ArgumentSpec(symbol, typeSpec = typeSpec, next(TokenType.DotDotDot))
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseBlock(): Block = expect(NodeType.Block, TokenType.LeftCurly) {
 | 
					  override fun parseBlock(): Block = expect(NodeType.Block, TokenType.LeftCurly) {
 | 
				
			||||||
@ -213,7 +217,10 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
 | 
				
			|||||||
      parseArgumentSpec()
 | 
					      parseArgumentSpec()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    expect(TokenType.RightParentheses)
 | 
					    expect(TokenType.RightParentheses)
 | 
				
			||||||
 | 
					    var returnType: TypeSpec? = null
 | 
				
			||||||
 | 
					    if (next(TokenType.Colon)) {
 | 
				
			||||||
 | 
					      returnType = parseTypeSpec()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    var native: NativeFunctionDescriptor? = null
 | 
					    var native: NativeFunctionDescriptor? = null
 | 
				
			||||||
    var block: Block? = null
 | 
					    var block: Block? = null
 | 
				
			||||||
    if (peek(TokenType.Native)) {
 | 
					    if (peek(TokenType.Native)) {
 | 
				
			||||||
@ -221,7 +228,7 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      block = parseBlock()
 | 
					      block = parseBlock()
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    FunctionDefinition(modifiers, name, arguments, block, native)
 | 
					    FunctionDefinition(modifiers = modifiers, symbol = name, arguments = arguments, returnType = returnType, block = block, nativeFunctionDescriptor = native)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseIf(): If = expect(NodeType.If, TokenType.If) {
 | 
					  override fun parseIf(): If = expect(NodeType.If, TokenType.If) {
 | 
				
			||||||
@ -280,18 +287,26 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  override fun parseLetAssignment(): LetAssignment = expect(NodeType.LetAssignment, TokenType.Let) {
 | 
					  override fun parseLetAssignment(): LetAssignment = expect(NodeType.LetAssignment, TokenType.Let) {
 | 
				
			||||||
    val symbol = parseSymbol()
 | 
					    val symbol = parseSymbol()
 | 
				
			||||||
 | 
					    var typeSpec: TypeSpec? = null
 | 
				
			||||||
 | 
					    if (next(TokenType.Colon)) {
 | 
				
			||||||
 | 
					      typeSpec = parseTypeSpec()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    expect(TokenType.Equals)
 | 
					    expect(TokenType.Equals)
 | 
				
			||||||
    val value = parseExpression()
 | 
					    val value = parseExpression()
 | 
				
			||||||
    LetAssignment(symbol, value)
 | 
					    LetAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseLetDefinition(): LetDefinition = produce(NodeType.LetDefinition) {
 | 
					  override fun parseLetDefinition(): LetDefinition = produce(NodeType.LetDefinition) {
 | 
				
			||||||
    val definitionModifiers = parseDefinitionModifiers()
 | 
					    val definitionModifiers = parseDefinitionModifiers()
 | 
				
			||||||
    expect(TokenType.Let)
 | 
					    expect(TokenType.Let)
 | 
				
			||||||
    val name = parseSymbol()
 | 
					    val name = parseSymbol()
 | 
				
			||||||
 | 
					    var typeSpec: TypeSpec? = null
 | 
				
			||||||
 | 
					    if (next(TokenType.Colon)) {
 | 
				
			||||||
 | 
					      typeSpec = parseTypeSpec()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    expect(TokenType.Equals)
 | 
					    expect(TokenType.Equals)
 | 
				
			||||||
    val value = parseExpression()
 | 
					    val value = parseExpression()
 | 
				
			||||||
    LetDefinition(definitionModifiers, name, value)
 | 
					    LetDefinition(modifiers = definitionModifiers, symbol = name, typeSpec = typeSpec, value = value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseListLiteral(): ListLiteral = expect(NodeType.ListLiteral, TokenType.LeftBracket) {
 | 
					  override fun parseListLiteral(): ListLiteral = expect(NodeType.ListLiteral, TokenType.LeftBracket) {
 | 
				
			||||||
@ -375,11 +390,19 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
 | 
				
			|||||||
    SymbolReference(parseSymbol())
 | 
					    SymbolReference(parseSymbol())
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun parseTypeSpec(): TypeSpec = produce(NodeType.TypeSpec) {
 | 
				
			||||||
 | 
					    TypeSpec(parseSymbol())
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseVarAssignment(): VarAssignment = expect(NodeType.VarAssignment, TokenType.Var) {
 | 
					  override fun parseVarAssignment(): VarAssignment = expect(NodeType.VarAssignment, TokenType.Var) {
 | 
				
			||||||
    val symbol = parseSymbol()
 | 
					    val symbol = parseSymbol()
 | 
				
			||||||
 | 
					    var typeSpec: TypeSpec? = null
 | 
				
			||||||
 | 
					    if (next(TokenType.Colon)) {
 | 
				
			||||||
 | 
					      typeSpec = parseTypeSpec()
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    expect(TokenType.Equals)
 | 
					    expect(TokenType.Equals)
 | 
				
			||||||
    val value = parseExpression()
 | 
					    val value = parseExpression()
 | 
				
			||||||
    VarAssignment(symbol, value)
 | 
					    VarAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun parseWhile(): While = expect(NodeType.While, TokenType.While) {
 | 
					  override fun parseWhile(): While = expect(NodeType.While, TokenType.While) {
 | 
				
			||||||
 | 
				
			|||||||
@ -113,6 +113,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
 | 
				
			|||||||
  override fun visitLetAssignment(node: LetAssignment) {
 | 
					  override fun visitLetAssignment(node: LetAssignment) {
 | 
				
			||||||
    append("let ")
 | 
					    append("let ")
 | 
				
			||||||
    visit(node.symbol)
 | 
					    visit(node.symbol)
 | 
				
			||||||
 | 
					    if (node.typeSpec != null) {
 | 
				
			||||||
 | 
					      append(": ")
 | 
				
			||||||
 | 
					      visit(node.typeSpec!!)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    append(" = ")
 | 
					    append(" = ")
 | 
				
			||||||
    visit(node.value)
 | 
					    visit(node.value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -121,6 +125,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
 | 
				
			|||||||
    visitDefinitionModifiers(node.modifiers)
 | 
					    visitDefinitionModifiers(node.modifiers)
 | 
				
			||||||
    append("let ")
 | 
					    append("let ")
 | 
				
			||||||
    visit(node.symbol)
 | 
					    visit(node.symbol)
 | 
				
			||||||
 | 
					    if (node.typeSpec != null) {
 | 
				
			||||||
 | 
					      append(": ")
 | 
				
			||||||
 | 
					      visit(node.typeSpec!!)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    append(" = ")
 | 
					    append(" = ")
 | 
				
			||||||
    visit(node.value)
 | 
					    visit(node.value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -129,9 +137,17 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
 | 
				
			|||||||
    visit(node.symbol)
 | 
					    visit(node.symbol)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun visitTypeSpec(node: TypeSpec) {
 | 
				
			||||||
 | 
					    visit(node.symbol)
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  override fun visitVarAssignment(node: VarAssignment) {
 | 
					  override fun visitVarAssignment(node: VarAssignment) {
 | 
				
			||||||
    append("var ")
 | 
					    append("var ")
 | 
				
			||||||
    visit(node.symbol)
 | 
					    visit(node.symbol)
 | 
				
			||||||
 | 
					    if (node.typeSpec != null) {
 | 
				
			||||||
 | 
					      append(": ")
 | 
				
			||||||
 | 
					      visit(node.typeSpec!!)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    append(" = ")
 | 
					    append(" = ")
 | 
				
			||||||
    visit(node.value)
 | 
					    visit(node.value)
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -209,6 +225,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    append(") ")
 | 
					    append(") ")
 | 
				
			||||||
 | 
					    if (node.returnType != null) {
 | 
				
			||||||
 | 
					      append(": ")
 | 
				
			||||||
 | 
					      visit(node.returnType!!)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    if (node.block != null) {
 | 
					    if (node.block != null) {
 | 
				
			||||||
      visit(node.block!!)
 | 
					      visit(node.block!!)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -11,6 +11,7 @@ object PorkElementFactory {
 | 
				
			|||||||
  fun create(node: ASTNode): PsiElement =
 | 
					  fun create(node: ASTNode): PsiElement =
 | 
				
			||||||
    when (PorkElementTypes.nodeTypeFor(node.elementType)) {
 | 
					    when (PorkElementTypes.nodeTypeFor(node.elementType)) {
 | 
				
			||||||
      NodeType.Symbol -> SymbolElement(node)
 | 
					      NodeType.Symbol -> SymbolElement(node)
 | 
				
			||||||
 | 
					      NodeType.TypeSpec -> TypeSpecElement(node)
 | 
				
			||||||
      NodeType.Block -> BlockElement(node)
 | 
					      NodeType.Block -> BlockElement(node)
 | 
				
			||||||
      NodeType.CompilationUnit -> CompilationUnitElement(node)
 | 
					      NodeType.CompilationUnit -> CompilationUnitElement(node)
 | 
				
			||||||
      NodeType.LetAssignment -> LetAssignmentElement(node)
 | 
					      NodeType.LetAssignment -> LetAssignmentElement(node)
 | 
				
			||||||
 | 
				
			|||||||
@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					// GENERATED CODE FROM PORK AST CODEGEN
 | 
				
			||||||
 | 
					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 TypeSpecElement(node: ASTNode) : PorkElement(node) {
 | 
				
			||||||
 | 
					  override fun getIcon(flags: Int): Icon? =
 | 
				
			||||||
 | 
					    PorkElementHelpers.iconOf(this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  override fun getPresentation(): ItemPresentation? =
 | 
				
			||||||
 | 
					    PorkElementHelpers.presentationOf(this)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -50,6 +50,7 @@ enum class TokenType(vararg val properties: TokenTypeProperty) {
 | 
				
			|||||||
  Mod(ManyChars("mod"), KeywordFamily),
 | 
					  Mod(ManyChars("mod"), KeywordFamily),
 | 
				
			||||||
  Rem(ManyChars("rem"), KeywordFamily),
 | 
					  Rem(ManyChars("rem"), KeywordFamily),
 | 
				
			||||||
  Comma(SingleChar(',')),
 | 
					  Comma(SingleChar(',')),
 | 
				
			||||||
 | 
					  Colon(SingleChar(':')),
 | 
				
			||||||
  DotDotDot(ManyChars("...")),
 | 
					  DotDotDot(ManyChars("...")),
 | 
				
			||||||
  DotDot(ManyChars(".."), Promotion('.', DotDotDot)),
 | 
					  DotDot(ManyChars(".."), Promotion('.', DotDotDot)),
 | 
				
			||||||
  Dot(SingleChar('.'), Promotion('.', DotDot)),
 | 
					  Dot(SingleChar('.'), Promotion('.', DotDot)),
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user