]> granicus.if.org Git - vim/commitdiff
patch 8.2.3371: Vim9: :$ENV cannot be followed by ->func() in next line v8.2.3371
authorBram Moolenaar <Bram@vim.org>
Tue, 24 Aug 2021 19:56:03 +0000 (21:56 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 Aug 2021 19:56:03 +0000 (21:56 +0200)
Problem:    Vim9: :$ENV cannot be followed by ->func() in next line.
Solution:   Use "$ENV" as the start of an expression. (closes #8790)

src/ex_docmd.c
src/testdir/test_vim9_cmd.vim
src/version.c
src/vim9compile.c

index 85df6cdc2784d2214106125da571b3e814c1576f..58980738f27c6e091dfeddd523541a056fd5f0bb 100644 (file)
@@ -3425,14 +3425,16 @@ find_ex_command(
     {
        char_u *pskip = skip_option_env_lead(eap->cmd);
 
-       if (vim_strchr((char_u *)"{('[\"@&", *p) != NULL
+       if (vim_strchr((char_u *)"{('[\"@&$", *p) != NULL
               || ((p = to_name_const_end(pskip)) > eap->cmd && *p != NUL))
        {
            int     oplen;
            int     heredoc;
            char_u  *swp;
 
-           if (*eap->cmd == '&' || (eap->cmd[0] == '@'
+           if (*eap->cmd == '&'
+                   || *eap->cmd == '$'
+                   || (eap->cmd[0] == '@'
                                        && (valid_yank_reg(eap->cmd[1], FALSE)
                                                       || eap->cmd[1] == '@')))
            {
@@ -3443,12 +3445,14 @@ find_ex_command(
                        p += 2;
                    p = to_name_end(p, FALSE);
                }
+               else if (*eap->cmd == '$')
+                   p = to_name_end(eap->cmd + 1, FALSE);
                else
                    p = eap->cmd + 2;
                if (ends_excmd(*skipwhite(p)))
                {
-                   // "&option <NL>" and "@r <NL>" is the start of an
-                   // expression.
+                   // "&option <NL>", "$ENV <NL>" and "@r <NL>" are the start
+                   // of an expression.
                    eap->cmdidx = CMD_eval;
                    return eap->cmd;
                }
index ec845ea40bd92ac6104aaf5c45edb94b388fdd26..128575b955b86ff0678c8344ab1d122f2c519d54 100644 (file)
@@ -553,6 +553,22 @@ def Test_register_use_linebreak()
   CheckDefAndScriptSuccess(lines)
 enddef
 
+def Test_environment_use_linebreak()
+  var lines =<< trim END
+      new
+      $TESTENV = 'one'
+      $TESTENV->setline(1)
+      $TESTENV = 'two'
+      $TESTENV  ->setline(2)
+      $TESTENV = 'three'
+      $TESTENV  
+          ->setline(3)
+      assert_equal(['one', 'two', 'three'], getline(1, '$'))
+      bwipe!
+  END
+  CheckDefAndScriptSuccess(lines)
+enddef
+
 def Test_skipped_expr_linebreak()
   if 0
     var x = []
index c5142d277b2fa22181805dbbb1767f744ecc6a0a..6e7dd93cbf10169ef4214d1682f81e3fa08c7aae 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3371,
 /**/
     3370,
 /**/
index 90e6bf2677024c4ddc7094728e27969d93623f49..97bd292bba96bb80ca6281093cc63721de8e0233 100644 (file)
@@ -9745,9 +9745,11 @@ compile_def_function(
         * COMMAND after range
         * 'text'->func() should not be confused with 'a mark
         * "++nr" and "--nr" are eval commands
+        * in "$ENV->func()" the "$" is not a range
         */
        cmd = ea.cmd;
        if (!(local_cmdmod.cmod_flags & CMOD_LEGACY)
+               && (*cmd != '$' || starts_with_colon)
                && (starts_with_colon || !(*cmd == '\''
                       || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-')))))
        {