js: fix optional error propagation (#12283)
							parent
							
								
									c340906280
								
							
						
					
					
						commit
						2eae4cf63e
					
				|  | @ -248,7 +248,7 @@ fn (mut g JsGen) method_call(node ast.CallExpr) { | |||
| 				g.stmt(it.or_block.stmts.last()) | ||||
| 			} | ||||
| 			.propagate { | ||||
| 				panicstr := '`optional not set (\${err.val.msg})`' | ||||
| 				panicstr := '`optional not set (\${err.valueOf().msg})`' | ||||
| 				if g.file.mod.name == 'main' && g.fn_decl.name == 'main.main' { | ||||
| 					g.writeln('return builtin__panic($panicstr)') | ||||
| 				} else { | ||||
|  | @ -340,7 +340,7 @@ fn (mut g JsGen) gen_call_expr(it ast.CallExpr) { | |||
| 				g.stmt(it.or_block.stmts.last()) | ||||
| 			} | ||||
| 			.propagate { | ||||
| 				panicstr := '`optional not set (\${err.val.msg})`' | ||||
| 				panicstr := '`optional not set (\${err.valueOf().msg})`' | ||||
| 				if g.file.mod.name == 'main' && g.fn_decl.name == 'main.main' { | ||||
| 					g.writeln('return builtin__panic($panicstr)') | ||||
| 				} else { | ||||
|  |  | |||
|  | @ -17,7 +17,7 @@ const ( | |||
| 		'if', 'implements', 'import', 'in', 'instanceof', 'interface', 'let', 'new', 'package', | ||||
| 		'private', 'protected', 'public', 'return', 'static', 'super', 'switch', 'this', 'throw', | ||||
| 		'try', 'typeof', 'var', 'void', 'while', 'with', 'yield', 'Number', 'String', 'Boolean', | ||||
| 		'Array', 'Map'] | ||||
| 		'Array', 'Map', 'document'] | ||||
| 	// used to generate type structs
 | ||||
| 	v_types            = ['i8', 'i16', 'int', 'i64', 'byte', 'u16', 'u32', 'u64', 'f32', 'f64', | ||||
| 		'int_literal', 'float_literal', 'bool', 'string', 'map', 'array', 'rune', 'any'] | ||||
|  | @ -1549,6 +1549,9 @@ fn (mut g JsGen) cc_type(typ ast.Type, is_prefix_struct bool) string { | |||
| 		} | ||||
| 		else {} | ||||
| 	} | ||||
| 	if styp.starts_with('JS__') { | ||||
| 		styp = styp[4..] | ||||
| 	} | ||||
| 	return styp | ||||
| } | ||||
| 
 | ||||
|  | @ -1745,6 +1748,7 @@ fn (mut g JsGen) gen_return_stmt(it ast.Return) { | |||
| 		g.write('const $tmp = new ') | ||||
| 
 | ||||
| 		g.writeln('Option({});') | ||||
| 		g.write('${tmp}.state = new byte(0);') | ||||
| 		g.write('${tmp}.data = ') | ||||
| 		if it.exprs.len == 1 { | ||||
| 			g.expr(it.exprs[0]) | ||||
|  | @ -1781,11 +1785,21 @@ fn (mut g JsGen) gen_struct_decl(node ast.StructDecl) { | |||
| 	g.doc.gen_fac_fn(node.fields) | ||||
| 	g.write('function ${js_name}({ ') | ||||
| 	for i, field in node.fields { | ||||
| 		g.write('$field.name = ') | ||||
| 		if field.has_default_expr { | ||||
| 			g.expr(field.default_expr) | ||||
| 		} else { | ||||
| 			g.write('${g.to_js_typ_val(field.typ)}') | ||||
| 		g.write('$field.name') | ||||
| 		mut keep := true | ||||
| 		for attr in field.attrs { | ||||
| 			if attr.name == 'noinit' { | ||||
| 				keep = false | ||||
| 			} | ||||
| 		} | ||||
| 		if keep { | ||||
| 			g.write(' = ') | ||||
| 
 | ||||
| 			if field.has_default_expr { | ||||
| 				g.expr(field.default_expr) | ||||
| 			} else { | ||||
| 				g.write('${g.to_js_typ_val(field.typ)}') | ||||
| 			} | ||||
| 		} | ||||
| 		if i < node.fields.len - 1 { | ||||
| 			g.write(', ') | ||||
|  | @ -1802,7 +1816,7 @@ fn (mut g JsGen) gen_struct_decl(node ast.StructDecl) { | |||
| 	g.inc_indent() | ||||
| 	for embed in node.embeds { | ||||
| 		etyp := g.typ(embed.typ) | ||||
| 		g.writeln('...${etyp}.prototype,') | ||||
| 		g.writeln('...${g.js_name(etyp)}.prototype,') | ||||
| 	} | ||||
| 	fns := g.method_fn_decls[name] | ||||
| 	// gen toString method
 | ||||
|  | @ -1829,8 +1843,16 @@ fn (mut g JsGen) gen_struct_decl(node ast.StructDecl) { | |||
| 	for field in node.fields { | ||||
| 		typ := g.typ(field.typ) | ||||
| 		g.doc.gen_typ(typ) | ||||
| 		g.write('$field.name: ${g.to_js_typ_val(field.typ)}') | ||||
| 		g.writeln(',') | ||||
| 		mut keep := true | ||||
| 		for attr in field.attrs { | ||||
| 			if attr.name == 'noinit' { | ||||
| 				keep = false | ||||
| 			} | ||||
| 		} | ||||
| 		if keep { | ||||
| 			g.write('$field.name: ${g.to_js_typ_val(field.typ)}') | ||||
| 			g.writeln(',') | ||||
| 		} | ||||
| 	} | ||||
| 	g.writeln('\$toJS() { return this; }') | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue