parser: improve error message for `mod.unknownsubmod.Type` (#9976)
parent
298fc533e4
commit
1e856c0f94
|
@ -330,17 +330,31 @@ pub fn (mut p Parser) parse_any_type(language ast.Language, is_ptr bool, check_d
|
||||||
} else if p.peek_tok.kind == .dot && check_dot {
|
} else if p.peek_tok.kind == .dot && check_dot {
|
||||||
// `module.Type`
|
// `module.Type`
|
||||||
// /if !(p.tok.lit in p.table.imports) {
|
// /if !(p.tok.lit in p.table.imports) {
|
||||||
if !p.known_import(name) {
|
mut mod := name
|
||||||
p.error('unknown module `$p.tok.lit`')
|
mut mod_pos := p.tok.position()
|
||||||
return 0
|
|
||||||
}
|
|
||||||
if p.tok.lit in p.imports {
|
|
||||||
p.register_used_import(p.tok.lit)
|
|
||||||
}
|
|
||||||
p.next()
|
p.next()
|
||||||
p.check(.dot)
|
p.check(.dot)
|
||||||
|
mut mod_last_part := mod
|
||||||
|
for p.peek_tok.kind == .dot {
|
||||||
|
mod_pos = mod_pos.extend(p.tok.position())
|
||||||
|
mod_last_part = p.tok.lit
|
||||||
|
mod += '.$mod_last_part'
|
||||||
|
p.next()
|
||||||
|
p.check(.dot)
|
||||||
|
}
|
||||||
|
if !p.known_import(mod) {
|
||||||
|
mut msg := 'unknown module `$mod`'
|
||||||
|
if mod.len > mod_last_part.len && p.known_import(mod_last_part) {
|
||||||
|
msg += '; did you mean `$mod_last_part`?'
|
||||||
|
}
|
||||||
|
p.error_with_pos(msg, mod_pos)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
if mod in p.imports {
|
||||||
|
p.register_used_import(mod)
|
||||||
|
}
|
||||||
// prefix with full module
|
// prefix with full module
|
||||||
name = '${p.imports[name]}.$p.tok.lit'
|
name = '${p.imports[mod]}.$p.tok.lit'
|
||||||
if p.tok.lit.len > 0 && !p.tok.lit[0].is_capital() {
|
if p.tok.lit.len > 0 && !p.tok.lit[0].is_capital() {
|
||||||
p.error('imported types must start with a capital letter')
|
p.error('imported types must start with a capital letter')
|
||||||
return 0
|
return 0
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/parser/tests/struct_field_unknown_module_a.vv:2:7: error: unknown module `ui`
|
||||||
|
1 | struct Inter {
|
||||||
|
2 | code ui.KeyCode
|
||||||
|
| ~~
|
||||||
|
3 | }
|
|
@ -0,0 +1,3 @@
|
||||||
|
struct Inter {
|
||||||
|
code ui.KeyCode
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
vlib/v/parser/tests/struct_field_unknown_module_b.vv:2:7: error: unknown module `term.unknownmod`
|
||||||
|
1 | struct Inter {
|
||||||
|
2 | code term.unknownmod.KeyCode
|
||||||
|
| ~~~~~~~~~~~~~~~
|
||||||
|
3 | }
|
|
@ -0,0 +1,3 @@
|
||||||
|
struct Inter {
|
||||||
|
code term.unknownmod.KeyCode
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
vlib/v/parser/tests/struct_field_unknown_module_c.vv:4:7: error: unknown module `term.ui`; did you mean `ui`?
|
||||||
|
2 |
|
||||||
|
3 | struct Inter {
|
||||||
|
4 | code term.ui.KeyCode
|
||||||
|
| ~~~~~~~
|
||||||
|
5 | }
|
|
@ -0,0 +1,5 @@
|
||||||
|
import term.ui
|
||||||
|
|
||||||
|
struct Inter {
|
||||||
|
code term.ui.KeyCode
|
||||||
|
}
|
Loading…
Reference in New Issue