patch 9.1.1014: Vim9: variable not found in transitive import

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>
diff --git a/src/errors.h b/src/errors.h
index ad36e33..2811a32 100644
--- a/src/errors.h
+++ b/src/errors.h
@@ -2738,7 +2738,8 @@
 	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"));
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 23281bc..fc0edeb 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -3507,7 +3507,73 @@
   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
diff --git a/src/version.c b/src/version.c
index 2cf4f46..57d7ec7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1014,
+/**/
     1013,
 /**/
     1012,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index a2dd77a..fa02871 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -778,6 +778,7 @@
     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 @@
 		     : 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;
 }