globals is special

This commit is contained in:
J. Nick Koston
2026-03-22 11:23:46 -10:00
parent d30f3100bd
commit 85c970e1dd
4 changed files with 48 additions and 1 deletions
+5 -1
View File
@@ -600,7 +600,11 @@ def Pvariable(id_: ID, rhs: SafeExpType, type_: "MockObj" = None) -> "MockObj":
)
# Extract args from the CallExpression and rebuild as placement new
call_expr = rhs.base # CallExpression("new Type", args...)
placement_new = CallExpression(f"new({id_.id}) {the_type}", *call_expr.args)
placement_args: list[Expression] = []
if call_expr.template_args is not None:
placement_args.append(call_expr.template_args)
placement_args.extend(call_expr.args)
placement_new = CallExpression(f"new({id_.id}) {the_type}", *placement_args)
CORE.add(ExpressionStatement(placement_new))
else:
decl = VariableDeclarationExpression(id_.type, "*", id_, static=True)
@@ -0,0 +1,16 @@
esphome:
name: test
esp32:
board: esp32dev
globals:
- id: my_global_int
type: int
initial_value: "42"
- id: my_global_float
type: float
initial_value: "1.5"
- id: my_global_bool
type: bool
initial_value: "true"
@@ -0,0 +1,27 @@
"""Tests for the globals component."""
from __future__ import annotations
from collections.abc import Callable
from pathlib import Path
def test_globals_placement_new_with_template_args(
generate_main: Callable[[str | Path], str],
component_config_path: Callable[[str], Path],
) -> None:
"""Test that globals uses placement new with template arguments preserved."""
main_cpp = generate_main(component_config_path("globals_test.yaml"))
# Globals uses Pvariable with Type.new(template_args, initial_value)
# which exercises the template_args preservation in placement new.
assert "static globals::GlobalsComponent<int> *const my_global_int" in main_cpp
assert "PlacementStorage<globals::GlobalsComponent<int>>" in main_cpp
assert "new(my_global_int) globals::GlobalsComponent<int>" in main_cpp
# Verify initial value is passed as constructor arg
assert "42" in main_cpp
# Check other globals are also generated
assert "PlacementStorage<globals::GlobalsComponent<float>>" in main_cpp
assert "PlacementStorage<globals::GlobalsComponent<bool>>" in main_cpp