cgen: $action (ComptimeCall); vweb: hello world works!
parent
0a3486b4c5
commit
7815c5b108
|
@ -27,7 +27,8 @@ pub fn (mut app App) json_endpoint() {
|
||||||
|
|
||||||
pub fn (mut app App) index() {
|
pub fn (mut app App) index() {
|
||||||
app.cnt++
|
app.cnt++
|
||||||
$vweb.html()
|
app.vweb.text('Hello world from vweb')
|
||||||
|
//$vweb.html()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn (mut app App) reset() {
|
pub fn (mut app App) reset() {
|
||||||
|
|
|
@ -778,8 +778,11 @@ pub mut:
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ComptimeCall {
|
pub struct ComptimeCall {
|
||||||
name string
|
pub:
|
||||||
left Expr
|
method_name string
|
||||||
|
left Expr
|
||||||
|
pub mut:
|
||||||
|
sym table.TypeSymbol
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct None {
|
pub struct None {
|
||||||
|
|
|
@ -1258,10 +1258,11 @@ pub fn (mut c Checker) return_stmt(mut return_stmt ast.Return) {
|
||||||
}
|
}
|
||||||
for i, exp_type in expected_types {
|
for i, exp_type in expected_types {
|
||||||
got_typ := c.unwrap_generic(got_types[i])
|
got_typ := c.unwrap_generic(got_types[i])
|
||||||
if got_typ.has_flag(.optional) &&
|
if got_typ.has_flag(.optional) && (!exp_type.has_flag(.optional) || c.table.type_to_str(got_typ) !=
|
||||||
(!exp_type.has_flag(.optional) || c.table.type_to_str(got_typ) != c.table.type_to_str(exp_type)) {
|
c.table.type_to_str(exp_type)) {
|
||||||
pos := return_stmt.exprs[i].position()
|
pos := return_stmt.exprs[i].position()
|
||||||
c.error('cannot use `${c.table.type_to_str(got_typ)}` as type `${c.table.type_to_str(exp_type)}` in return argument', pos)
|
c.error('cannot use `${c.table.type_to_str(got_typ)}` as type `${c.table.type_to_str(exp_type)}` in return argument',
|
||||||
|
pos)
|
||||||
}
|
}
|
||||||
if !c.check_types(got_typ, exp_type) {
|
if !c.check_types(got_typ, exp_type) {
|
||||||
got_typ_sym := c.table.get_type_symbol(got_typ)
|
got_typ_sym := c.table.get_type_symbol(got_typ)
|
||||||
|
@ -1825,6 +1826,10 @@ pub fn (mut c Checker) expr(node ast.Expr) table.Type {
|
||||||
ast.CharLiteral {
|
ast.CharLiteral {
|
||||||
return table.byte_type
|
return table.byte_type
|
||||||
}
|
}
|
||||||
|
ast.ComptimeCall {
|
||||||
|
it.sym = c.table.get_type_symbol(c.unwrap_generic(c.expr(it.left)))
|
||||||
|
return table.void_type
|
||||||
|
}
|
||||||
ast.ConcatExpr {
|
ast.ConcatExpr {
|
||||||
return c.concat_expr(mut it)
|
return c.concat_expr(mut it)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1430,7 +1430,7 @@ fn (mut g Gen) expr(node ast.Expr) {
|
||||||
g.write("'$it.val'")
|
g.write("'$it.val'")
|
||||||
}
|
}
|
||||||
ast.ComptimeCall {
|
ast.ComptimeCall {
|
||||||
g.write('/*c*/')
|
g.comptime_call(it)
|
||||||
}
|
}
|
||||||
ast.ConcatExpr {
|
ast.ConcatExpr {
|
||||||
g.concat_expr(it)
|
g.concat_expr(it)
|
||||||
|
@ -4336,7 +4336,7 @@ fn (mut g Gen) array_init(it ast.ArrayInit) {
|
||||||
|
|
||||||
// `ui.foo(button)` =>
|
// `ui.foo(button)` =>
|
||||||
// `ui__foo(I_ui__Button_to_ui__Widget(` ...
|
// `ui__foo(I_ui__Button_to_ui__Widget(` ...
|
||||||
fn (g &Gen) interface_call(typ, interface_type table.Type) {
|
fn (mut g Gen) interface_call(typ, interface_type table.Type) {
|
||||||
interface_styp := g.cc_type(interface_type)
|
interface_styp := g.cc_type(interface_type)
|
||||||
styp := g.cc_type(typ)
|
styp := g.cc_type(typ)
|
||||||
mut cast_fn_name := 'I_${styp}_to_Interface_${interface_styp}'
|
mut cast_fn_name := 'I_${styp}_to_Interface_${interface_styp}'
|
||||||
|
@ -4349,6 +4349,29 @@ fn (g &Gen) interface_call(typ, interface_type table.Type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn (g &Gen) comptime_call(node ast.ComptimeCall) {
|
||||||
|
g.writeln('// $' + 'method call. sym="$node.sym.name"')
|
||||||
|
mut j := 0
|
||||||
|
for method in node.sym.methods {
|
||||||
|
if method.return_type != table.void_type {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// receiver := method.args[0]
|
||||||
|
// if !p.expr_var.ptr {
|
||||||
|
// p.error('`$p.expr_var.name` needs to be a reference')
|
||||||
|
// }
|
||||||
|
amp := '' // if receiver.is_mut && !p.expr_var.ptr { '&' } else { '' }
|
||||||
|
if j > 0 {
|
||||||
|
g.write(' else ')
|
||||||
|
}
|
||||||
|
g.write('if (string_eq($node.method_name, tos_lit("$method.name"))) ')
|
||||||
|
g.write('${node.sym.name}_$method.name ($amp ')
|
||||||
|
g.expr(node.left)
|
||||||
|
g.writeln(');')
|
||||||
|
j++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn (mut g Gen) panic_debug_info(pos token.Position) (int, string, string, string) {
|
fn (mut g Gen) panic_debug_info(pos token.Position) (int, string, string, string) {
|
||||||
paline := pos.line_nr + 1
|
paline := pos.line_nr + 1
|
||||||
pafile := g.fn_decl.file.replace('\\', '/')
|
pafile := g.fn_decl.file.replace('\\', '/')
|
||||||
|
|
|
@ -14,13 +14,13 @@ const (
|
||||||
'netbsd', 'dragonfly', 'android', 'js', 'solaris', 'haiku', 'linux_or_macos']
|
'netbsd', 'dragonfly', 'android', 'js', 'solaris', 'haiku', 'linux_or_macos']
|
||||||
)
|
)
|
||||||
|
|
||||||
fn (mut p Parser)resolve_vroot(flag string) string {
|
fn (mut p Parser) resolve_vroot(flag string) string {
|
||||||
mcache := vmod.get_cache()
|
mcache := vmod.get_cache()
|
||||||
vmod_file_location := mcache.get_by_folder(p.file_name_dir)
|
vmod_file_location := mcache.get_by_folder(p.file_name_dir)
|
||||||
if vmod_file_location.vmod_file.len == 0 {
|
if vmod_file_location.vmod_file.len == 0 {
|
||||||
// There was no actual v.mod file found.
|
// There was no actual v.mod file found.
|
||||||
p.error('To use @VROOT, you need' + ' to have a "v.mod" file in ${p.file_name_dir},' +
|
p.error('To use @VROOT, you need' + ' to have a "v.mod" file in ${p.file_name_dir},' +
|
||||||
' or in one of its parent folders.')
|
' or in one of its parent folders.')
|
||||||
}
|
}
|
||||||
vmod_path := vmod_file_location.vmod_folder
|
vmod_path := vmod_file_location.vmod_folder
|
||||||
return flag.replace('@VROOT', os.real_path(vmod_path))
|
return flag.replace('@VROOT', os.real_path(vmod_path))
|
||||||
|
@ -220,7 +220,6 @@ fn os_from_string(os string) pref.OS {
|
||||||
fn (mut p Parser) comptime_method_call(left ast.Expr) ast.ComptimeCall {
|
fn (mut p Parser) comptime_method_call(left ast.Expr) ast.ComptimeCall {
|
||||||
p.check(.dollar)
|
p.check(.dollar)
|
||||||
method_name := p.check_name()
|
method_name := p.check_name()
|
||||||
_ = method_name
|
|
||||||
/*
|
/*
|
||||||
mut j := 0
|
mut j := 0
|
||||||
sym := p.table.get_type_symbol(typ)
|
sym := p.table.get_type_symbol(typ)
|
||||||
|
@ -256,6 +255,6 @@ fn (mut p Parser) comptime_method_call(left ast.Expr) ast.ComptimeCall {
|
||||||
}
|
}
|
||||||
return ast.ComptimeCall{
|
return ast.ComptimeCall{
|
||||||
left: left
|
left: left
|
||||||
name: method_name
|
method_name: method_name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -283,9 +283,9 @@ fn handle_conn<T>(conn net.Socket, mut app T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Call the right action
|
// Call the right action
|
||||||
$if debug {
|
//$if debug {
|
||||||
println('action=$action')
|
println('action=$action')
|
||||||
}
|
//}
|
||||||
app.$action()
|
app.$action()
|
||||||
/*
|
/*
|
||||||
app.$action() or {
|
app.$action() or {
|
||||||
|
|
Loading…
Reference in New Issue