From d79ea47079a70def4f458f59b65c181488633bf6 Mon Sep 17 00:00:00 2001 From: Yegappan Lakshmanan Date: Mon, 20 Jan 2025 21:09:13 +0100 Subject: [PATCH] patch 9.1.1040: Vim9: imported type cannot be used as func return type Problem: Vim9: imported type cannot be used as func return type (Dayvid Albuquerque) Solution: temporarily reset the is_export flag (Yegappan Lakshmanan) fixes: #16489 closes: #16492 Signed-off-by: Yegappan Lakshmanan Signed-off-by: Christian Brabandt --- src/testdir/test_vim9_import.vim | 33 ++++++++++++++++++++++++++++++++ src/userfunc.c | 10 ++++++++++ src/version.c | 4 +++- 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index 4a3e239143..ff81f4a53d 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -3387,4 +3387,37 @@ def Test_import_locked_var() v9.CheckScriptFailure(lines, 'E741: Value is locked: Foo', 3) enddef +" Test for using an autoload imported class as the function return type +def Test_imported_class_as_def_func_rettype() + var lines =<< trim END + vim9script + + export class Foo + var name: string = "foo" + endclass + END + writefile(lines, 'Ximportclassrettype1.vim', 'D') + + lines =<< trim END + vim9script + + import autoload "./Ximportclassrettype1.vim" as A + + export def CreateFoo(): A.Foo + return A.Foo.new() + enddef + END + writefile(lines, 'Ximportclassrettype2.vim', 'D') + + lines =<< trim END + vim9script + + import './Ximportclassrettype2.vim' as B + + var foo = B.CreateFoo() + assert_equal('foo', foo.name) + END + v9.CheckScriptSuccess(lines) +enddef + " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker diff --git a/src/userfunc.c b/src/userfunc.c index 06be445af7..91c971e8fa 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -5472,11 +5472,19 @@ define_function( // The function may use script variables from the context. function_using_block_scopes(fp, cstack); + // The argument types and the return type may use an imported type. + // In that case, the imported file will be sourced. To avoid treating + // everything in the imported file as exported, temporarily reset + // is_export. + int save_is_export = is_export; + is_export = FALSE; + if (parse_argument_types(fp, &argtypes, varargs, &arg_objm, obj_members, obj_member_count) == FAIL) { SOURCING_LNUM = lnum_save; free_fp = fp_allocated; + is_export = save_is_export; goto erret; } varargs = FALSE; @@ -5486,8 +5494,10 @@ define_function( { SOURCING_LNUM = lnum_save; free_fp = fp_allocated; + is_export = save_is_export; goto erret; } + is_export = save_is_export; SOURCING_LNUM = lnum_save; } else diff --git a/src/version.c b/src/version.c index 3a3ee56949..8e53159579 100644 --- a/src/version.c +++ b/src/version.c @@ -13,7 +13,7 @@ * Vim originated from Stevie version 3.6 (Fish disk 217) by GRWalter (Fred) * It has been changed beyond recognition since then. * - * Differences between version 8.2 and 9.0 can be found with ":help version9". + * Differences between version 8.2 and 9.1 can be found with ":help version9". * Differences between version 7.4 and 8.x can be found with ":help version8". * Differences between version 6.4 and 7.x can be found with ":help version7". * Differences between version 5.8 and 6.x can be found with ":help version6". @@ -704,6 +704,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1040, /**/ 1039, /**/ -- 2.47.2