patch 8.2.4804: expression in heredoc doesn't work for compiled function
Problem: Expression in heredoc doesn't work for compiled function.
Solution: Implement compiling the heredoc expressions. (Yegappan Lakshmanan,
closes #10232)
diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim
index 02274b3..2c3db65 100644
--- a/src/testdir/test_vim9_assign.vim
+++ b/src/testdir/test_vim9_assign.vim
@@ -1821,10 +1821,31 @@
enddef
def Test_heredoc()
- var lines =<< trim END # comment
- text
+ # simple heredoc
+ var lines =<< trim END
+ var text =<< trim TEXT # comment
+ abc
+ TEXT
+ assert_equal(['abc'], text)
END
- assert_equal(['text'], lines)
+ v9.CheckDefAndScriptSuccess(lines)
+
+ # empty heredoc
+ lines =<< trim END
+ var text =<< trim TEXT
+ TEXT
+ assert_equal([], text)
+ END
+ v9.CheckDefAndScriptSuccess(lines)
+
+ # heredoc with a single empty line
+ lines =<< trim END
+ var text =<< trim TEXT
+
+ TEXT
+ assert_equal([''], text)
+ END
+ v9.CheckDefAndScriptSuccess(lines)
v9.CheckDefFailure(['var lines =<< trim END X', 'END'], 'E488:')
v9.CheckDefFailure(['var lines =<< trim END " comment', 'END'], 'E488:')
@@ -2642,51 +2663,68 @@
" Test for heredoc with Vim expressions.
" This messes up highlighting, keep it near the end.
def Test_heredoc_expr()
- var code =<< trim eval END
- var a = `=5 + 10`
- var b = `=min([10, 6])` + `=max([4, 6])`
- END
- assert_equal(['var a = 15', 'var b = 6 + 6'], code)
+ var lines =<< trim CODE
+ var s = "local"
+ var a1 = "1"
+ var a2 = "2"
+ var a3 = "3"
+ var a4 = ""
+ var code =<< trim eval END
+ var a = `=5 + 10`
+ var b = `=min([10, 6])` + `=max([4, 6])`
+ var c = "`=s`"
+ var d = x`=a1`x`=a2`x`=a3`x`=a4`
+ END
+ assert_equal(['var a = 15', 'var b = 6 + 6', 'var c = "local"', 'var d = x1x2x3x'], code)
+ CODE
+ v9.CheckDefAndScriptSuccess(lines)
- code =<< eval trim END
- var s = "`=$SOME_ENV_VAR`"
- END
- assert_equal(['var s = "somemore"'], code)
+ lines =<< trim CODE
+ var code =<< eval trim END
+ var s = "`=$SOME_ENV_VAR`"
+ END
+ assert_equal(['var s = "somemore"'], code)
+ CODE
+ v9.CheckDefAndScriptSuccess(lines)
- code =<< eval END
- var s = "`=$SOME_ENV_VAR`"
-END
- assert_equal([' var s = "somemore"'], code)
+ lines =<< trim CODE
+ var code =<< eval END
+ var s = "`=$SOME_ENV_VAR`"
+ END
+ assert_equal([' var s = "somemore"'], code)
+ CODE
+ v9.CheckDefAndScriptSuccess(lines)
- code =<< eval trim END
- let a = `abc`
- let b = `=g:someVar`
- let c = `
- END
- assert_equal(['let a = `abc`', 'let b = X', 'let c = `'], code)
+ lines =<< trim CODE
+ var code =<< eval trim END
+ let a = `abc`
+ let b = `=g:someVar`
+ let c = `
+ END
+ assert_equal(['let a = `abc`', 'let b = X', 'let c = `'], code)
+ CODE
+ v9.CheckDefAndScriptSuccess(lines)
- var lines =<< trim LINES
+ lines =<< trim LINES
var text =<< eval trim END
let b = `=
END
LINES
- v9.CheckDefAndScriptFailure(lines, 'E1083:')
+ v9.CheckDefAndScriptFailure(lines, ['E1143: Empty expression: ""', 'E1083: Missing backtick'])
lines =<< trim LINES
var text =<< eval trim END
let b = `=abc
END
LINES
- v9.CheckDefAndScriptFailure(lines, 'E1083:')
+ v9.CheckDefAndScriptFailure(lines, ['E1001: Variable not found: abc', 'E1083: Missing backtick'])
lines =<< trim LINES
var text =<< eval trim END
let b = `=`
END
LINES
- v9.CheckDefAndScriptFailure(lines, 'E15:')
+ v9.CheckDefAndScriptFailure(lines, ['E1015: Name expected: `', 'E15: Invalid expression: "`"'])
enddef
-
-
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker