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