implement basic type annotations (not yet used or declarable)

This commit is contained in:
Alex Zenla
2025-07-20 00:52:24 -07:00
parent a48fac4581
commit 5ac70d800e
25 changed files with 161 additions and 28 deletions

View File

@ -8,7 +8,11 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
ParserBase(source, attribution) {
override fun parseArgumentSpec(): ArgumentSpec = produce(NodeType.ArgumentSpec) {
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) {
@ -213,7 +217,10 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
parseArgumentSpec()
}
expect(TokenType.RightParentheses)
var returnType: TypeSpec? = null
if (next(TokenType.Colon)) {
returnType = parseTypeSpec()
}
var native: NativeFunctionDescriptor? = null
var block: Block? = null
if (peek(TokenType.Native)) {
@ -221,7 +228,7 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
} else {
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) {
@ -280,18 +287,26 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
override fun parseLetAssignment(): LetAssignment = expect(NodeType.LetAssignment, TokenType.Let) {
val symbol = parseSymbol()
var typeSpec: TypeSpec? = null
if (next(TokenType.Colon)) {
typeSpec = parseTypeSpec()
}
expect(TokenType.Equals)
val value = parseExpression()
LetAssignment(symbol, value)
LetAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
}
override fun parseLetDefinition(): LetDefinition = produce(NodeType.LetDefinition) {
val definitionModifiers = parseDefinitionModifiers()
expect(TokenType.Let)
val name = parseSymbol()
var typeSpec: TypeSpec? = null
if (next(TokenType.Colon)) {
typeSpec = parseTypeSpec()
}
expect(TokenType.Equals)
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) {
@ -375,11 +390,19 @@ class Parser(source: TokenSource, attribution: NodeAttribution) :
SymbolReference(parseSymbol())
}
override fun parseTypeSpec(): TypeSpec = produce(NodeType.TypeSpec) {
TypeSpec(parseSymbol())
}
override fun parseVarAssignment(): VarAssignment = expect(NodeType.VarAssignment, TokenType.Var) {
val symbol = parseSymbol()
var typeSpec: TypeSpec? = null
if (next(TokenType.Colon)) {
typeSpec = parseTypeSpec()
}
expect(TokenType.Equals)
val value = parseExpression()
VarAssignment(symbol, value)
VarAssignment(symbol = symbol, typeSpec = typeSpec, value = value)
}
override fun parseWhile(): While = expect(NodeType.While, TokenType.While) {

View File

@ -113,6 +113,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
override fun visitLetAssignment(node: LetAssignment) {
append("let ")
visit(node.symbol)
if (node.typeSpec != null) {
append(": ")
visit(node.typeSpec!!)
}
append(" = ")
visit(node.value)
}
@ -121,6 +125,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
visitDefinitionModifiers(node.modifiers)
append("let ")
visit(node.symbol)
if (node.typeSpec != null) {
append(": ")
visit(node.typeSpec!!)
}
append(" = ")
visit(node.value)
}
@ -129,9 +137,17 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
visit(node.symbol)
}
override fun visitTypeSpec(node: TypeSpec) {
visit(node.symbol)
}
override fun visitVarAssignment(node: VarAssignment) {
append("var ")
visit(node.symbol)
if (node.typeSpec != null) {
append(": ")
visit(node.typeSpec!!)
}
append(" = ")
visit(node.value)
}
@ -209,6 +225,10 @@ class Printer(buffer: StringBuilder) : NodeVisitor<Unit> {
}
}
append(") ")
if (node.returnType != null) {
append(": ")
visit(node.returnType!!)
}
if (node.block != null) {
visit(node.block!!)
}