Fix AST representation of format strings
This commit is contained in:
parent
7908b663ad
commit
84fbf04f84
1
NEWS.rst
1
NEWS.rst
@ -20,6 +20,7 @@ Bug Fixes
|
|||||||
------------------------------
|
------------------------------
|
||||||
* Statements in the second argument of `assert` are now executed.
|
* Statements in the second argument of `assert` are now executed.
|
||||||
* Fixed the expression of a while loop that contains statements being compiled twice.
|
* Fixed the expression of a while loop that contains statements being compiled twice.
|
||||||
|
* `hy2py` can now handle format strings.
|
||||||
|
|
||||||
0.17.0
|
0.17.0
|
||||||
==============================
|
==============================
|
||||||
|
@ -1784,7 +1784,7 @@ class HyASTCompiler(object):
|
|||||||
item = item[2:].lstrip()
|
item = item[2:].lstrip()
|
||||||
|
|
||||||
# Look for a format specifier.
|
# Look for a format specifier.
|
||||||
format_spec = asty.Str(string, s = "")
|
format_spec = None
|
||||||
if item.startswith(':'):
|
if item.startswith(':'):
|
||||||
if allow_recursion:
|
if allow_recursion:
|
||||||
ret += self._format_string(string,
|
ret += self._format_string(string,
|
||||||
@ -1793,6 +1793,8 @@ class HyASTCompiler(object):
|
|||||||
format_spec = ret.force_expr
|
format_spec = ret.force_expr
|
||||||
else:
|
else:
|
||||||
format_spec = asty.Str(string, s=item[1:])
|
format_spec = asty.Str(string, s=item[1:])
|
||||||
|
if PY36:
|
||||||
|
format_spec = asty.JoinedStr(string, values=[format_spec])
|
||||||
elif item:
|
elif item:
|
||||||
raise self._syntax_error(string,
|
raise self._syntax_error(string,
|
||||||
"f-string: trailing junk in field")
|
"f-string: trailing junk in field")
|
||||||
@ -1818,7 +1820,9 @@ class HyASTCompiler(object):
|
|||||||
('!' + conversion if conversion else '') +
|
('!' + conversion if conversion else '') +
|
||||||
':{}}'),
|
':{}}'),
|
||||||
attr = 'format', ctx = ast.Load()),
|
attr = 'format', ctx = ast.Load()),
|
||||||
args = [ret.force_expr, format_spec],
|
args = [
|
||||||
|
ret.force_expr,
|
||||||
|
format_spec or asty.Str(string, s = "")],
|
||||||
keywords = [], starargs = None, kwargs = None))
|
keywords = [], starargs = None, kwargs = None))
|
||||||
|
|
||||||
return ret + (
|
return ret + (
|
||||||
|
@ -49,6 +49,10 @@ Call me Ishmael. Some years ago—never mind how long precisely—having little
|
|||||||
(setv condexpr (if "" "x" "y"))
|
(setv condexpr (if "" "x" "y"))
|
||||||
(setv mylambda (fn [x] (+ x "z")))
|
(setv mylambda (fn [x] (+ x "z")))
|
||||||
|
|
||||||
|
(setv fstring1 f"hello {(+ 1 1)} world")
|
||||||
|
(setv p "xyzzy")
|
||||||
|
(setv fstring2 f"a{p !r :9}")
|
||||||
|
|
||||||
(setv augassign 103)
|
(setv augassign 103)
|
||||||
(//= augassign 4)
|
(//= augassign 4)
|
||||||
|
|
||||||
|
@ -79,6 +79,9 @@ def assert_stuff(m):
|
|||||||
assert type(m.mylambda) is type(lambda x: x + "z")
|
assert type(m.mylambda) is type(lambda x: x + "z")
|
||||||
assert m.mylambda("a") == "az"
|
assert m.mylambda("a") == "az"
|
||||||
|
|
||||||
|
assert m.fstring1 == "hello 2 world"
|
||||||
|
assert m.fstring2 == "a'xyzzy' "
|
||||||
|
|
||||||
assert m.augassign == 25
|
assert m.augassign == 25
|
||||||
|
|
||||||
assert m.delstatement == ["a", "c", "d", "e"]
|
assert m.delstatement == ["a", "c", "d", "e"]
|
||||||
|
Loading…
Reference in New Issue
Block a user