]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1014: Vim9: variable not found in transitive import v9.1.1014
authorHirohito Higashi <h.east.727@gmail.com>
Tue, 14 Jan 2025 16:21:42 +0000 (17:21 +0100)
committerChristian Brabandt <cb@256bit.org>
Tue, 14 Jan 2025 16:21:42 +0000 (17:21 +0100)
Problem:  Vim9: variable not found in transitive import
Solution: Allow nested import (Hirohito Higashi)

fixe: #16379
closes: #16440

Signed-off-by: Hirohito Higashi <h.east.727@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/options.txt
runtime/doc/tags
runtime/doc/vim9.txt
src/errors.h
src/testdir/test_vim9_class.vim
src/version.c
src/vim9compile.c

index 2f64ba3be00d768a10542aeece17c8bb5116af2b..018f10d08d174ac495fe0ccb3b67b05cdee37ffa 100644 (file)
@@ -1,4 +1,4 @@
-*options.txt*  For Vim version 9.1.  Last change: 2025 Jan 12
+*options.txt*  For Vim version 9.1.  Last change: 2025 Jan 14
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -5582,6 +5582,7 @@ A jump table for the options with a short description can be found at |Q_op|.
        command recursion, see |E169|.
        See also |:function|.
        Also used for maximum depth of callback functions.
+       Also used for maximum depth of import.  See |:import-cycle|.
 
                                                *'maxmapdepth'* *'mmd'* *E223*
 'maxmapdepth' 'mmd'    number  (default 1000)
index 9310df8f7c3388fab3b7628691b9d657410858f0..05c21261476cbb6e82b913fe7e6cb203423ccaf1 100644 (file)
@@ -4148,6 +4148,7 @@ E1041     vim9.txt        /*E1041*
 E1042  vim9.txt        /*E1042*
 E1043  vim9.txt        /*E1043*
 E1044  vim9.txt        /*E1044*
+E1045  vim9.txt        /*E1045*
 E1047  vim9.txt        /*E1047*
 E1048  vim9.txt        /*E1048*
 E1049  vim9.txt        /*E1049*
index a978ea36930fafa462a36ed97ae684c283c68e7f..05b451cac3f6115e772dcb06eb6307fc77c08fca 100644 (file)
@@ -1,4 +1,4 @@
-*vim9.txt*     For Vim version 9.1.  Last change: 2024 Dec 23
+*vim9.txt*     For Vim version 9.1.  Last change: 2025 Jan 14
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -2051,13 +2051,14 @@ prefixing the function with |<SID>| you should use|<ScriptCmd>|. For example:
 >
        noremap ,a <ScriptCmd>:call s:that.OtherFunc()<CR>
 <
-                                                       *:import-cycle*
-The `import` commands are executed when encountered.  If script A imports
-script B, and B (directly or indirectly) imports A, this will be skipped over.
-At this point items in A after "import B" will not have been processed and
-defined yet.  Therefore cyclic imports can exist and not result in an error
-directly, but may result in an error for items in A after "import B" not being
-defined.  This does not apply to autoload imports, see the next section.
+                                                       *:import-cycle* *E1045*
+The `import` commands are executed when encountered.  It can be nested up to
+'maxfuncdepth' levels deep.  If script A imports script B, and B (directly or
+indirectly) imports A, this will be skipped over.  At this point items in A
+after "import B" will not have been processed and defined yet.  Therefore
+cyclic imports can exist and not result in an error directly, but may result
+in an error for items in A after "import B" not being defined.  This does not
+apply to autoload imports, see the next section.
 
 
 Importing an autoload script ~
index ad36e33a636a308c7623963f2987164c5e541d81..2811a3275c2adca991329efcbd0293ddb2179e88 100644 (file)
@@ -2738,7 +2738,8 @@ EXTERN char e_invalid_command_after_export[]
        INIT(= N_("E1043: Invalid command after :export"));
 EXTERN char e_export_with_invalid_argument[]
        INIT(= N_("E1044: Export with invalid argument"));
-// E1045 not used
+EXTERN char e_import_nesting_too_deep[]
+        INIT(= N_("E1045: Import nesting too deep"));
 // E1046 not used
 EXTERN char e_syntax_error_in_import_str[]
        INIT(= N_("E1047: Syntax error in import: %s"));
index 23281bcad75f11d7af094fd377ea85759189a15b..fc0edeb5bab2483705799c840ac06ac43519dd11 100644 (file)
@@ -3507,7 +3507,73 @@ def Test_extend_imported_class()
   v9.CheckScriptSuccess(lines)
 enddef
 
-def Test_abstract_class()
+" Test for multi level import
+def Test_multi_level_import_normal()
+  var lines =<< trim END
+    vim9script
+    export class Property
+      public var value: string
+    endclass
+  END
+  writefile(lines, 'aa.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+    import './aa.vim'
+    export class View
+      var content = aa.Property.new('')
+    endclass
+  END
+  writefile(lines, 'bb.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+    import './bb.vim'
+    class MyView extends bb.View
+      def new(value: string)
+        this.content.value = value
+      enddef
+    endclass
+    var myView = MyView.new('This should be ok')
+  END
+  v9.CheckScriptSuccess(lines)
+enddef
+
+" Test for multi level import
+def Test_multi_level_import_nest_over()
+  var lines =<< trim END
+    vim9script
+    import './xbb.vim'
+    export class Property
+      public var value: string
+    endclass
+  END
+  writefile(lines, 'xaa.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+    import './xaa.vim'
+    export class View
+      var content = aa.Property.new('')
+    endclass
+  END
+  writefile(lines, 'xbb.vim', 'D')
+
+  lines =<< trim END
+    vim9script
+    set maxfuncdepth=100
+    import './xbb.vim'
+    class MyView extends bb.View
+      def new(value: string)
+        this.content.value = value
+      enddef
+    endclass
+    var myView = MyView.new('This should be ok')
+  END
+  v9.CheckSourceFailure(lines, 'E1045: Import nesting too deep', 3)
+enddef
+
+def Test_abtstract_class()
   var lines =<< trim END
     vim9script
     abstract class Base
index 2cf4f4697853a10361d7cfc781863bf62ffd46c8..57d7ec7d407f8b3e86f744cebc76410db4cb0f78 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1014,
 /**/
     1013,
 /**/
index a2dd77a4416867bc8076c3eb9af0ef3546ba064d..fa02871e8b50cc81a54c9d29efcfce9b42a1ce68 100644 (file)
@@ -778,6 +778,7 @@ get_script_item_idx(
     static imported_T *
 find_imported_in_script(char_u *name, size_t len, int sid)
 {
+    static int     nesting = 0;
     scriptitem_T    *si;
     int                    idx;
 
@@ -792,6 +793,19 @@ find_imported_in_script(char_u *name, size_t len, int sid)
                     : STRLEN(import->imp_name) == len
                                  && STRNCMP(name, import->imp_name, len) == 0)
            return import;
+       else
+       {
+           if (nesting >= p_mfd)
+           {
+               emsg(_(e_import_nesting_too_deep));
+               return NULL;
+           }
+           ++nesting;
+           import = find_imported_in_script(name, len, import->imp_sid);
+           --nesting;
+           if (import != NULL)
+               return import;
+       }
     }
     return NULL;
 }