fix malformed warning to print the way it was meant to print

Given a meson.build with the contents:

```
t = '
'
```

We want to warn that this is bad. So we emitted this warning:
```
WARNING: Newline character in a string detected, use ''' (three single quotes) for multiline strings instead.
This will become a hard error in a future Meson release.                                 t = ' 4 4
```

The line contents and the offset are printed as gibberish after a big
whitespace run. These are elsewhere often passed to ParseException,
which pretty-prints this, but newlines aren't an exception, merely a
warning, and mlog.warning doesn't accept numeric strings as anything
more meaningful than something to print as text.

Fix this (by wrapping it in a ParseException) to properly print:
```
meson.build:4: WARNING: Newline character in a string detected, use ''' (three single quotes) for multiline strings instead.
This will become a hard error in a future Meson release.
t = '
    ^
```
pull/10011/head
Eli Schwartz 3 years ago
parent aa0450adda
commit 2974f2bcb8
No known key found for this signature in database
GPG Key ID: CEB167EFB5722BD6
  1. 14
      mesonbuild/mparser.py

@ -15,7 +15,6 @@
from dataclasses import dataclass
import re
import codecs
import textwrap
import types
import typing as T
from .mesonlib import MesonException
@ -194,14 +193,11 @@ class Lexer:
elif tid in {'string', 'fstring'}:
# Handle here and not on the regexp to give a better error message.
if match_text.find("\n") != -1:
mlog.warning(textwrap.dedent("""\
Newline character in a string detected, use ''' (three single quotes) for multiline strings instead.
This will become a hard error in a future Meson release.
"""),
self.getline(line_start),
str(lineno),
str(col)
)
msg = ParseException("Newline character in a string detected, use ''' (three single quotes) "
"for multiline strings instead.\n"
"This will become a hard error in a future Meson release.",
self.getline(line_start), lineno, col)
mlog.warning(msg, location=BaseNode(lineno, col, filename))
value = match_text[2 if tid == 'fstring' else 1:-1]
try:
value = ESCAPE_SEQUENCE_SINGLE_RE.sub(decode_match, value)

Loading…
Cancel
Save