Skip to content

Commit

Permalink
parser: fix an error message when initializing a struct from another …
Browse files Browse the repository at this point in the history
…module(fix #20141) (#20158)
  • Loading branch information
shove70 committed Dec 12, 2023
1 parent ebab6d5 commit d2fdbaf
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 0 deletions.
19 changes: 19 additions & 0 deletions vlib/v/parser/parser.v
Expand Up @@ -2926,7 +2926,26 @@ fn (mut p Parser) name_expr() ast.Expr {
return node
} else if is_option && p.tok.kind == .lsbr {
return p.array_init(is_option)
} else if !known_var && language == .v && p.peek_tok.kind == .dot && !p.pref.is_fmt {
peek_tok2 := p.peek_token(2)
peek_tok3 := p.peek_token(3)
mod = p.tok.lit
mut n := -1
for p.peek_token(n).kind == .dot && p.peek_token(n - 1).kind == .name {
mod = p.peek_token(n - 1).lit + '.' + mod
n -= 2
}
if peek_tok2.kind == .name && peek_tok2.lit.len > 0 && peek_tok2.lit[0].is_capital()
&& peek_tok3.kind == .lcbr
&& (mod.len > p.tok.lit.len || !p.known_import(p.tok.lit)) {
mut msg := 'unknown module `${mod}`'
if mod.len > p.tok.lit.len && p.known_import(p.tok.lit) {
msg += '; did you mean `${p.tok.lit}`?'
}
p.error_with_pos(msg, p.tok.pos())
}
}

ident := p.ident(language)
node = ident
p.add_defer_var(ident)
Expand Down
6 changes: 6 additions & 0 deletions vlib/v/parser/tests/struct_init_from_another_mod_err.out
@@ -0,0 +1,6 @@
vlib/v/parser/tests/struct_init_from_another_mod_err.vv:6:27: error: unknown module `rand.config`; did you mean `config`?
4 | fn main() {
5 | mut a := [0, 1, 2]
6 | rand.shuffle(mut a, rand.config.ShuffleConfigStruct{})!
| ~~~~~~
7 | }
7 changes: 7 additions & 0 deletions vlib/v/parser/tests/struct_init_from_another_mod_err.vv
@@ -0,0 +1,7 @@
import rand
import rand.config

fn main() {
mut a := [0, 1, 2]
rand.shuffle(mut a, rand.config.ShuffleConfigStruct{})!
}

0 comments on commit d2fdbaf

Please sign in to comment.