checker: handle builtin enum init correctly
parent
ac469f5eff
commit
f09a5135e9
|
@ -546,6 +546,10 @@ pub fn temp_dir() string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
$if macos {
|
||||||
|
// avoid /var/folders/6j/cmsk8gd90pd.... on macs
|
||||||
|
return '/tmp'
|
||||||
|
}
|
||||||
$if android {
|
$if android {
|
||||||
// TODO test+use '/data/local/tmp' on Android before using cache_dir()
|
// TODO test+use '/data/local/tmp' on Android before using cache_dir()
|
||||||
if path == '' {
|
if path == '' {
|
||||||
|
|
|
@ -92,6 +92,7 @@ pub fn (mut db DB) close() ?bool {
|
||||||
|
|
||||||
// Only for V ORM
|
// Only for V ORM
|
||||||
fn (db DB) init_stmt(query string) &C.sqlite3_stmt {
|
fn (db DB) init_stmt(query string) &C.sqlite3_stmt {
|
||||||
|
// println('init_stmt("$query")')
|
||||||
stmt := &C.sqlite3_stmt(0)
|
stmt := &C.sqlite3_stmt(0)
|
||||||
C.sqlite3_prepare_v2(db.conn, &char(query.str), query.len, &stmt, 0)
|
C.sqlite3_prepare_v2(db.conn, &char(query.str), query.len, &stmt, 0)
|
||||||
return stmt
|
return stmt
|
||||||
|
|
|
@ -17,3 +17,9 @@ fn test_channel_buffered() {
|
||||||
}
|
}
|
||||||
assert sum == u64(num_iterations) * (num_iterations - 1) / 2
|
assert sum == u64(num_iterations) * (num_iterations - 1) / 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_builtin_enum() {
|
||||||
|
x := ChanState.closed
|
||||||
|
assert x == .closed
|
||||||
|
println(x)
|
||||||
|
}
|
||||||
|
|
|
@ -523,7 +523,7 @@ pub fn (mut t Table) register_type_symbol(typ TypeSymbol) int {
|
||||||
.placeholder {
|
.placeholder {
|
||||||
// override placeholder
|
// override placeholder
|
||||||
// println('overriding type placeholder `$typ.name`')
|
// println('overriding type placeholder `$typ.name`')
|
||||||
t.type_symbols[existing_idx] = TypeSymbol{
|
t.type_symbols[existing_idx] = {
|
||||||
...typ
|
...typ
|
||||||
methods: ex_type.methods
|
methods: ex_type.methods
|
||||||
}
|
}
|
||||||
|
|
|
@ -6455,15 +6455,23 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type {
|
||||||
// If a short form is used, `expected_type` needs to be an enum
|
// If a short form is used, `expected_type` needs to be an enum
|
||||||
// with this value.
|
// with this value.
|
||||||
pub fn (mut c Checker) enum_val(mut node ast.EnumVal) ast.Type {
|
pub fn (mut c Checker) enum_val(mut node ast.EnumVal) ast.Type {
|
||||||
typ_idx := if node.enum_name == '' {
|
mut typ_idx := if node.enum_name == '' {
|
||||||
c.expected_type.idx()
|
c.expected_type.idx()
|
||||||
} else { //
|
} else { //
|
||||||
c.table.find_type_idx(node.enum_name)
|
c.table.find_type_idx(node.enum_name)
|
||||||
}
|
}
|
||||||
// println('checker: enum_val: $node.enum_name typeidx=$typ_idx')
|
// println('checker: enum_val: $node.enum_name typeidx=$typ_idx')
|
||||||
if typ_idx == 0 {
|
if typ_idx == 0 {
|
||||||
c.error('not an enum (name=$node.enum_name) (type_idx=0)', node.pos)
|
// Handle `builtin` enums like `ChanState`, so that `x := ChanState.closed` works.
|
||||||
return ast.void_type
|
// In the checker the name for such enums was set to `main.ChanState` instead of
|
||||||
|
// just `ChanState`.
|
||||||
|
if node.enum_name.starts_with('main.') {
|
||||||
|
typ_idx = c.table.find_type_idx(node.enum_name['.main'.len..])
|
||||||
|
if typ_idx == 0 {
|
||||||
|
c.error('unknown enum `$node.enum_name` (type_idx=0)', node.pos)
|
||||||
|
return ast.void_type
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
mut typ := ast.new_type(typ_idx)
|
mut typ := ast.new_type(typ_idx)
|
||||||
if c.pref.translated {
|
if c.pref.translated {
|
||||||
|
|
|
@ -316,7 +316,7 @@ pub fn run<T>(global_app &T, port int) {
|
||||||
//}
|
//}
|
||||||
for {
|
for {
|
||||||
// Create a new app object for each connection, copy global data like db connections
|
// Create a new app object for each connection, copy global data like db connections
|
||||||
mut request_app := T{}
|
mut request_app := &T{}
|
||||||
$if T is DbInterface {
|
$if T is DbInterface {
|
||||||
request_app.db = global_app.db
|
request_app.db = global_app.db
|
||||||
} $else {
|
} $else {
|
||||||
|
@ -619,6 +619,7 @@ pub fn (ctx &Context) ip() string {
|
||||||
|
|
||||||
// Set s to the form error
|
// Set s to the form error
|
||||||
pub fn (mut ctx Context) error(s string) {
|
pub fn (mut ctx Context) error(s string) {
|
||||||
|
println('vweb error: $s')
|
||||||
ctx.form_error = s
|
ctx.form_error = s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue