TDataValue as new global variant type

This commit is contained in:
Michael Schimmel
2025-09-12 11:18:32 +02:00
parent 695e854cc3
commit 646ffe92bb
15 changed files with 763 additions and 725 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ uses
Myc.Ast.Scope in '..\Src\AST\Myc.Ast.Scope.pas',
Myc.Ast.Visualizer in 'Myc.Ast.Visualizer.pas',
Myc.Ast.ViewModel in '..\Src\AST\Myc.Ast.ViewModel.pas',
Myc.Ast.Persistence in '..\Src\AST\Myc.Ast.Persistence.pas';
Myc.Data.Value in 'Myc.Data.Value.pas';
{$R *.res}
+2 -2
View File
@@ -4,7 +4,7 @@
<ProjectVersion>20.3</ProjectVersion>
<FrameworkType>FMX</FrameworkType>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Config Condition="'$(Config)'==''">Release</Config>
<Platform Condition="'$(Platform)'==''">Win64</Platform>
<ProjectName Condition="'$(ProjectName)'==''">ASTPlayground</ProjectName>
<TargetedPlatforms>2</TargetedPlatforms>
@@ -141,7 +141,7 @@
<DCCReference Include="..\Src\AST\Myc.Ast.Scope.pas"/>
<DCCReference Include="Myc.Ast.Visualizer.pas"/>
<DCCReference Include="..\Src\AST\Myc.Ast.ViewModel.pas"/>
<DCCReference Include="..\Src\AST\Myc.Ast.Persistence.pas"/>
<DCCReference Include="Myc.Data.Value.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
+12 -13
View File
@@ -23,13 +23,14 @@ uses
FMX.Controls.Presentation,
Myc.Ast.Visualizer,
Myc.Data.Scalar,
Myc.Data.Value, // Added
Myc.Ast.Nodes,
Myc.Ast,
Myc.Ast.Evaluator,
Myc.Ast.Printer,
FMX.Layouts,
FMX.Objects,
Myc.Ast.Scope; // Added for TExecutionScope
Myc.Ast.Scope;
type
// A test record
@@ -84,7 +85,7 @@ type
function CreateVisitor(const AScope: IExecutionScope): IAstVisitor;
procedure WorkspaceMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single);
// New helper function to encapsulate the Bind -> Evaluate pattern
function ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TAstValue;
function ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TDataValue;
public
{ Public declarations }
end;
@@ -95,7 +96,6 @@ var
implementation
uses
// Myc.Ast.Scope is now in the interface uses
Myc.Data.Scalar.JSON,
Myc.Data.Decimal,
System.Diagnostics, // For TStopwatch
@@ -125,7 +125,7 @@ begin
Result := TEvaluatorVisitor.Create(AScope);
end;
function TForm1.ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TAstValue;
function TForm1.ExecuteAst(const ANode: IAstNode; const AParentScope: IExecutionScope): TDataValue;
var
scriptScope: IExecutionScope;
begin
@@ -150,7 +150,7 @@ end;
procedure TForm1.FibonacciButtonClick(Sender: TObject);
var
root: IAstNode;
result: TAstValue;
result: TDataValue;
sw: TStopwatch;
begin
Memo1.Lines.Clear;
@@ -214,7 +214,7 @@ end;
procedure TForm1.RecursionButtonClick(Sender: TObject);
var
root: IAstNode;
result: TAstValue;
result: TDataValue;
sw: TStopwatch;
begin
Memo1.Lines.Clear;
@@ -258,7 +258,7 @@ procedure TForm1.SeriesTestButtonClick(Sender: TObject);
var
scope: IExecutionScope;
ast, callAst: IAstNode;
resultValue: TAstValue;
resultValue: TDataValue;
series: TScalarRecordSeries;
recordDef: TScalarRecordDefinition;
i: Integer;
@@ -286,7 +286,7 @@ begin
)
);
end;
scope.Define('ohlcvSeries', TAstValue.FromRecordSeries(series));
scope.Define('ohlcvSeries', TDataValue.FromRecordSeries(series));
// 2. Act: Define and execute the script AST
ast :=
@@ -314,7 +314,7 @@ end;
procedure TForm1.Test1ButtonClick(Sender: TObject);
var
main, callAst: IAstNode;
result: TAstValue;
result: TDataValue;
sw: TStopwatch;
begin
Memo1.Lines.Clear;
@@ -348,7 +348,7 @@ end;
procedure TForm1.Test2ButtonClick(Sender: TObject);
var
root: IAstNode;
result: TAstValue;
result: TDataValue;
sw: TStopwatch;
begin
Memo1.Lines.Clear;
@@ -515,7 +515,7 @@ begin
setupAst.Accept(CreateVisitor(scope));
// Declare the series variable in the scope BEFORE binding the call AST
scope.Define('current_series', TAstValue.Void);
scope.Define('current_series', TDataValue.Void);
// Create the call AST that will be executed in the loop
var currentSeriesIdent := TAst.Identifier('current_series');
@@ -533,7 +533,7 @@ begin
Randomize;
var recDef := TRttiAstHelper.JsonToRecordDefinition(TRttiAstHelper.RecordDefinitionToJson<TOHLCV>);
var series := TAstValue.FromRecordSeries(TScalarRecordSeries.Create(recDef));
var series := TDataValue.FromRecordSeries(TScalarRecordSeries.Create(recDef));
var seriesAddress := currentSeriesIdent.Address;
var nw := Now;
@@ -635,7 +635,6 @@ end;
procedure TForm1.DoTrigger2ButtonClick(Sender: TObject);
var
callAst: IFunctionCallNode;
currentValue: TAstValue;
begin
callAst := TAst.FunctionCall(TAst.Identifier('tickHandler'), [TAst.Constant(TScalar.FromInt64(2))]);
FLastAst := callAst;
+82 -81
View File
@@ -13,6 +13,7 @@ uses
FMX.Controls,
FMX.Objects,
FMX.Graphics,
Myc.Data.Value,
Myc.Ast.Nodes;
type
@@ -262,22 +263,22 @@ type
property Connections: TList<TPinConnection> read FConnections;
{ IAstVisitor }
function VisitConstant(const Node: IConstantNode): TAstValue;
function VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function VisitAssignment(const Node: IAssignmentNode): TAstValue;
function VisitIndexer(const Node: IIndexerNode): TAstValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function VisitConstant(const Node: IConstantNode): TDataValue;
function VisitIdentifier(const Node: IIdentifierNode): TDataValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
function VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
function VisitAssignment(const Node: IAssignmentNode): TDataValue;
function VisitIndexer(const Node: IIndexerNode): TDataValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
end;
implementation
@@ -293,27 +294,27 @@ type
TAstToTextVisitor = class(TInterfacedObject, IAstVisitor)
public
{ IAstVisitor }
function VisitConstant(const Node: IConstantNode): TAstValue;
function VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function VisitAssignment(const Node: IAssignmentNode): TAstValue;
function VisitIndexer(const Node: IIndexerNode): TAstValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function VisitConstant(const Node: IConstantNode): TDataValue;
function VisitIdentifier(const Node: IIdentifierNode): TDataValue;
function VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
function VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
function VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
function VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
function VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
function VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
function VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
function VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
function VisitAssignment(const Node: IAssignmentNode): TDataValue;
function VisitIndexer(const Node: IIndexerNode): TDataValue;
function VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
function VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
function VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
function VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
end;
{ TAstToTextVisitor }
function TAstToTextVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function TAstToTextVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
var
seriesStr, valueStr, lookbackStr: string;
begin
@@ -325,34 +326,34 @@ begin
Result := Format('%s.add(%s%s)', [seriesStr, valueStr, lookbackStr]);
end;
function TAstToTextVisitor.VisitAssignment(const Node: IAssignmentNode): TAstValue;
function TAstToTextVisitor.VisitAssignment(const Node: IAssignmentNode): TDataValue;
begin
Result := Node.Identifier.Name + ' := ' + Node.Value.Accept(Self).AsText;
end;
function TAstToTextVisitor.VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function TAstToTextVisitor.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
begin
var leftStr := Node.Left.Accept(Self).AsText;
var rightStr := Node.Right.Accept(Self).AsText;
Result := '(' + leftStr + ' ' + Node.Operator.ToString + ' ' + rightStr + ')';
end;
function TAstToTextVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function TAstToTextVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
begin
Result := '{...}';
end;
function TAstToTextVisitor.VisitConstant(const Node: IConstantNode): TAstValue;
function TAstToTextVisitor.VisitConstant(const Node: IConstantNode): TDataValue;
begin
Result := Node.Value.ToString;
end;
function TAstToTextVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function TAstToTextVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
begin
Result := 'new series(' + Node.Definition + ')';
end;
function TAstToTextVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function TAstToTextVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
var
i: Integer;
sb: TStringBuilder;
@@ -377,17 +378,17 @@ begin
end;
end;
function TAstToTextVisitor.VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function TAstToTextVisitor.VisitIdentifier(const Node: IIdentifierNode): TDataValue;
begin
Result := Node.Name;
end;
function TAstToTextVisitor.VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function TAstToTextVisitor.VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
begin
Result := Node.Condition.Accept(Self).AsText;
end;
function TAstToTextVisitor.VisitIndexer(const Node: IIndexerNode): TAstValue;
function TAstToTextVisitor.VisitIndexer(const Node: IIndexerNode): TDataValue;
var
baseStr, indexStr: string;
begin
@@ -396,7 +397,7 @@ begin
Result := Format('%s[%s]', [baseStr, indexStr]);
end;
function TAstToTextVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function TAstToTextVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
var
i: Integer;
sb: TStringBuilder;
@@ -421,7 +422,7 @@ begin
end;
end;
function TAstToTextVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function TAstToTextVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
var
baseStr: string;
begin
@@ -429,7 +430,7 @@ begin
Result := Format('%s.%s', [baseStr, Node.Member.Name]);
end;
function TAstToTextVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function TAstToTextVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
var
seriesStr: string;
begin
@@ -438,7 +439,7 @@ begin
Result := Format('length(%s)', [seriesStr]);
end;
function TAstToTextVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function TAstToTextVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
begin
var condStr := Node.Condition.Accept(Self).AsText;
var thenStr := Node.ThenBranch.Accept(Self).AsText;
@@ -446,12 +447,12 @@ begin
Result := Format('(%s ? %s : %s)', [condStr, thenStr, elseStr]);
end;
function TAstToTextVisitor.VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function TAstToTextVisitor.VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
begin
Result := Node.Operator.ToString + ' ' + Node.Right.Accept(Self).AsText;
end;
function TAstToTextVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function TAstToTextVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
var
initStr: string;
begin
@@ -498,7 +499,7 @@ begin
Height := 45;
// The panel must be able to receive mouse events.
// HitTest := True;
// HitTest := True;
// Clip children to the panel's bounds.
ClipChildren := True;
end;
@@ -1070,7 +1071,7 @@ begin
Result := Pos('{', Text) = 0;
end;
function TAstToAuraNodeVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TAstValue;
function TAstToAuraNodeVisitor.VisitAddSeriesItem(const Node: IAddSeriesItemNode): TDataValue;
var
details: string;
inputs: TArray<IAstNode>;
@@ -1123,10 +1124,10 @@ begin
vaTop
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitAssignment(const Node: IAssignmentNode): TAstValue;
function TAstToAuraNodeVisitor.VisitAssignment(const Node: IAssignmentNode): TDataValue;
begin
var details: String;
if (FMode = vmControlFlow) and TryGetDescr(Node, details) then
@@ -1169,10 +1170,10 @@ begin
vaTop
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitBinaryExpression(const Node: IBinaryExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitBinaryExpression(const Node: IBinaryExpressionNode): TDataValue;
begin
var exprStr: String;
if (FMode = vmControlFlow) and TryGetDescr(Node, exprStr) then
@@ -1213,10 +1214,10 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitBlockExpression(const Node: IBlockExpressionNode): TDataValue;
var
blockNode: TAuraNode;
childLastResult: TAuraNodeResult;
@@ -1253,10 +1254,10 @@ begin
FLastResult.LayoutNode := blockNode; // The layout node is the container itself.
FLastResult.OutputPin := childLastResult.OutputPin; // The connection pin is from the internal node.
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitConstant(const Node: IConstantNode): TAstValue;
function TAstToAuraNodeVisitor.VisitConstant(const Node: IConstantNode): TDataValue;
var
constantNode: TAuraNode;
begin
@@ -1264,7 +1265,7 @@ begin
constantNode := CreateNodeControl('Constant', Node.Value.ToString);
FLastResult.OutputPin := CreateOutput(constantNode);
FinalizeNodeLayout(constantNode);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitContainerNode(
@@ -1377,7 +1378,7 @@ begin
FinalizeNodeLayout(containerNode);
end;
function TAstToAuraNodeVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TAstValue;
function TAstToAuraNodeVisitor.VisitCreateSeries(const Node: ICreateSeriesNode): TDataValue;
var
seriesNode: TAuraNode;
begin
@@ -1386,10 +1387,10 @@ begin
seriesNode := CreateNodeControl('Create Series', Node.Definition);
FLastResult.OutputPin := CreateOutput(seriesNode);
FinalizeNodeLayout(seriesNode);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TAstValue;
function TAstToAuraNodeVisitor.VisitFunctionCall(const Node: IFunctionCallNode): TDataValue;
var
inputExpressions: TArray<IAstNode>;
begin
@@ -1443,18 +1444,18 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitIdentifier(const Node: IIdentifierNode): TAstValue;
function TAstToAuraNodeVisitor.VisitIdentifier(const Node: IIdentifierNode): TDataValue;
begin
var identifierNode := CreateNodeControl('Identifier', Node.Name);
FLastResult.OutputPin := CreateOutput(identifierNode);
FinalizeNodeLayout(identifierNode);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitIfExpression(const Node: IIfExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitIfExpression(const Node: IIfExpressionNode): TDataValue;
var
startPosition: TPointF;
ifNode: TAuraNode;
@@ -1544,10 +1545,10 @@ begin
execPathes.Free;
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitIndexer(const Node: IIndexerNode): TAstValue;
function TAstToAuraNodeVisitor.VisitIndexer(const Node: IIndexerNode): TDataValue;
var
details: String;
begin
@@ -1584,10 +1585,10 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitLambdaExpression(const Node: ILambdaExpressionNode): TDataValue;
var
paramStr: String;
lambdaNode: TAuraNode;
@@ -1624,10 +1625,10 @@ begin
// Re-finalize layout after adding the data output pin.
FinalizeNodeLayout(lambdaNode);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TAstValue;
function TAstToAuraNodeVisitor.VisitMemberAccess(const Node: IMemberAccessNode): TDataValue;
var
details: String;
begin
@@ -1661,7 +1662,7 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitOperatorNode(
@@ -1722,7 +1723,7 @@ begin
end;
end;
function TAstToAuraNodeVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TAstValue;
function TAstToAuraNodeVisitor.VisitSeriesLength(const Node: ISeriesLengthNode): TDataValue;
begin
// Use the standard helper for operator-style nodes.
VisitOperatorNode(
@@ -1751,10 +1752,10 @@ begin
Result.OutputPin := outPin;
end
);
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitTernaryExpression(const Node: ITernaryExpressionNode): TDataValue;
begin
var exprStr: String;
if (FMode = vmControlFlow) and TryGetDescr(Node, exprStr) then
@@ -1793,10 +1794,10 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitUnaryExpression(const Node: IUnaryExpressionNode): TAstValue;
function TAstToAuraNodeVisitor.VisitUnaryExpression(const Node: IUnaryExpressionNode): TDataValue;
begin
var exprStr: String;
if (FMode = vmControlFlow) and TryGetDescr(Node, exprStr) then
@@ -1832,10 +1833,10 @@ begin
end
);
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
function TAstToAuraNodeVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TAstValue;
function TAstToAuraNodeVisitor.VisitVariableDeclaration(const Node: IVariableDeclarationNode): TDataValue;
var
outPin: TControl;
begin
@@ -1894,7 +1895,7 @@ begin
end;
end;
Result := TAstValue.Void;
Result := TDataValue.Void;
end;
end.