fixed multiline autowrapping in @(expr)

This commit is contained in:
Anthony Scopatz 2018-07-19 21:01:11 -04:00
parent 3a31d6ff31
commit 3b0fe9144d
4 changed files with 40 additions and 0 deletions

17
news/atml.rst Normal file
View file

@ -0,0 +1,17 @@
**Added:** None
**Changed:** None
**Deprecated:** None
**Removed:** None
**Fixed:**
* Fixed issue with multiline string inside of ``@(expr)`` in
unwrapped subprocesses. For example, the following now works::
echo @("""hello
mom""")
**Security:** None

View file

@ -98,6 +98,12 @@ def test_pyeval_redirect():
code = 'echo @("foo") > bar\n' code = 'echo @("foo") > bar\n'
assert check_parse(code) assert check_parse(code)
def test_pyeval_multiline_str():
code = 'echo @("""hello\nmom""")\n'
assert check_parse(code)
def test_echo_comma(): def test_echo_comma():
code = 'echo ,\n' code = 'echo ,\n'
assert check_parse(code) assert check_parse(code)
@ -114,3 +120,5 @@ def test_echo_comma_2val():
def test_echo_line_cont(): def test_echo_line_cont():
code = 'echo "1 \\\n2"\n' code = 'echo "1 \\\n2"\n'
assert check_parse(code) assert check_parse(code)

View file

@ -292,6 +292,13 @@ def test_subproc_toks_pyeval():
assert exp == obs assert exp == obs
def test_subproc_toks_pyeval_multiline_string():
s = 'echo @("""hello\nmom""")'
exp = '![{0}]'.format(s)
obs = subproc_toks(s, lexer=LEXER, returnline=True)
assert exp == obs
def test_subproc_toks_twopyeval(): def test_subproc_toks_twopyeval():
s = 'echo @(1+1) @(40 + 2)' s = 'echo @(1+1) @(40 + 2)'
exp = '![{0}]'.format(s) exp = '![{0}]'.format(s)

View file

@ -342,6 +342,11 @@ def find_next_break(line, mincol=0, lexer=None):
return maxcol return maxcol
def _offset_from_prev_lines(line, last):
lines = line.splitlines(keepends=True)[:last]
return sum(map(len, lines))
def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False, def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False,
greedy=False): greedy=False):
"""Encapsulates tokens in a source code line in a uncaptured """Encapsulates tokens in a source code line in a uncaptured
@ -431,6 +436,9 @@ def subproc_toks(line, mincol=-1, maxcol=None, lexer=None, returnline=False,
return # handle comment lines return # handle comment lines
elif saw_macro or greedy: elif saw_macro or greedy:
end_offset = len(toks[-1].value.rstrip()) + 1 end_offset = len(toks[-1].value.rstrip()) + 1
if toks[0].lineno != toks[-1].lineno:
# handle multiline cases
end_offset += _offset_from_prev_lines(line, toks[-1].lineno)
beg, end = toks[0].lexpos, (toks[-1].lexpos + end_offset) beg, end = toks[0].lexpos, (toks[-1].lexpos + end_offset)
end = len(line[:end].rstrip()) end = len(line[:end].rstrip())
rtn = '![' + line[beg:end] + ']' rtn = '![' + line[beg:end] + ']'