From 1e1846fda93337872857390bbb44a811bf6cdff0 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:23:21 +0100 Subject: [PATCH] ast,fmt: further improve type detection of user defined typenames, extend tests (#21004) --- vlib/v/ast/types.v | 37 +++++++++++-------- .../tests/check_err_msg_with_generics.out | 4 +- vlib/v/fmt/fmt_test.v | 5 +-- ..._keep.vv => submod_type_alias_expected.vv} | 0 .../submod_type_alias_input.vv | 7 ++++ 5 files changed, 32 insertions(+), 21 deletions(-) rename vlib/v/fmt/testdata/vmodules/submod_type_alias/{submod_type_alias_keep.vv => submod_type_alias_expected.vv} (100%) create mode 100644 vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_input.vv diff --git a/vlib/v/ast/types.v b/vlib/v/ast/types.v index 34c4ba5cc41905..929dfe5e7ebebe 100644 --- a/vlib/v/ast/types.v +++ b/vlib/v/ast/types.v @@ -1471,28 +1471,33 @@ fn (t Table) shorten_user_defined_typenames(original_name string, import_aliases if alias := import_aliases[original_name] { return alias } - mut parts := original_name.split('.') - if parts.len > 1 { - // mod.submod.submod2.Type => submod2.Type - if !parts[..parts.len - 1].any(it.contains('[')) { - mod_idx := parts.len - 2 - if t.is_fmt { - parts[mod_idx] = original_name.all_before_last('.') - } - if alias := import_aliases[parts[mod_idx]] { - parts[mod_idx] = alias - } else if t.cmod_prefix != '' && original_name.starts_with(t.cmod_prefix) { + mut mod, mut typ := original_name.rsplit_once('.') or { return original_name } + if !mod.contains('[') { + if !t.is_fmt { + mod = mod.all_after_last('.') + } + if alias := import_aliases[mod] { + mod = alias + } else if t.cmod_prefix != '' { + if alias := import_aliases[t.cmod_prefix + mod] { + mod = alias + } else { // cur_mod.Type => Type return original_name.all_after(t.cmod_prefix) } - return parts[mod_idx..].join('.') } - if original_name.contains('[]') { - // []mod.name - return original_name.all_after('.') + } + // E.g.: []mod.Type => []Type; []mod.submod.Type => []submod.Type; + // imported_mod.Type[mod.Result[[]mod.Token]] => imported_mod.Type[Result[[]Token]] + if original_name.contains('[]') { + if lhs, typ_after_lsbr := original_name.split_once('[') { + if mod_, typ_before_lsbr := lhs.rsplit_once('.') { + mod = mod_ + typ = '${typ_before_lsbr}[${typ_after_lsbr}' + } } } - return original_name + return '${mod}.${typ}' } @[minify] diff --git a/vlib/v/checker/tests/check_err_msg_with_generics.out b/vlib/v/checker/tests/check_err_msg_with_generics.out index 4f0251eb7f5bf1..eb09ec6192689a 100644 --- a/vlib/v/checker/tests/check_err_msg_with_generics.out +++ b/vlib/v/checker/tests/check_err_msg_with_generics.out @@ -1,6 +1,6 @@ -vlib/v/checker/tests/check_err_msg_with_generics.vv:15:10: error: cannot cast struct `BSTree[Result[[]Token, Err[string]]]` to `int` +vlib/v/checker/tests/check_err_msg_with_generics.vv:15:10: error: cannot cast struct `datatypes.BSTree[Result[[]Token, Err[string]]]` to `int` 13 | fn test_err_msg() { 14 | typ := datatypes.BSTree[Result[[]Token, Err[string]]]{} 15 | println(int(typ)) | ~~~~~~~~ - 16 | } + 16 | } \ No newline at end of file diff --git a/vlib/v/fmt/fmt_test.v b/vlib/v/fmt/fmt_test.v index 2ecec70843d142..2674fbb741ba29 100644 --- a/vlib/v/fmt/fmt_test.v +++ b/vlib/v/fmt/fmt_test.v @@ -73,10 +73,9 @@ fn test_fmt() { run_fmt(mut input_files) } -// NOTE: enable with upcommming `__input.vv` / `__expected.vv` files for vmodules -/* fn test_fmt_vmodules() { +fn test_fmt_vmodules() { vmodules_tdir := os.join_path(vroot, 'vlib', 'v', 'fmt', 'testdata', 'vmodules') os.setenv('VMODULES', vmodules_tdir, true) mut input_files := os.walk_ext(vmodules_tdir, '_input.vv') run_fmt(mut input_files) -} */ +} diff --git a/vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_keep.vv b/vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_expected.vv similarity index 100% rename from vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_keep.vv rename to vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_expected.vv diff --git a/vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_input.vv b/vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_input.vv new file mode 100644 index 00000000000000..cd6cad48cd85c1 --- /dev/null +++ b/vlib/v/fmt/testdata/vmodules/submod_type_alias/submod_type_alias_input.vv @@ -0,0 +1,7 @@ +// The module name has to match the modules dir name. +module submod_type_alias + +// The submod dir structure that is imported has to be existent. +import bar.baz + +type MyAlias = bar.baz.Baz