diff src/evalvars.c @ 24112:0346a59ed5bf v8.2.2597

patch 8.2.2597: Vim9: "import * as" does not work at script level Commit: https://github.com/vim/vim/commit/cb4e80fab9b1ee67249bde4f784526f900cda70c Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 13 20:57:19 2021 +0100 patch 8.2.2597: Vim9: "import * as" does not work at script level Problem: Vim9: "import * as" does not work at script level. Solution: Implement using an imported namespace.
author Bram Moolenaar <Bram@vim.org>
date Sat, 13 Mar 2021 21:00:03 +0100
parents c5e396fb0ebe
children f4061617c438
line wrap: on
line diff
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1219,7 +1219,8 @@ list_arg_vars(exarg_T *eap, char_u *arg,
 		arg = skipwhite(arg);
 		if (tofree != NULL)
 		    name = tofree;
-		if (eval_variable(name, len, &tv, NULL, TRUE, FALSE) == FAIL)
+		if (eval_variable(name, len, &tv, NULL,
+						     EVAL_VAR_VERBOSE) == FAIL)
 		    error = TRUE;
 		else
 		{
@@ -2539,6 +2540,8 @@ set_cmdarg(exarg_T *eap, char_u *oldarg)
 
 /*
  * Get the value of internal variable "name".
+ * If "flags" has EVAL_VAR_IMPORT may return a VAR_ANY with v_number set to the
+ * imported script ID.
  * Return OK or FAIL.  If OK is returned "rettv" must be cleared.
  */
     int
@@ -2547,12 +2550,11 @@ eval_variable(
     int		len,		// length of "name"
     typval_T	*rettv,		// NULL when only checking existence
     dictitem_T	**dip,		// non-NULL when typval's dict item is needed
-    int		verbose,	// may give error message
-    int		no_autoload)	// do not use script autoloading
+    int		flags)		// EVAL_VAR_ flags
 {
     int		ret = OK;
     typval_T	*tv = NULL;
-    int		foundFunc = FALSE;
+    int		found = FALSE;
     dictitem_T	*v;
     int		cc;
 
@@ -2561,7 +2563,7 @@ eval_variable(
     name[len] = NUL;
 
     // Check for user-defined variables.
-    v = find_var(name, NULL, no_autoload);
+    v = find_var(name, NULL, flags & EVAL_VAR_NOAUTOLOAD);
     if (v != NULL)
     {
 	tv = &v->di_tv;
@@ -2581,7 +2583,7 @@ eval_variable(
 	{
 	    if (import->imp_funcname != NULL)
 	    {
-		foundFunc = TRUE;
+		found = TRUE;
 		if (rettv != NULL)
 		{
 		    rettv->v_type = VAR_FUNC;
@@ -2590,8 +2592,21 @@ eval_variable(
 	    }
 	    else if (import->imp_flags & IMP_FLAGS_STAR)
 	    {
-		emsg("Sorry, 'import * as X' not implemented yet");
-		ret = FAIL;
+		if ((flags & EVAL_VAR_IMPORT) == 0)
+		{
+		    if (flags & EVAL_VAR_VERBOSE)
+			emsg(_(e_import_as_name_not_supported_here));
+		    ret = FAIL;
+		}
+		else
+		{
+		    if (rettv != NULL)
+		    {
+			rettv->v_type = VAR_ANY;
+			rettv->vval.v_number = import->imp_sid;
+		    }
+		    found = TRUE;
+		}
 	    }
 	    else
 	    {
@@ -2607,7 +2622,7 @@ eval_variable(
 
 	    if (ufunc != NULL)
 	    {
-		foundFunc = TRUE;
+		found = TRUE;
 		if (rettv != NULL)
 		{
 		    rettv->v_type = VAR_FUNC;
@@ -2617,11 +2632,11 @@ eval_variable(
 	}
     }
 
-    if (!foundFunc)
+    if (!found)
     {
 	if (tv == NULL)
 	{
-	    if (rettv != NULL && verbose)
+	    if (rettv != NULL && (flags & EVAL_VAR_VERBOSE))
 		semsg(_(e_undefined_variable_str), name);
 	    ret = FAIL;
 	}
@@ -3695,7 +3710,8 @@ var_exists(char_u *var)
     {
 	if (tofree != NULL)
 	    name = tofree;
-	n = (eval_variable(name, len, &tv, NULL, FALSE, TRUE) == OK);
+	n = (eval_variable(name, len, &tv, NULL,
+				 EVAL_VAR_NOAUTOLOAD + EVAL_VAR_IMPORT) == OK);
 	if (n)
 	{
 	    // handle d.key, l[idx], f(expr)