56 lines
971 B
Go
56 lines
971 B
Go
package core
|
|
|
|
import (
|
|
"git.akyoto.dev/cli/q/src/ast"
|
|
)
|
|
|
|
// CompileASTNode compiles a node in the AST.
|
|
func (f *Function) CompileASTNode(node ast.Node) error {
|
|
switch node := node.(type) {
|
|
case *ast.Assert:
|
|
f.Fold(node.Condition)
|
|
return f.CompileAssert(node)
|
|
|
|
case *ast.Assign:
|
|
f.Fold(node.Expression)
|
|
return f.CompileAssign(node)
|
|
|
|
case *ast.Call:
|
|
f.Fold(node.Expression)
|
|
_, err := f.CompileCall(node.Expression)
|
|
return err
|
|
|
|
case *ast.Define:
|
|
f.Fold(node.Expression)
|
|
return f.CompileDefinition(node)
|
|
|
|
case *ast.If:
|
|
f.Fold(node.Condition)
|
|
return f.CompileIf(node)
|
|
|
|
case *ast.For:
|
|
f.Fold(node.Head)
|
|
return f.CompileFor(node)
|
|
|
|
case *ast.Loop:
|
|
return f.CompileLoop(node)
|
|
|
|
case *ast.Return:
|
|
for _, value := range node.Values {
|
|
f.Fold(value)
|
|
}
|
|
|
|
return f.CompileReturn(node)
|
|
|
|
case *ast.Switch:
|
|
for _, c := range node.Cases {
|
|
f.Fold(c.Condition)
|
|
}
|
|
|
|
return f.CompileSwitch(node)
|
|
|
|
default:
|
|
panic("unknown AST type")
|
|
}
|
|
}
|