Visualizer node aggregates

Fix in macro expander
This commit is contained in:
Michael Schimmel
2025-11-04 17:45:47 +01:00
parent 2fd85be923
commit 2b8a3effed
8 changed files with 1100 additions and 915 deletions
+9 -8
View File
@@ -1,3 +1,6 @@
//==================================================================================================
//== FULL UNIT START: Myc.Ast.MacroExpander (from Myc.Ast.MacroExpander.pas)
//==================================================================================================
unit Myc.Ast.MacroExpander;
interface
@@ -280,7 +283,8 @@ begin
// --- It is a macro, expand it ---
// 1. Create the temporary scope for the macro parameters
var expansionScope := TAst.CreateScope(nil);
// It must be parented to the *initial* scope to find other macros/globals.
var expansionScope := TAst.CreateScope(FInitialScope);
var params := macroDef.Parameters;
if Length(Node.Arguments) <> Length(params) then
raise Exception
@@ -301,14 +305,11 @@ begin
boundSubAst: IAstNode;
begin
// This is the compile-time evaluation (Binder + Evaluator)
// It runs in the *current* context (FInitialScope + FCurrentDescriptor)
var tempInitScope := TScope.CreateScope(FInitialScope.Parent, FCurrentDescriptor, nil);
// [FIX] It must run in the 'expansionScope' which contains the parameters.
boundSubAst := TAstBinder.Bind(expansionScope, ANodeToEvaluate, subDescriptor);
// Bind (mutates ANodeToEvaluate) and get its descriptor
boundSubAst := TAstBinder.Bind(tempInitScope, ANodeToEvaluate, subDescriptor);
// Create eval scope from the new descriptor
evalScope := subDescriptor.CreateScope(tempInitScope);
// Create eval scope from the new descriptor, parented to the expansion scope
evalScope := subDescriptor.CreateScope(expansionScope);
evaluator := FEvaluatorFactory(evalScope);
Result := evaluator.Execute(boundSubAst);