cgen: fix returning optional consts; fix csv test
parent
3abbdd4a39
commit
7a218286b3
|
@ -16,7 +16,6 @@ const (
|
||||||
'vlib/crypto/rc4/rc4_test.v',
|
'vlib/crypto/rc4/rc4_test.v',
|
||||||
'vlib/encoding/base64/base64_memory_test.v',
|
'vlib/encoding/base64/base64_memory_test.v',
|
||||||
'vlib/encoding/base64/base64_test.v',
|
'vlib/encoding/base64/base64_test.v',
|
||||||
'vlib/encoding/csv/csv_test.v',
|
|
||||||
'vlib/encoding/utf8/utf8_util_test.v',
|
'vlib/encoding/utf8/utf8_util_test.v',
|
||||||
'vlib/eventbus/eventbus_test.v',
|
'vlib/eventbus/eventbus_test.v',
|
||||||
'vlib/flag/flag_test.v',
|
'vlib/flag/flag_test.v',
|
||||||
|
|
|
@ -112,10 +112,12 @@ fn (r mut Reader) read_record() ?[]string {
|
||||||
for {
|
for {
|
||||||
// not quoted
|
// not quoted
|
||||||
if line[0] != `"` {
|
if line[0] != `"` {
|
||||||
i = line.index(r.delimiter.str()) or {
|
// QTODO i = ...
|
||||||
|
j := line.index(r.delimiter.str()) or {
|
||||||
// last
|
// last
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
i = j
|
||||||
fields << line[..i]
|
fields << line[..i]
|
||||||
line = line[i+1..]
|
line = line[i+1..]
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -1793,7 +1793,7 @@ fn (g mut Gen) return_statement(node ast.Return) {
|
||||||
typ_sym := g.table.get_type_symbol(g.fn_decl.return_type)
|
typ_sym := g.table.get_type_symbol(g.fn_decl.return_type)
|
||||||
mr_info := typ_sym.info as table.MultiReturn
|
mr_info := typ_sym.info as table.MultiReturn
|
||||||
mut styp := g.typ(g.fn_decl.return_type)
|
mut styp := g.typ(g.fn_decl.return_type)
|
||||||
if fn_return_is_optional {
|
if fn_return_is_optional { // && !table.type_is(node.types[0], .optional) && node.types[0] !=
|
||||||
styp = styp[7..] // remove 'Option_'
|
styp = styp[7..] // remove 'Option_'
|
||||||
g.write('opt_ok(& ($styp []) { ')
|
g.write('opt_ok(& ($styp []) { ')
|
||||||
}
|
}
|
||||||
|
@ -1812,8 +1812,10 @@ fn (g mut Gen) return_statement(node ast.Return) {
|
||||||
} else if node.exprs.len == 1 {
|
} else if node.exprs.len == 1 {
|
||||||
// normal return
|
// normal return
|
||||||
g.write(' ')
|
g.write(' ')
|
||||||
|
return_sym := g.table.get_type_symbol(node.types[0])
|
||||||
// `return opt_ok(expr)` for functions that expect an optional
|
// `return opt_ok(expr)` for functions that expect an optional
|
||||||
if fn_return_is_optional && !table.type_is(node.types[0], .optional) {
|
if fn_return_is_optional && !table.type_is(node.types[0], .optional) && return_sym.name !=
|
||||||
|
'Option' {
|
||||||
mut is_none := false
|
mut is_none := false
|
||||||
mut is_error := false
|
mut is_error := false
|
||||||
expr0 := node.exprs[0]
|
expr0 := node.exprs[0]
|
||||||
|
@ -1831,7 +1833,7 @@ fn (g mut Gen) return_statement(node ast.Return) {
|
||||||
}
|
}
|
||||||
if !is_none && !is_error {
|
if !is_none && !is_error {
|
||||||
styp := g.typ(g.fn_decl.return_type)[7..] // remove 'Option_'
|
styp := g.typ(g.fn_decl.return_type)[7..] // remove 'Option_'
|
||||||
g.write('opt_ok(& ($styp []) { ')
|
g.write('/*:)$return_sym.name*/opt_ok(&($styp []) { ')
|
||||||
g.expr(node.exprs[0])
|
g.expr(node.exprs[0])
|
||||||
g.writeln(' }, sizeof($styp));')
|
g.writeln(' }, sizeof($styp));')
|
||||||
return
|
return
|
||||||
|
@ -2268,12 +2270,17 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
verror('only V strings can be formatted with a ${sfmt} format')
|
verror('only V strings can be formatted with a ${sfmt} format')
|
||||||
}
|
}
|
||||||
g.write('%' + sfmt[1..])
|
g.write('%' + sfmt[1..])
|
||||||
} else if node.expr_types[i] in [table.string_type, table.bool_type] || sym.kind == .enum_ {
|
} else if node.expr_types[i] in [table.string_type, table.bool_type] || sym.kind ==
|
||||||
|
.enum_ {
|
||||||
g.write('%.*s')
|
g.write('%.*s')
|
||||||
} else {
|
} else {
|
||||||
match node.exprs[i] {
|
match node.exprs[i] {
|
||||||
ast.EnumVal { g.write('%.*s') }
|
ast.EnumVal {
|
||||||
else { g.write('%d') }
|
g.write('%.*s')
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
g.write('%d')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2304,9 +2311,15 @@ fn (g mut Gen) string_inter_literal(node ast.StringInterLiteral) {
|
||||||
sym := g.table.get_type_symbol(node.expr_types[i])
|
sym := g.table.get_type_symbol(node.expr_types[i])
|
||||||
if sym.kind == .enum_ {
|
if sym.kind == .enum_ {
|
||||||
is_var := match node.exprs[i] {
|
is_var := match node.exprs[i] {
|
||||||
ast.SelectorExpr { true }
|
ast.SelectorExpr {
|
||||||
ast.Ident { true }
|
true
|
||||||
else { false }
|
}
|
||||||
|
ast.Ident {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if is_var {
|
if is_var {
|
||||||
styp := g.typ(node.expr_types[i])
|
styp := g.typ(node.expr_types[i])
|
||||||
|
@ -2504,13 +2517,27 @@ fn (g mut Gen) fn_call(node ast.CallExpr) {
|
||||||
} else if sym.kind == .enum_ {
|
} else if sym.kind == .enum_ {
|
||||||
expr := node.args[0].expr
|
expr := node.args[0].expr
|
||||||
is_var := match expr {
|
is_var := match expr {
|
||||||
ast.SelectorExpr { true }
|
ast.SelectorExpr {
|
||||||
ast.Ident { true }
|
true
|
||||||
else { false }
|
|
||||||
}
|
}
|
||||||
g.write(if is_var { '${print_method}(${styp}_str(' } else { '${print_method}(tos3("' })
|
ast.Ident {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
g.write(if is_var {
|
||||||
|
'${print_method}(${styp}_str('
|
||||||
|
} else {
|
||||||
|
'${print_method}(tos3("'
|
||||||
|
})
|
||||||
g.enum_expr(expr)
|
g.enum_expr(expr)
|
||||||
g.write(if is_var { '))' } else { '"))' })
|
g.write(if is_var {
|
||||||
|
'))'
|
||||||
|
} else {
|
||||||
|
'"))'
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
// `println(int_str(10))`
|
// `println(int_str(10))`
|
||||||
// sym := g.table.get_type_symbol(node.args[0].typ)
|
// sym := g.table.get_type_symbol(node.args[0].typ)
|
||||||
|
|
|
@ -299,8 +299,8 @@ pub enum Precedence {
|
||||||
assign // =
|
assign // =
|
||||||
eq // == or !=
|
eq // == or !=
|
||||||
// less_greater // > or <
|
// less_greater // > or <
|
||||||
sum // + or -
|
sum // + - | ^
|
||||||
product // * or /
|
product // * / << >> &
|
||||||
// mod // %
|
// mod // %
|
||||||
prefix // -X or !X
|
prefix // -X or !X
|
||||||
postfix // ++ or --
|
postfix // ++ or --
|
||||||
|
|
Loading…
Reference in New Issue