ast: TypeOf
parent
79077b0025
commit
b290efa394
|
@ -14,7 +14,7 @@ pub type Expr = InfixExpr | IfExpr | StringLiteral | IntegerLiteral | CharLitera
|
|||
FloatLiteral | Ident | CallExpr | BoolLiteral | StructInit | ArrayInit | SelectorExpr | PostfixExpr |
|
||||
AssignExpr | PrefixExpr | MethodCallExpr | IndexExpr | RangeExpr | MatchExpr |
|
||||
CastExpr | EnumVal | Assoc | SizeOf | None | MapInit | IfGuardExpr | ParExpr | OrExpr |
|
||||
ConcatExpr | Type | AsCast
|
||||
ConcatExpr | Type | AsCast | TypeOf
|
||||
|
||||
pub type Stmt = GlobalDecl | FnDecl | Return | Module | Import | ExprStmt |
|
||||
ForStmt | StructDecl | ForCStmt | ForInStmt | CompIf | ConstDecl | Attr | BranchStmt |
|
||||
|
@ -608,6 +608,11 @@ pub:
|
|||
type_name string
|
||||
}
|
||||
|
||||
pub struct TypeOf {
|
||||
pub:
|
||||
expr Expr
|
||||
}
|
||||
|
||||
pub struct LineComment {
|
||||
pub:
|
||||
text string
|
||||
|
|
|
@ -741,6 +741,9 @@ pub fn (c mut Checker) expr(node ast.Expr) table.Type {
|
|||
ast.Type {
|
||||
return it.typ
|
||||
}
|
||||
ast.TypeOf {
|
||||
return table.string_type
|
||||
}
|
||||
/*
|
||||
ast.UnaryExpr {
|
||||
c.expr(it.left)
|
||||
|
|
|
@ -887,6 +887,9 @@ fn (g mut Gen) expr(node ast.Expr) {
|
|||
g.write('_type_idx_')
|
||||
g.write(g.typ(it.typ))
|
||||
}
|
||||
ast.TypeOf {
|
||||
g.write('tos3("TYPEOF_TODO")')
|
||||
}
|
||||
else {
|
||||
// #printf("node=%d\n", node.typ);
|
||||
println(term.red('cgen.expr(): bad node ' + typeof(node)))
|
||||
|
|
|
@ -58,11 +58,10 @@ fn (g mut JsGen) stmt(node ast.Stmt) {
|
|||
g.writeln(';')
|
||||
}
|
||||
ast.AssignStmt {
|
||||
if it.left.len > it.right.len {
|
||||
// TODO: multi return
|
||||
}
|
||||
if it.left.len > it.right.len {}
|
||||
// TODO: multi return
|
||||
else {
|
||||
for i,ident in it.left {
|
||||
for i, ident in it.left {
|
||||
var_info := ident.var_info()
|
||||
var_type_sym := g.table.get_type_symbol(var_info.typ)
|
||||
val := it.right[i]
|
||||
|
@ -90,6 +89,8 @@ fn (g mut JsGen) stmt(node ast.Stmt) {
|
|||
}
|
||||
ast.ExprStmt {
|
||||
g.expr(it.expr)
|
||||
}
|
||||
/*
|
||||
match it.expr {
|
||||
// no ; after an if expression
|
||||
ast.IfExpr {}
|
||||
|
@ -97,7 +98,8 @@ fn (g mut JsGen) stmt(node ast.Stmt) {
|
|||
g.writeln(';')
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
else {
|
||||
verror('jsgen.stmt(): bad node')
|
||||
}
|
||||
|
|
|
@ -765,6 +765,15 @@ pub fn (p mut Parser) expr(precedence int) ast.Expr {
|
|||
|
||||
}
|
||||
}
|
||||
.key_typeof {
|
||||
p.next()
|
||||
p.check(.lpar)
|
||||
expr := p.expr(0)
|
||||
p.check(.rpar)
|
||||
node = ast.TypeOf{
|
||||
expr: expr
|
||||
}
|
||||
}
|
||||
// Map `{"age": 20}` or `{ x | foo:bar, a:10 }`
|
||||
.lcbr {
|
||||
p.next()
|
||||
|
|
|
@ -114,7 +114,7 @@ pub enum Kind {
|
|||
key_switch
|
||||
key_true
|
||||
key_type
|
||||
// typeof
|
||||
key_typeof
|
||||
key_orelse
|
||||
key_union
|
||||
key_pub
|
||||
|
@ -229,7 +229,7 @@ fn build_token_str() []string {
|
|||
s[Kind.key_import] = 'import'
|
||||
s[Kind.key_embed] = 'embed'
|
||||
s[Kind.key_unsafe] = 'unsafe'
|
||||
// Kinds[key_typeof] = 'typeof'
|
||||
s[Kind.key_typeof] = 'typeof'
|
||||
s[Kind.key_enum] = 'enum'
|
||||
s[Kind.key_interface] = 'interface'
|
||||
s[Kind.key_pub] = 'pub'
|
||||
|
|
Loading…
Reference in New Issue