mirror of
https://github.com/esphome/esphome.git
synced 2026-09-27 15:00:24 +00:00
[core] Call a lambda whose only statement returns a braced value (#19503)
This commit is contained in:
@@ -1212,7 +1212,13 @@ def call_lambda(lamb: LambdaExpression) -> Expression:
|
||||
assert lamb.return_type is not None, "Lambda must have a return type to be called"
|
||||
expr = lamb.content.strip()
|
||||
# A lone `return <expr>;` reduces to the expression; anything longer is called as is.
|
||||
if re.match(r"^return\b", expr) and expr.endswith(";") and expr.count(";") == 1:
|
||||
# A braced return such as `return {};` needs the lambda's return type, so it is called.
|
||||
if (
|
||||
re.match(r"^return\b", expr)
|
||||
and expr.endswith(";")
|
||||
and expr.count(";") == 1
|
||||
and not expr[6:].lstrip().startswith("{")
|
||||
):
|
||||
expr = RawExpression(expr[6:-1].strip())
|
||||
# Don't cast if the return type is a class
|
||||
if isinstance(lamb.return_type, MockObjClass):
|
||||
|
||||
@@ -260,6 +260,15 @@ class TestCallLambda:
|
||||
assert isinstance(result, cg.CallExpression)
|
||||
assert str(result).endswith("}()")
|
||||
|
||||
def test_call_lambda__braced_return_is_called(self) -> None:
|
||||
"""A braced return needs the lambda's return type, so it is not reduced."""
|
||||
lamb = cg.LambdaExpression(("return {};",), (), "", ct.int_)
|
||||
|
||||
result = cg.call_lambda(lamb)
|
||||
|
||||
assert isinstance(result, cg.CallExpression)
|
||||
assert "static_cast" not in str(result)
|
||||
|
||||
def test_call_lambda__return_expression_with_class_return_type_no_cast(self):
|
||||
"""A class return type is not cast, since static_cast doesn't apply
|
||||
to arbitrary class types."""
|
||||
|
||||
Reference in New Issue
Block a user