diff --git a/ASTPlayground/ASTPlayground.delphilsp.json b/ASTPlayground/ASTPlayground.delphilsp.json
index f103471..0fb8594 100644
--- a/ASTPlayground/ASTPlayground.delphilsp.json
+++ b/ASTPlayground/ASTPlayground.delphilsp.json
@@ -1 +1 @@
-{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": false, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } }
\ No newline at end of file
+{ "settings": { "project": "file:///T%3A/Myc/ASTPlayground/ASTPlayground.dpr", "dllname": "dcc64370.dll", "dccOptions": "-$O- -$W+ --inline:off -$R+ -$Q+ --no-config -Q -TX.exe -AGenerics.Collections=System.Generics.Collections;Generics.Defaults=System.Generics.Defaults;WinTypes=Winapi.Windows;WinProcs=Winapi.Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE -DDEBUG;;FRAMEWORK_FMX -E.\\Win64\\Debug -I\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -LEC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Bpl\\Win64 -LNC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NU.\\Win64\\Debug -NSWinapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;System;Xml;Data;Datasnap;Web;Soap; -OT:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -R\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -U\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\\DE\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\debug\";\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\\DE\";T:\\Myc\\Src\\Data;T:\\Myc\\Src\\AST;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\lib\\Win64\\release\";C:\\Users\\Brummel\\Documents\\Embarcadero\\Studio\\37.0\\Imports\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\Imports\";C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\include\";S:\\sc_famos_src\\svn_vcl\\Virtual-TreeView\\Source;S:\\sc_famos_src\\svn_vcl\\cpxedits;S:\\sc_famos_src\\svn_vcl\\dzChart;S:\\sc_famos_src\\svn_vcl\\eaeditor;S:\\sc_famos_src\\svn_vcl\\FamosEvents;S:\\sc_famos_src\\svn_vcl\\HTML_Viewer\\source;S:\\sc_famos_src\\svn_vcl\\Myc_ChartEdit;S:\\sc_famos_src\\svn_vcl\\Myc_HemiDrag;S:\\sc_famos_src\\svn_vcl\\Myc_SplitControl;S:\\sc_famos_src\\svn_vcl\\plotter;S:\\sc_famos_src\\svn_vcl\\SimpleIPC;S:\\sc_famos_src\\svn_vcl\\SynEdit-master\\Source;S:\\sc_famos_src\\svn_vcl\\ValEdits;S:\\sc_famos_src\\svn_vcl\\ZipMaster;S:\\sc_famos_src\\svn_common\\Myc_VecMath;\"C:\\Program Files (x86)\\DevExpress VCL\\Library\\RS28\\Win64\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressCommon Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressGDI+ Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLibrary\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\XP Theme Manager\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressLayout Control\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressPageControl\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressEditors Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDocking Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressBars\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressOfficeCore Library\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressMemData\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressDataController\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressNavBar\\Sources\";\"C:\\Program Files (x86)\\DevExpress VCL\\ExpressSkins Library\\Sources\";S:\\3rdParty\\FastMM5;C:\\Users\\Brummel\\AppData\\Local\\Programs\\TestInsight\\Source;T:\\Myc\\Src;\"c:\\program files (x86)\\embarcadero\\studio\\37.0\\source\\DUnitX\" -V -VN -VR -NBC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\Dcp\\Win64 -NHC:\\Users\\Public\\Documents\\Embarcadero\\Studio\\37.0\\hpp\\Win64 -NO.\\Win64\\Debug -LU" , "projectFiles":[ { "name": "MainForm", "file": "file:///T%3A/Myc/ASTPlayground/MainForm.pas" }, { "name": "Myc.Ast.Nodes", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Nodes.pas" }, { "name": "Myc.Ast.Scope", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Scope.pas" }, { "name": "Myc.Data.Value", "file": "file:///T%3A/Myc/ASTPlayground/Myc.Data.Value.pas" }, { "name": "Myc.Ast.Visitor", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Visitor.pas" }, { "name": "Myc.Ast.RTL", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.pas" }, { "name": "Myc.Ast.Dumper", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Dumper.pas" }, { "name": "Myc.Ast.RTL.Core", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.RTL.Core.pas" }, { "name": "Myc.Utils", "file": "file:///T%3A/Myc/Src/Myc.Utils.pas" }, { "name": "Myc.Ast.Script", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Script.pas" }, { "name": "Myc.Ast.Types", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Types.pas" }, { "name": "Myc.Data.Keyword", "file": "file:///T%3A/Myc/Src/Data/Myc.Data.Keyword.pas" }, { "name": "Myc.Ast.Compiler.TCO", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TCO.pas" }, { "name": "Myc.Ast.Compiler.Binder", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Binder.pas" }, { "name": "Myc.Ast.Compiler.Lowering", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Lowering.pas" }, { "name": "Myc.Ast.Compiler.TypeChecker", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.TypeChecker.pas" }, { "name": "Myc.Ast.Compiler.Macros", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Macros.pas" }, { "name": "Myc.Ast.Compiler.Specializer", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Compiler.Specializer.pas" }, { "name": "Myc.Ast.Environment", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Environment.pas" }, { "name": "Myc.Ast.Debugger", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Debugger.pas" }, { "name": "Myc.Ast.Analysis.Purity", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Analysis.Purity.pas" }, { "name": "Myc.Ast.Identities", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Identities.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.pas" }, { "name": "Myc.Fmx.AstEditor.Visualizer", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas" }, { "name": "Myc.Fmx.AstEditor.Workspace", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Workspace.pas" }, { "name": "Myc.Fmx.AstEditor.Layout", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Layout.pas" }, { "name": "Myc.Fmx.AstEditor.Node", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Node.pas" }, { "name": "Myc.Ast.Refactoring.Remove", "file": "file:///T%3A/Myc/Src/AST/Myc.Ast.Refactoring.Remove.pas" }, { "name": "Myc.Fmx.AstEditor.Render", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Render.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Lists", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Primitives", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Control", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas" }, { "name": "Myc.Fmx.AstEditor.Handlers.Data", "file": "file:///T%3A/Myc/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas" } ] , "includeDCUsInUsesCompletion": true, "enableKeyWordCompletion": false, "browsingPaths": [ "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/OCX/Servers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/VCL","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/RTL/SYS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/win/winrt","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/ToolsAPI","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/IBX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Internet","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/PROPERTY%20EDITORS","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/SOURCE/XML","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Core","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/System","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Indy10/Protocols","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/fmx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/components","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/engine","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/databinding/graph","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ado","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/cloud","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dbx","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/dsnap","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/vclctrls","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/connectors","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/datasnap/proxygen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DataExplorer","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/Common/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/Common","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/DUnitWizard/Source/DelphiExperts/DUnitProject/dunit","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/src","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/tests","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Experts","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/abstraction","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indy/implementation","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/indyimpl","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Property%20Editors/Indy10","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/soap/wsdlimporter","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/Visualizers","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XMLReporting","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnit/Contrib/XPGen","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/rest","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/firedac","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/tethering","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/DUnitX","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/data/ems","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/rtl/net","file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/source/FlatBox2D","file:///C%3A/Users/Public/Documents/Embarcadero/Studio/37.0/Dcp/%25PLATFORM%25","file:///%25TP%25/runtime/vcl","file:///S%3A/sc_famos_src/svn_vcl/cpxedits","file:///S%3A/sc_famos_src/svn_vcl/dzChart","file:///S%3A/sc_famos_src/svn_vcl/eaeditor","file:///S%3A/sc_famos_src/svn_vcl/FamosEvents","file:///S%3A/sc_famos_src/svn_vcl/HTML_Viewer/source","file:///S%3A/sc_famos_src/svn_vcl/Myc_ChartEdit","file:///S%3A/sc_famos_src/svn_vcl/Myc_HemiDrag","file:///S%3A/sc_famos_src/svn_vcl/Myc_SplitControl","file:///S%3A/sc_famos_src/svn_vcl/NiceChart","file:///S%3A/sc_famos_src/svn_vcl/plotter","file:///S%3A/sc_famos_src/svn_vcl/SimpleIPC","file:///S%3A/sc_famos_src/svn_vcl/SynEdit-master/Source","file:///S%3A/sc_famos_src/svn_vcl/ValEdits","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib","file:///S%3A/sc_famos_src/svn_vcl/ZipMaster/zlib/win32","file:///S%3A/sc_famos_src/svn_vcl/Virtual-TreeView/Source","file:///S%3A/sc_famos_src/svn_common/caHelpSys","file:///S%3A/sc_famos_src/svn_common/Misc","file:///S%3A/sc_famos_src/svn_common/Myc_VecMath","file:///S%3A/sc_famos_src/svn_common/PascalScript/source","file:///S%3A/sc_famos_src/svn_common/TreeBase","file:///S%3A/sc_famos_src/svn_common/TreeBase/Medien","file:///S%3A/3rdParty/spring4d/Source","file:///S%3A/3rdParty/spring4d/Source/Base","file:///S%3A/3rdParty/spring4d/Source/Base/Collections","file:///S%3A/3rdParty/spring4d/Source/Base/Logging","file:///S%3A/3rdParty/spring4d/Source/Base/Patches","file:///S%3A/3rdParty/spring4d/Source/Core/Container","file:///S%3A/3rdParty/spring4d/Source/Core/Interception","file:///S%3A/3rdParty/spring4d/Source/Core/Logging","file:///S%3A/3rdParty/spring4d/Source/Core/Mocking","file:///S%3A/3rdParty/spring4d/Source/Core/Services","file:///S%3A/3rdParty/spring4d/Source/Extensions/Cryptography","file:///S%3A/3rdParty/spring4d/Source/Extensions/Utils","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressCommon%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressGDI%2B%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLibrary/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/XP%20Theme%20Manager/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressLayout%20Control/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressPageControl/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressEditors%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDocking%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressBars/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressOfficeCore%20Library/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressMemData/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressDataController/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressNavBar/Sources","file:///C%3A/Program%20Files%20%28x86%29/DevExpress%20VCL/ExpressSkins%20Library/Sources","file:///T%3A/Myc/Src","file:///T%3A/Myc/Src/Data","file:///T%3A/Myc/Src/AST" ] , "CommonAppData": "file:///C%3A/Users/Brummel/AppData/Roaming/Embarcadero/BDS/37.0/" , "Templates": "file:///c%3A/program%20files%20%28x86%29/embarcadero/studio/37.0/ObjRepos/" } }
\ No newline at end of file
diff --git a/ASTPlayground/ASTPlayground.dpr b/ASTPlayground/ASTPlayground.dpr
index 2ecb79e..2f2e8ab 100644
--- a/ASTPlayground/ASTPlayground.dpr
+++ b/ASTPlayground/ASTPlayground.dpr
@@ -32,7 +32,11 @@ uses
Myc.Fmx.AstEditor.Layout in '..\Src\AST\Myc.Fmx.AstEditor.Layout.pas',
Myc.Fmx.AstEditor.Node in '..\Src\AST\Myc.Fmx.AstEditor.Node.pas',
Myc.Ast.Refactoring.Remove in '..\Src\AST\Myc.Ast.Refactoring.Remove.pas',
- Myc.Fmx.AstEditor.Render in '..\Src\AST\Myc.Fmx.AstEditor.Render.pas';
+ Myc.Fmx.AstEditor.Render in '..\Src\AST\Myc.Fmx.AstEditor.Render.pas',
+ Myc.Fmx.AstEditor.Handlers.Lists in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Lists.pas',
+ Myc.Fmx.AstEditor.Handlers.Primitives in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Primitives.pas',
+ Myc.Fmx.AstEditor.Handlers.Control in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Control.pas',
+ Myc.Fmx.AstEditor.Handlers.Data in '..\Src\AST\Myc.Fmx.AstEditor.Handlers.Data.pas';
{$R *.res}
diff --git a/ASTPlayground/ASTPlayground.dproj b/ASTPlayground/ASTPlayground.dproj
index eaca9ca..aeadb71 100644
--- a/ASTPlayground/ASTPlayground.dproj
+++ b/ASTPlayground/ASTPlayground.dproj
@@ -163,6 +163,10 @@
+
+
+
+
Base
diff --git a/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas b/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas
new file mode 100644
index 0000000..79cc50f
--- /dev/null
+++ b/Src/AST/Myc.Fmx.AstEditor.Handlers.Control.pas
@@ -0,0 +1,418 @@
+unit Myc.Fmx.AstEditor.Handlers.Control;
+
+interface
+
+uses
+ System.SysUtils,
+ System.UITypes,
+ System.Generics.Collections,
+ Myc.Ast,
+ Myc.Ast.Nodes,
+ Myc.Fmx.AstEditor.Render,
+ Myc.Fmx.AstEditor.Node;
+
+type
+ // --- Logic & Control Flow ---
+
+ TBlockExpressionNodeHandler = class(TBaseNodeHandler)
+ private
+ FExpressionsNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TIfExpressionNodeHandler = class(TBaseNodeHandler)
+ private
+ FConditionNode: TAstViewNode;
+ FThenNode: TAstViewNode;
+ FElseNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TTernaryExpressionNodeHandler = class(TBaseNodeHandler)
+ private
+ FConditionNode: TAstViewNode;
+ FThenNode: TAstViewNode;
+ FElseNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ // --- Functions & Calls ---
+
+ TLambdaExpressionNodeHandler = class(TBaseNodeHandler)
+ private
+ FParamsNode: TAstViewNode;
+ FBodyNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TFunctionCallNodeHandler = class(TBaseNodeHandler)
+ private
+ FCalleeNode: TAstViewNode;
+ FArgumentsNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ // Renders function calls as infix operators (e.g. "A + B" instead of "call + A B")
+ TOperatorCallHandler = class(TBaseNodeHandler)
+ private
+ FArgumentNodes: TList;
+ FCalleeName: string;
+ public
+ constructor Create(const ANode: IFunctionCallNode);
+ destructor Destroy; override;
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TMacroExpansionNodeHandler = class(TBaseNodeHandler)
+ private
+ FExpandedBodyNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TRecurNodeHandler = class(TBaseNodeHandler)
+ private
+ FArgumentsNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TMacroDefinitionNodeHandler = class(TBaseNodeHandler)
+ private
+ FParamsNode: TAstViewNode;
+ FBodyNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+implementation
+
+{ TBlockExpressionNodeHandler }
+
+procedure TBlockExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ OwnerNode.Alignment := laFlush;
+
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'do');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ FExpressionsNode := visu.CallAccept(FNode.Expressions);
+ FExpressionsNode.Frameless := True;
+end;
+
+function TBlockExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Block(FNode.Identity, FExpressionsNode.CreateAst.AsExpressionList, FNode.StaticType);
+end;
+
+{ TIfExpressionNodeHandler }
+
+procedure TIfExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+begin
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ OwnerNode.Alignment := laFlush;
+
+ FConditionNode := OwnerNode.AddExpr(OwnerNode, 'if', FNode.Condition);
+ FThenNode := OwnerNode.AddExpr(OwnerNode, 'then', FNode.ThenBranch);
+ if Assigned(FNode.ElseBranch) then
+ FElseNode := OwnerNode.AddExpr(OwnerNode, 'else', FNode.ElseBranch);
+end;
+
+function TIfExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ elseAst: IAstNode;
+begin
+ if Assigned(FElseNode) then
+ elseAst := FElseNode.CreateAst
+ else
+ elseAst := nil;
+
+ Result := TAst.IfExpr(FNode.Identity, FConditionNode.CreateAst, FThenNode.CreateAst, elseAst, FNode.StaticType);
+end;
+
+{ TTernaryExpressionNodeHandler }
+
+procedure TTernaryExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ FConditionNode := visu.CallAccept(FNode.Condition);
+ OwnerNode.AddLabel(OwnerNode, '?');
+ FThenNode := visu.CallAccept(FNode.ThenBranch);
+ OwnerNode.AddLabel(OwnerNode, ':');
+ FElseNode := visu.CallAccept(FNode.ElseBranch);
+end;
+
+function TTernaryExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.TernaryExpr(FNode.Identity, FConditionNode.CreateAst, FThenNode.CreateAst, FElseNode.CreateAst, FNode.StaticType);
+end;
+
+{ TLambdaExpressionNodeHandler }
+
+procedure TLambdaExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleContainer: TAutoFitLayout;
+ lbl: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, 0);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ OwnerNode.Alignment := laFlush;
+ OwnerNode.BackgroundColor := $090000ff;
+
+ titleContainer := OwnerNode.AddContainer(OwnerNode, loHorizontal, laCenter);
+ lbl := OwnerNode.AddLabel(titleContainer, 'fn');
+ lbl.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ // Parameters: Delegate to List Handler
+ var paramVisu := visu.Clone(titleContainer, 0);
+ FParamsNode := paramVisu.CallAccept(FNode.Parameters);
+
+ // Body
+ FBodyNode := visu.CallAccept(FNode.Body);
+ FBodyNode.Frameless := False;
+end;
+
+function TLambdaExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result :=
+ TAst.LambdaExpr(
+ FNode.Identity,
+ FParamsNode.CreateAst.AsParameterList,
+ FBodyNode.CreateAst,
+ FNode.Layout,
+ FNode.Descriptor,
+ FNode.Upvalues,
+ FNode.HasNestedLambdas,
+ FNode.IsPure,
+ FNode.StaticType
+ );
+end;
+
+{ TFunctionCallNodeHandler }
+
+procedure TFunctionCallNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ callLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+
+ callLabel := OwnerNode.AddLabel(OwnerNode, 'call ');
+ callLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ FCalleeNode := visu.CallAccept(FNode.Callee);
+
+ FArgumentsNode := visu.CallAccept(FNode.Arguments);
+end;
+
+function TFunctionCallNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result :=
+ TAst.FunctionCall(
+ FNode.Identity,
+ FCalleeNode.CreateAst,
+ FArgumentsNode.CreateAst.AsArgumentList,
+ FNode.StaticType,
+ FNode.IsTailCall,
+ FNode.StaticTarget,
+ FNode.IsTargetPure
+ );
+end;
+
+{ TOperatorCallHandler }
+
+constructor TOperatorCallHandler.Create(const ANode: IFunctionCallNode);
+begin
+ inherited Create(ANode);
+ FArgumentNodes := TList.Create;
+
+ if ANode.Callee.Kind = akIdentifier then
+ FCalleeName := ANode.Callee.AsIdentifier.Name
+ else if ANode.Callee.Kind = akKeyword then
+ FCalleeName := ANode.Callee.AsKeyword.Value.Name
+ else
+ FCalleeName := '?';
+end;
+
+destructor TOperatorCallHandler.Destroy;
+begin
+ FArgumentNodes.Free;
+ inherited;
+end;
+
+procedure TOperatorCallHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ i: Integer;
+ argView: TAstViewNode;
+ opLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ OwnerNode.Alignment := laCenter;
+
+ if FNode.Arguments.Count = 1 then
+ begin
+ opLabel := OwnerNode.AddLabel(OwnerNode, FCalleeName);
+ opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ opLabel.Color := TAlphaColors.Darkorange;
+ opLabel.Margins := TMarginRect.Create(2, 0, 2, 0);
+
+ argView := visu.CallAccept(FNode.Arguments[0]);
+ FArgumentNodes.Add(argView);
+ end
+ else
+ begin
+ for i := 0 to FNode.Arguments.Count - 1 do
+ begin
+ if i > 0 then
+ begin
+ opLabel := OwnerNode.AddLabel(OwnerNode, ' ' + FCalleeName + ' ');
+ opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ opLabel.Color := TAlphaColors.Darkorange;
+ // Compact spacing for operators
+ opLabel.Margins := TMarginRect.Create(0, 0, 0, 0);
+ end;
+
+ argView := visu.CallAccept(FNode.Arguments[i]);
+ FArgumentNodes.Add(argView);
+ end;
+ end;
+
+ if FNode.Arguments.Count = 0 then
+ begin
+ opLabel := OwnerNode.AddLabel(OwnerNode, FCalleeName);
+ opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ end;
+end;
+
+function TOperatorCallHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ newArgs: TArray;
+ i: Integer;
+begin
+ SetLength(newArgs, FArgumentNodes.Count);
+ for i := 0 to FArgumentNodes.Count - 1 do
+ newArgs[i] := FArgumentNodes[i].CreateAst;
+
+ Result :=
+ TAst.FunctionCall(
+ FNode.Identity,
+ FNode.Callee,
+ TArgumentList.Create(newArgs, FNode.Arguments.Identity),
+ FNode.StaticType,
+ FNode.IsTailCall,
+ FNode.StaticTarget,
+ FNode.IsTargetPure
+ );
+end;
+
+{ TMacroExpansionNodeHandler }
+
+procedure TMacroExpansionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Macro Expansion');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ FExpandedBodyNode := visu.CallAccept(FNode.ExpandedBody);
+end;
+
+function TMacroExpansionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.MacroExpansionNode(FNode.Identity, FNode.CallNode, FExpandedBodyNode.CreateAst.AsTypedNode);
+end;
+
+{ TRecurNodeHandler }
+
+procedure TRecurNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'recur');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ FArgumentsNode := visu.CallAccept(FNode.Arguments);
+end;
+
+function TRecurNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Recur(FNode.Identity, FArgumentsNode.CreateAst.AsArgumentList, FNode.StaticType);
+end;
+
+{ TMacroDefinitionNodeHandler }
+
+procedure TMacroDefinitionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+ titleContainer: TAutoFitLayout;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+
+ titleContainer := OwnerNode.AddContainer(OwnerNode, loHorizontal, laCenter);
+ titleLabel := OwnerNode.AddLabel(titleContainer, 'Macro Def: ' + FNode.Name.Name);
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ // Parameters List
+ var paramVisu := visu.Clone(titleContainer, visu.ExprDepth);
+ FParamsNode := paramVisu.CallAccept(FNode.Parameters);
+
+ FBodyNode := visu.CallAccept(FNode.Body);
+end;
+
+function TMacroDefinitionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.MacroDef(FNode.Identity, FNode.Name, FParamsNode.CreateAst.AsParameterList, FBodyNode.CreateAst);
+end;
+
+end.
diff --git a/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas b/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas
new file mode 100644
index 0000000..d403135
--- /dev/null
+++ b/Src/AST/Myc.Fmx.AstEditor.Handlers.Data.pas
@@ -0,0 +1,420 @@
+unit Myc.Fmx.AstEditor.Handlers.Data;
+
+interface
+
+uses
+ System.SysUtils,
+ System.UITypes,
+ Myc.Data.Keyword,
+ Myc.Ast,
+ Myc.Ast.Nodes,
+ Myc.Fmx.AstEditor.Render,
+ Myc.Fmx.AstEditor.Node;
+
+type
+ // --- Declarations & Assignments ---
+
+ TVariableDeclarationNodeHandler = class(TBaseNodeHandler)
+ private
+ FTargetNode: TAstViewNode;
+ FInitializerNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TAssignmentNodeHandler = class(TBaseNodeHandler)
+ private
+ FTargetNode: TAstViewNode;
+ FValueNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ // --- Metaprogramming ---
+
+ TQuasiquoteNodeHandler = class(TBaseNodeHandler)
+ private
+ FExpressionNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TUnquoteNodeHandler = class(TBaseNodeHandler)
+ private
+ FExpressionNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TUnquoteSplicingNodeHandler = class(TBaseNodeHandler)
+ private
+ FExpressionNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ // --- Data Access & Structures ---
+
+ TIndexerNodeHandler = class(TBaseNodeHandler)
+ private
+ FBaseNode: TAstViewNode;
+ FIndexNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TMemberAccessNodeHandler = class(TBaseNodeHandler)
+ private
+ FBaseNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TRecordFieldHandler = class(TBaseNodeHandler)
+ private
+ FKeyLabel: TTextNode;
+ FValueNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TRecordLiteralNodeHandler = class(TBaseNodeHandler)
+ private
+ FFieldsNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ // --- Series Operations ---
+
+ TCreateSeriesNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TAddSeriesItemNodeHandler = class(TBaseNodeHandler)
+ private
+ FValueNode: TAstViewNode;
+ FLookbackNode: TAstViewNode;
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TSeriesLengthNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+implementation
+
+{ TVariableDeclarationNodeHandler }
+
+procedure TVariableDeclarationNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ varLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+
+ varLabel := OwnerNode.AddLabel(OwnerNode, 'var');
+
+ varLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ FTargetNode := visu.CallAccept(FNode.Target);
+
+ if Assigned(FNode.Initializer) then
+ begin
+ OwnerNode.AddLabel(OwnerNode, ':=');
+ FInitializerNode := visu.CallAccept(FNode.Initializer);
+ end
+ else
+ FInitializerNode := nil;
+end;
+
+function TVariableDeclarationNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ initAst: IAstNode;
+begin
+ if Assigned(FInitializerNode) then
+ initAst := FInitializerNode.CreateAst
+ else
+ initAst := nil;
+ Result := TAst.VarDecl(FNode.Identity, FTargetNode.CreateAst, initAst, FNode.StaticType, FNode.IsBoxed);
+end;
+
+{ TAssignmentNodeHandler }
+
+procedure TAssignmentNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ FTargetNode := visu.CallAccept(FNode.Target);
+ OwnerNode.AddLabel(OwnerNode, ':=');
+ FValueNode := visu.CallAccept(FNode.Value);
+end;
+
+function TAssignmentNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Assign(FNode.Identity, FTargetNode.CreateAst, FValueNode.CreateAst, FNode.StaticType);
+end;
+
+{ TQuasiquoteNodeHandler }
+
+procedure TQuasiquoteNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Quasiquote');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ FExpressionNode := visu.CallAccept(FNode.Expression);
+end;
+
+function TQuasiquoteNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Quasiquote(FNode.Identity, FExpressionNode.CreateAst);
+end;
+
+{ TUnquoteNodeHandler }
+
+procedure TUnquoteNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ leftBracket, rightBracket: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+
+ leftBracket := OwnerNode.AddLabel(OwnerNode, '<');
+ // We cannot assign to fields of record properties directly.
+ // Replace the entire margin record.
+ // Default from AddLabel is (cNodePadding, cTitleTopPadding, cNodePadding, cTitleBottomPadding)
+ // We want Right Margin = 0.
+ leftBracket.Margins := TMarginRect.Create(cNodePadding, cTitleTopPadding, 0, cTitleBottomPadding);
+
+ FExpressionNode := visu.CallAccept(FNode.Expression);
+
+ rightBracket := OwnerNode.AddLabel(OwnerNode, '>');
+ // We want Left Margin = 0.
+ rightBracket.Margins := TMarginRect.Create(0, cTitleTopPadding, cNodePadding, cTitleBottomPadding);
+end;
+
+function TUnquoteNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Unquote(FNode.Identity, FExpressionNode.CreateAst);
+end;
+
+{ TUnquoteSplicingNodeHandler }
+
+procedure TUnquoteSplicingNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Unquote-Splicing');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ FExpressionNode := visu.CallAccept(FNode.Expression);
+end;
+
+function TUnquoteSplicingNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.UnquoteSplicing(FNode.Identity, FExpressionNode.CreateAst.AsQuasiquote);
+end;
+
+{ TIndexerNodeHandler }
+
+procedure TIndexerNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ FBaseNode := visu.CallAccept(FNode.Base);
+ OwnerNode.AddLabel(OwnerNode, '[');
+ FIndexNode := visu.CallAccept(FNode.Index);
+ OwnerNode.AddLabel(OwnerNode, ']');
+end;
+
+function TIndexerNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Indexer(FNode.Identity, FBaseNode.CreateAst, FIndexNode.CreateAst, FNode.StaticType);
+end;
+
+{ TMemberAccessNodeHandler }
+
+procedure TMemberAccessNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ FBaseNode := visu.CallAccept(FNode.Base);
+ OwnerNode.AddLabel(OwnerNode, '.');
+ OwnerNode.AddLabel(OwnerNode, FNode.Member.Value.Name);
+end;
+
+function TMemberAccessNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.MemberAccess(FNode.Identity, FBaseNode.CreateAst, TAst.Keyword(FNode.Member.Identity.AsKeyword), FNode.StaticType);
+end;
+
+{ TRecordFieldHandler }
+
+procedure TRecordFieldHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth);
+
+ OwnerNode.Frameless := True;
+ OwnerNode.Orientation := loHorizontal;
+ OwnerNode.Alignment := laCenter;
+
+ FKeyLabel := OwnerNode.AddLabel(OwnerNode, ':' + FNode.Key.Value.Name);
+ FKeyLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+ FKeyLabel.Color := TAlphaColors.Mediumvioletred;
+
+ FValueNode := visu.CallAccept(FNode.Value);
+end;
+
+function TRecordFieldHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.RecordField(FNode.Identity, FNode.Key, FValueNode.CreateAst);
+end;
+
+{ TRecordLiteralNodeHandler }
+
+procedure TRecordLiteralNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ OwnerNode.Alignment := laFlush;
+
+ // Delegate to RecordFieldList
+ FFieldsNode := visu.CallAccept(FNode.Fields);
+end;
+
+function TRecordLiteralNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result :=
+ TAst.RecordLiteral(
+ FNode.Identity,
+ FFieldsNode.CreateAst.AsRecordFieldList,
+ FNode.ScalarDefinition,
+ FNode.GenericDefinition,
+ FNode.StaticType
+ );
+end;
+
+{ TCreateSeriesNodeHandler }
+
+procedure TCreateSeriesNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ titleLabel: TTextNode;
+begin
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Create Series: ' + FNode.Definition);
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+end;
+
+function TCreateSeriesNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.CreateSeries(FNode.Identity.AsDefinition, FNode.StaticType);
+end;
+
+{ TAddSeriesItemNodeHandler }
+
+procedure TAddSeriesItemNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ visu: IAstVisualizer;
+ titleLabel: TTextNode;
+begin
+ visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
+
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Add Item to: ' + FNode.Series.Name);
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ FValueNode := visu.CallAccept(FNode.Value);
+ if Assigned(FNode.Lookback) then
+ FLookbackNode := visu.CallAccept(FNode.Lookback)
+ else
+ FLookbackNode := nil;
+end;
+
+function TAddSeriesItemNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ lookbackAst: IAstNode;
+begin
+ if Assigned(FLookbackNode) then
+ lookbackAst := FLookbackNode.CreateAst
+ else
+ lookbackAst := nil;
+
+ Result :=
+ TAst.AddSeriesItem(
+ FNode.Identity,
+ FNode.Series, // Reuse original Series Identifier Node
+ FValueNode.CreateAst,
+ lookbackAst,
+ FNode.StaticType
+ );
+end;
+
+{ TSeriesLengthNodeHandler }
+
+procedure TSeriesLengthNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ titleLabel: TTextNode;
+begin
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Length of: ' + FNode.Series.Name);
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+end;
+
+function TSeriesLengthNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.SeriesLength(FNode.Identity, FNode.Series, FNode.StaticType);
+end;
+
+end.
diff --git a/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas b/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas
new file mode 100644
index 0000000..785e6fc
--- /dev/null
+++ b/Src/AST/Myc.Fmx.AstEditor.Handlers.Lists.pas
@@ -0,0 +1,130 @@
+unit Myc.Fmx.AstEditor.Handlers.Lists;
+
+interface
+
+uses
+ Myc.Ast.Nodes,
+ Myc.Fmx.AstEditor.Render,
+ Myc.Fmx.AstEditor.Node,
+ Myc.Fmx.AstEditor.Handlers;
+
+type
+ TParameterListHandler = class(TNodeListHandler)
+ protected
+ function GetOrientation: TLayoutOrientation; override;
+ public
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TArgumentListHandler = class(TNodeListHandler)
+ protected
+ function GetOrientation: TLayoutOrientation; override;
+ public
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TExpressionListHandler = class(TNodeListHandler)
+ protected
+ function GetOrientation: TLayoutOrientation; override;
+ function GetAlignment: TLayoutAlignment; override;
+ public
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TRecordFieldListHandler = class(TNodeListHandler)
+ protected
+ function GetOrientation: TLayoutOrientation; override;
+ function GetAlignment: TLayoutAlignment; override;
+ public
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+implementation
+
+{ TParameterListHandler }
+
+function TParameterListHandler.GetOrientation: TLayoutOrientation;
+begin
+ Result := loHorizontal;
+end;
+
+function TParameterListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ arr: TArray;
+ i: Integer;
+begin
+ SetLength(arr, FChildNodes.Count);
+ for i := 0 to FChildNodes.Count - 1 do
+ arr[i] := FChildNodes[i].CreateAst.AsIdentifier;
+
+ Result := TParameterList.Create(arr, FNode.Identity);
+end;
+
+{ TArgumentListHandler }
+
+function TArgumentListHandler.GetOrientation: TLayoutOrientation;
+begin
+ Result := loHorizontal;
+end;
+
+function TArgumentListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ arr: TArray;
+ i: Integer;
+begin
+ SetLength(arr, FChildNodes.Count);
+ for i := 0 to FChildNodes.Count - 1 do
+ arr[i] := FChildNodes[i].CreateAst;
+
+ Result := TArgumentList.Create(arr, FNode.Identity);
+end;
+
+{ TExpressionListHandler }
+
+function TExpressionListHandler.GetOrientation: TLayoutOrientation;
+begin
+ Result := loVertical;
+end;
+
+function TExpressionListHandler.GetAlignment: TLayoutAlignment;
+begin
+ Result := laFlush;
+end;
+
+function TExpressionListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ arr: TArray;
+ i: Integer;
+begin
+ SetLength(arr, FChildNodes.Count);
+ for i := 0 to FChildNodes.Count - 1 do
+ arr[i] := FChildNodes[i].CreateAst;
+
+ Result := TExpressionList.Create(arr, FNode.Identity);
+end;
+
+{ TRecordFieldListHandler }
+
+function TRecordFieldListHandler.GetOrientation: TLayoutOrientation;
+begin
+ Result := loVertical;
+end;
+
+function TRecordFieldListHandler.GetAlignment: TLayoutAlignment;
+begin
+ Result := laFlush;
+end;
+
+function TRecordFieldListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+var
+ arr: TArray;
+ i: Integer;
+begin
+ SetLength(arr, FChildNodes.Count);
+ for i := 0 to FChildNodes.Count - 1 do
+ arr[i] := FChildNodes[i].CreateAst.AsRecordField;
+
+ Result := TRecordFieldList.Create(arr, FNode.Identity);
+end;
+
+end.
diff --git a/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas b/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas
new file mode 100644
index 0000000..4b34615
--- /dev/null
+++ b/Src/AST/Myc.Fmx.AstEditor.Handlers.Primitives.pas
@@ -0,0 +1,152 @@
+unit Myc.Fmx.AstEditor.Handlers.Primitives;
+
+interface
+
+uses
+ System.UITypes,
+ System.SysUtils,
+ Myc.Data.Value,
+ Myc.Ast,
+ Myc.Ast.Nodes,
+ Myc.Fmx.AstEditor.Render,
+ Myc.Fmx.AstEditor.Node;
+
+type
+ TConstantNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TIdentifierNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TKeywordNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+ TNopNodeHandler = class(TBaseNodeHandler)
+ public
+ procedure BuildUI(OwnerNode: TAstViewNode); override;
+ function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
+ end;
+
+implementation
+
+{ TConstantNodeHandler }
+
+procedure TConstantNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ valueStr: string;
+ isConcise: Boolean;
+ titleLabel: TTextNode;
+ valLabel: TTextNode;
+begin
+ valueStr := FNode.Value.ToString;
+ isConcise := ((FNode.Value.Kind = TDataValueKind.vkScalar) or (Pos(sLineBreak, valueStr) = 0)) and (Length(valueStr) < 40);
+
+ if isConcise then
+ begin
+ OwnerNode.Frameless := True;
+ OwnerNode.BackgroundColor := TAlphaColors.Null;
+ OwnerNode.BorderColor := TAlphaColors.Null;
+ OwnerNode.BorderWidth := 0;
+
+ // Compact representation for scalars
+ OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0);
+ OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0);
+
+ valLabel := OwnerNode.AddLabel(OwnerNode, valueStr);
+ valLabel.Margins := TMarginRect.Create(1, 0, 1, 0);
+ end
+ else
+ begin
+ OwnerNode.Frameless := False;
+ OwnerNode.Orientation := loVertical;
+
+ titleLabel := OwnerNode.AddLabel(OwnerNode, 'Const');
+ titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
+
+ OwnerNode.AddLabel(OwnerNode, valueStr);
+ end;
+end;
+
+function TConstantNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Constant(FNode.Identity.AsConstant, FNode.StaticType);
+end;
+
+{ TIdentifierNodeHandler }
+
+procedure TIdentifierNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ lbl: TTextNode;
+begin
+ OwnerNode.Frameless := True;
+ OwnerNode.BackgroundColor := TAlphaColors.Null;
+ OwnerNode.BorderColor := TAlphaColors.Null;
+ OwnerNode.BorderWidth := 0;
+
+ // Compact representation for identifiers
+ OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0);
+ OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0);
+
+ lbl := OwnerNode.AddLabel(OwnerNode, FNode.Name);
+ lbl.Margins := TMarginRect.Create(1, 0, 1, 0);
+end;
+
+function TIdentifierNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Identifier(FNode.Identity.AsNamed, FNode.Address, FNode.StaticType);
+end;
+
+{ TKeywordNodeHandler }
+
+procedure TKeywordNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ lbl: TTextNode;
+begin
+ OwnerNode.Frameless := True;
+ OwnerNode.BackgroundColor := TAlphaColors.Null;
+ OwnerNode.BorderColor := TAlphaColors.Null;
+ OwnerNode.BorderWidth := 0;
+
+ // Compact representation for keywords
+ OwnerNode.Margins := TMarginRect.Create(1, 0, 1, 0);
+ OwnerNode.Padding := TMarginRect.Create(0, 0, 0, 0);
+
+ lbl := OwnerNode.AddLabel(OwnerNode, ':' + FNode.Value.Name);
+ lbl.Color := TAlphaColors.Mediumvioletred;
+ lbl.Margins := TMarginRect.Create(1, 0, 1, 0);
+end;
+
+function TKeywordNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := TAst.Keyword(FNode.Identity.AsKeyword);
+end;
+
+{ TNopNodeHandler }
+
+procedure TNopNodeHandler.BuildUI(OwnerNode: TAstViewNode);
+var
+ lbl: TTextNode;
+begin
+ OwnerNode.Frameless := True;
+ OwnerNode.Alignment := TLayoutAlignment.laCenter;
+ OwnerNode.Orientation := TLayoutOrientation.loHorizontal;
+ lbl := OwnerNode.AddLabel(OwnerNode, '...');
+ lbl.FontSettings.Font.Style := [TFontStyle.fsBold];
+ lbl.Margins := TMarginRect.Create(8, 4, 8, 4);
+end;
+
+function TNopNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
+begin
+ Result := FNode;
+end;
+
+end.
diff --git a/Src/AST/Myc.Fmx.AstEditor.Handlers.pas b/Src/AST/Myc.Fmx.AstEditor.Handlers.pas
index bee0e69..3198253 100644
--- a/Src/AST/Myc.Fmx.AstEditor.Handlers.pas
+++ b/Src/AST/Myc.Fmx.AstEditor.Handlers.pas
@@ -4,19 +4,12 @@ interface
uses
System.SysUtils,
- System.Classes,
- System.Types,
- System.UITypes,
System.Generics.Collections,
- FMX.Types,
- FMX.Graphics,
- Myc.Data.Value,
- Myc.Data.Keyword,
- Myc.Ast,
+ System.UITypes,
Myc.Ast.Nodes,
Myc.Ast.Identities,
- Myc.Fmx.AstEditor.Render, // The new Virtual Engine
- Myc.Fmx.AstEditor.Node; // The View Node
+ Myc.Fmx.AstEditor.Render,
+ Myc.Fmx.AstEditor.Node;
type
// --- Abstract List Base ---
@@ -37,256 +30,6 @@ type
procedure MoveChild(SourceIndex, TargetIndex: Integer);
end;
- // --- Concrete List Handlers ---
-
- TParameterListHandler = class(TNodeListHandler)
- protected
- function GetOrientation: TLayoutOrientation; override;
- public
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TArgumentListHandler = class(TNodeListHandler)
- protected
- function GetOrientation: TLayoutOrientation; override;
- public
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TExpressionListHandler = class(TNodeListHandler)
- protected
- function GetOrientation: TLayoutOrientation; override;
- function GetAlignment: TLayoutAlignment; override;
- public
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TRecordFieldListHandler = class(TNodeListHandler)
- protected
- function GetOrientation: TLayoutOrientation; override;
- function GetAlignment: TLayoutAlignment; override;
- public
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Node Handlers ---
-
- TRecordFieldHandler = class(TBaseNodeHandler)
- private
- FKeyLabel: TTextNode;
- FValueNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TConstantNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TIdentifierNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TKeywordNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TNopNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Logic & Control Flow ---
-
- TBlockExpressionNodeHandler = class(TBaseNodeHandler)
- private
- FExpressionsNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TIfExpressionNodeHandler = class(TBaseNodeHandler)
- private
- FConditionNode: TAstViewNode;
- FThenNode: TAstViewNode;
- FElseNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TTernaryExpressionNodeHandler = class(TBaseNodeHandler)
- private
- FConditionNode: TAstViewNode;
- FThenNode: TAstViewNode;
- FElseNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Functions & Calls ---
-
- TLambdaExpressionNodeHandler = class(TBaseNodeHandler)
- private
- FParamsNode: TAstViewNode;
- FBodyNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TFunctionCallNodeHandler = class(TBaseNodeHandler)
- private
- FCalleeNode: TAstViewNode;
- FArgumentsNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // Renders function calls as infix operators (e.g. "A + B" instead of "call + A B")
- TOperatorCallHandler = class(TBaseNodeHandler)
- private
- FArgumentNodes: TList;
- FCalleeName: string;
- public
- constructor Create(const ANode: IFunctionCallNode);
- destructor Destroy; override;
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TMacroExpansionNodeHandler = class(TBaseNodeHandler)
- private
- FExpandedBodyNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TRecurNodeHandler = class(TBaseNodeHandler)
- private
- FArgumentsNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Declarations & Assignments ---
-
- TVariableDeclarationNodeHandler = class(TBaseNodeHandler)
- private
- FTargetNode: TAstViewNode;
- FInitializerNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TAssignmentNodeHandler = class(TBaseNodeHandler)
- private
- FTargetNode: TAstViewNode;
- FValueNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TMacroDefinitionNodeHandler = class(TBaseNodeHandler)
- private
- FParamsNode: TAstViewNode;
- FBodyNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Metaprogramming ---
-
- TQuasiquoteNodeHandler = class(TBaseNodeHandler)
- private
- FExpressionNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TUnquoteNodeHandler = class(TBaseNodeHandler)
- private
- FExpressionNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TUnquoteSplicingNodeHandler = class(TBaseNodeHandler)
- private
- FExpressionNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Data Access & Structures ---
-
- TIndexerNodeHandler = class(TBaseNodeHandler)
- private
- FBaseNode: TAstViewNode;
- FIndexNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TMemberAccessNodeHandler = class(TBaseNodeHandler)
- private
- FBaseNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TRecordLiteralNodeHandler = class(TBaseNodeHandler)
- private
- FFieldsNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- // --- Series Operations ---
-
- TCreateSeriesNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TAddSeriesItemNodeHandler = class(TBaseNodeHandler)
- private
- FValueNode: TAstViewNode;
- FLookbackNode: TAstViewNode;
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
- TSeriesLengthNodeHandler = class(TBaseNodeHandler)
- public
- procedure BuildUI(OwnerNode: TAstViewNode); override;
- function ReconstructAst(OwnerNode: TAstViewNode): IAstNode; override;
- end;
-
implementation
{ TNodeListHandler }
@@ -396,781 +139,4 @@ begin
// The visual order update happens via the controller's compilation cycle
end;
-{ TParameterListHandler }
-
-function TParameterListHandler.GetOrientation: TLayoutOrientation;
-begin
- Result := loHorizontal;
-end;
-
-function TParameterListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- arr: TArray;
- i: Integer;
-begin
- SetLength(arr, FChildNodes.Count);
- for i := 0 to FChildNodes.Count - 1 do
- arr[i] := FChildNodes[i].CreateAst.AsIdentifier;
-
- Result := TParameterList.Create(arr, FNode.Identity);
-end;
-
-{ TArgumentListHandler }
-
-function TArgumentListHandler.GetOrientation: TLayoutOrientation;
-begin
- Result := loHorizontal;
-end;
-
-function TArgumentListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- arr: TArray;
- i: Integer;
-begin
- SetLength(arr, FChildNodes.Count);
- for i := 0 to FChildNodes.Count - 1 do
- arr[i] := FChildNodes[i].CreateAst;
-
- Result := TArgumentList.Create(arr, FNode.Identity);
-end;
-
-{ TExpressionListHandler }
-
-function TExpressionListHandler.GetOrientation: TLayoutOrientation;
-begin
- Result := loVertical;
-end;
-
-function TExpressionListHandler.GetAlignment: TLayoutAlignment;
-begin
- Result := laFlush;
-end;
-
-function TExpressionListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- arr: TArray;
- i: Integer;
-begin
- SetLength(arr, FChildNodes.Count);
- for i := 0 to FChildNodes.Count - 1 do
- arr[i] := FChildNodes[i].CreateAst;
-
- Result := TExpressionList.Create(arr, FNode.Identity);
-end;
-
-{ TRecordFieldListHandler }
-
-function TRecordFieldListHandler.GetOrientation: TLayoutOrientation;
-begin
- Result := loVertical;
-end;
-
-function TRecordFieldListHandler.GetAlignment: TLayoutAlignment;
-begin
- Result := laFlush;
-end;
-
-function TRecordFieldListHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- arr: TArray;
- i: Integer;
-begin
- SetLength(arr, FChildNodes.Count);
- for i := 0 to FChildNodes.Count - 1 do
- arr[i] := FChildNodes[i].CreateAst.AsRecordField;
-
- Result := TRecordFieldList.Create(arr, FNode.Identity);
-end;
-
-{ TRecordFieldHandler }
-
-procedure TRecordFieldHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- OwnerNode.Alignment := laCenter;
-
- FKeyLabel := OwnerNode.AddLabel(OwnerNode, ':' + FNode.Key.Value.Name);
- FKeyLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- FKeyLabel.Color := TAlphaColors.Mediumvioletred;
-
- FValueNode := visu.CallAccept(FNode.Value);
-end;
-
-function TRecordFieldHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.RecordField(FNode.Identity, FNode.Key, FValueNode.CreateAst);
-end;
-
-{ TConstantNodeHandler }
-
-procedure TConstantNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- valueStr: string;
- isConcise: Boolean;
- titleLabel: TTextNode;
-begin
- valueStr := FNode.Value.ToString;
- isConcise := ((FNode.Value.Kind = TDataValueKind.vkScalar) or (Pos(sLineBreak, valueStr) = 0)) and (Length(valueStr) < 40);
-
- if isConcise then
- begin
- OwnerNode.Frameless := True;
- OwnerNode.AddLabel(OwnerNode, valueStr);
- end
- else
- begin
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
-
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Const');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- OwnerNode.AddLabel(OwnerNode, valueStr);
- end;
-end;
-
-function TConstantNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Constant(FNode.Identity.AsConstant, FNode.StaticType);
-end;
-
-{ TIdentifierNodeHandler }
-
-procedure TIdentifierNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-begin
- OwnerNode.Frameless := True;
- OwnerNode.AddLabel(OwnerNode, FNode.Name);
-end;
-
-function TIdentifierNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Identifier(FNode.Identity.AsNamed, FNode.Address, FNode.StaticType);
-end;
-
-{ TKeywordNodeHandler }
-
-procedure TKeywordNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- lbl: TTextNode;
-begin
- OwnerNode.Frameless := True;
- lbl := OwnerNode.AddLabel(OwnerNode, ':' + FNode.Value.Name);
- lbl.Color := TAlphaColors.Mediumvioletred;
-end;
-
-function TKeywordNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Keyword(FNode.Identity.AsKeyword);
-end;
-
-{ TNopNodeHandler }
-
-procedure TNopNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- lbl: TTextNode;
-begin
- OwnerNode.Frameless := True;
- OwnerNode.Alignment := TLayoutAlignment.laCenter;
- OwnerNode.Orientation := TLayoutOrientation.loHorizontal;
- lbl := OwnerNode.AddLabel(OwnerNode, '...');
- lbl.FontSettings.Font.Style := [TFontStyle.fsBold];
- lbl.Margins := TMarginRect.Create(8, 4, 8, 4);
-end;
-
-function TNopNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := FNode;
-end;
-
-{ TBlockExpressionNodeHandler }
-
-procedure TBlockExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- OwnerNode.Alignment := laFlush;
-
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'do');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- FExpressionsNode := visu.CallAccept(FNode.Expressions);
- FExpressionsNode.Frameless := True;
-end;
-
-function TBlockExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Block(FNode.Identity, FExpressionsNode.CreateAst.AsExpressionList, FNode.StaticType);
-end;
-
-{ TIfExpressionNodeHandler }
-
-procedure TIfExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-begin
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- OwnerNode.Alignment := laFlush;
-
- FConditionNode := OwnerNode.AddExpr(OwnerNode, 'if', FNode.Condition);
- FThenNode := OwnerNode.AddExpr(OwnerNode, 'then', FNode.ThenBranch);
- if Assigned(FNode.ElseBranch) then
- FElseNode := OwnerNode.AddExpr(OwnerNode, 'else', FNode.ElseBranch);
-end;
-
-function TIfExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- elseAst: IAstNode;
-begin
- if Assigned(FElseNode) then
- elseAst := FElseNode.CreateAst
- else
- elseAst := nil;
-
- Result := TAst.IfExpr(FNode.Identity, FConditionNode.CreateAst, FThenNode.CreateAst, elseAst, FNode.StaticType);
-end;
-
-{ TTernaryExpressionNodeHandler }
-
-procedure TTernaryExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- FConditionNode := visu.CallAccept(FNode.Condition);
- OwnerNode.AddLabel(OwnerNode, '?');
- FThenNode := visu.CallAccept(FNode.ThenBranch);
- OwnerNode.AddLabel(OwnerNode, ':');
- FElseNode := visu.CallAccept(FNode.ElseBranch);
-end;
-
-function TTernaryExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.TernaryExpr(FNode.Identity, FConditionNode.CreateAst, FThenNode.CreateAst, FElseNode.CreateAst, FNode.StaticType);
-end;
-
-{ TLambdaExpressionNodeHandler }
-
-procedure TLambdaExpressionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleContainer: TAutoFitLayout;
- lbl: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, 0);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- OwnerNode.Alignment := laFlush;
- OwnerNode.BackgroundColor := $090000ff;
-
- titleContainer := OwnerNode.AddContainer(OwnerNode, loHorizontal, laCenter);
- lbl := OwnerNode.AddLabel(titleContainer, 'fn');
- lbl.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- // Parameters: Delegate to List Handler
- var paramVisu := visu.Clone(titleContainer, 0);
- FParamsNode := paramVisu.CallAccept(FNode.Parameters);
-
- // Body
- FBodyNode := visu.CallAccept(FNode.Body);
- FBodyNode.Frameless := False;
-end;
-
-function TLambdaExpressionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result :=
- TAst.LambdaExpr(
- FNode.Identity,
- FParamsNode.CreateAst.AsParameterList,
- FBodyNode.CreateAst,
- FNode.Layout,
- FNode.Descriptor,
- FNode.Upvalues,
- FNode.HasNestedLambdas,
- FNode.IsPure,
- FNode.StaticType
- );
-end;
-
-{ TFunctionCallNodeHandler }
-
-procedure TFunctionCallNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- callLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
-
- callLabel := OwnerNode.AddLabel(OwnerNode, 'call ');
- callLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- FCalleeNode := visu.CallAccept(FNode.Callee);
-
- FArgumentsNode := visu.CallAccept(FNode.Arguments);
-end;
-
-function TFunctionCallNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result :=
- TAst.FunctionCall(
- FNode.Identity,
- FCalleeNode.CreateAst,
- FArgumentsNode.CreateAst.AsArgumentList,
- FNode.StaticType,
- FNode.IsTailCall,
- FNode.StaticTarget,
- FNode.IsTargetPure
- );
-end;
-
-{ TOperatorCallHandler }
-
-constructor TOperatorCallHandler.Create(const ANode: IFunctionCallNode);
-begin
- inherited Create(ANode);
- FArgumentNodes := TList.Create;
-
- if ANode.Callee.Kind = akIdentifier then
- FCalleeName := ANode.Callee.AsIdentifier.Name
- else if ANode.Callee.Kind = akKeyword then
- FCalleeName := ANode.Callee.AsKeyword.Value.Name
- else
- FCalleeName := '?';
-end;
-
-destructor TOperatorCallHandler.Destroy;
-begin
- FArgumentNodes.Free;
- inherited;
-end;
-
-procedure TOperatorCallHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- i: Integer;
- argView: TAstViewNode;
- opLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- OwnerNode.Alignment := laCenter;
-
- if FNode.Arguments.Count = 1 then
- begin
- opLabel := OwnerNode.AddLabel(OwnerNode, FCalleeName);
- opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- opLabel.Color := TAlphaColors.Darkorange;
-
- argView := visu.CallAccept(FNode.Arguments[0]);
- FArgumentNodes.Add(argView);
- end
- else
- begin
- for i := 0 to FNode.Arguments.Count - 1 do
- begin
- if i > 0 then
- begin
- opLabel := OwnerNode.AddLabel(OwnerNode, ' ' + FCalleeName + ' ');
- opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- opLabel.Color := TAlphaColors.Darkorange;
- opLabel.Margins := TMarginRect.Create(2, 2, 2, 2);
- end;
-
- argView := visu.CallAccept(FNode.Arguments[i]);
- FArgumentNodes.Add(argView);
- end;
- end;
-
- if FNode.Arguments.Count = 0 then
- begin
- opLabel := OwnerNode.AddLabel(OwnerNode, FCalleeName);
- opLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- end;
-end;
-
-function TOperatorCallHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- newArgs: TArray;
- i: Integer;
-begin
- SetLength(newArgs, FArgumentNodes.Count);
- for i := 0 to FArgumentNodes.Count - 1 do
- newArgs[i] := FArgumentNodes[i].CreateAst;
-
- Result :=
- TAst.FunctionCall(
- FNode.Identity,
- FNode.Callee,
- TArgumentList.Create(newArgs, FNode.Arguments.Identity),
- FNode.StaticType,
- FNode.IsTailCall,
- FNode.StaticTarget,
- FNode.IsTargetPure
- );
-end;
-
-{ TMacroExpansionNodeHandler }
-
-procedure TMacroExpansionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Macro Expansion');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- FExpandedBodyNode := visu.CallAccept(FNode.ExpandedBody);
-end;
-
-function TMacroExpansionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.MacroExpansionNode(FNode.Identity, FNode.CallNode, FExpandedBodyNode.CreateAst.AsTypedNode);
-end;
-
-{ TRecurNodeHandler }
-
-procedure TRecurNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
-
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'recur');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- FArgumentsNode := visu.CallAccept(FNode.Arguments);
-end;
-
-function TRecurNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Recur(FNode.Identity, FArgumentsNode.CreateAst.AsArgumentList, FNode.StaticType);
-end;
-
-{ TVariableDeclarationNodeHandler }
-
-procedure TVariableDeclarationNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- varLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
-
- varLabel := OwnerNode.AddLabel(OwnerNode, 'var');
-
- varLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- FTargetNode := visu.CallAccept(FNode.Target);
-
- if Assigned(FNode.Initializer) then
- begin
- OwnerNode.AddLabel(OwnerNode, ':=');
- FInitializerNode := visu.CallAccept(FNode.Initializer);
- end
- else
- FInitializerNode := nil;
-end;
-
-function TVariableDeclarationNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- initAst: IAstNode;
-begin
- if Assigned(FInitializerNode) then
- initAst := FInitializerNode.CreateAst
- else
- initAst := nil;
- Result := TAst.VarDecl(FNode.Identity, FTargetNode.CreateAst, initAst, FNode.StaticType, FNode.IsBoxed);
-end;
-
-{ TAssignmentNodeHandler }
-
-procedure TAssignmentNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- FTargetNode := visu.CallAccept(FNode.Target);
- OwnerNode.AddLabel(OwnerNode, ':=');
- FValueNode := visu.CallAccept(FNode.Value);
-end;
-
-function TAssignmentNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Assign(FNode.Identity, FTargetNode.CreateAst, FValueNode.CreateAst, FNode.StaticType);
-end;
-
-{ TMacroDefinitionNodeHandler }
-
-procedure TMacroDefinitionNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
- titleContainer: TAutoFitLayout;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
-
- titleContainer := OwnerNode.AddContainer(OwnerNode, loHorizontal, laCenter);
- titleLabel := OwnerNode.AddLabel(titleContainer, 'Macro Def: ' + FNode.Name.Name);
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- // Parameters List
- var paramVisu := visu.Clone(titleContainer, visu.ExprDepth);
- FParamsNode := paramVisu.CallAccept(FNode.Parameters);
-
- FBodyNode := visu.CallAccept(FNode.Body);
-end;
-
-function TMacroDefinitionNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.MacroDef(FNode.Identity, FNode.Name, FParamsNode.CreateAst.AsParameterList, FBodyNode.CreateAst);
-end;
-
-{ TQuasiquoteNodeHandler }
-
-procedure TQuasiquoteNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Quasiquote');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- FExpressionNode := visu.CallAccept(FNode.Expression);
-end;
-
-function TQuasiquoteNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Quasiquote(FNode.Identity, FExpressionNode.CreateAst);
-end;
-
-{ TUnquoteNodeHandler }
-
-procedure TUnquoteNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- leftBracket, rightBracket: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
-
- leftBracket := OwnerNode.AddLabel(OwnerNode, '<');
- // We cannot assign to fields of record properties directly.
- // Replace the entire margin record.
- // Default from AddLabel is (cNodePadding, cTitleTopPadding, cNodePadding, cTitleBottomPadding)
- // We want Right Margin = 0.
- leftBracket.Margins := TMarginRect.Create(cNodePadding, cTitleTopPadding, 0, cTitleBottomPadding);
-
- FExpressionNode := visu.CallAccept(FNode.Expression);
-
- rightBracket := OwnerNode.AddLabel(OwnerNode, '>');
- // We want Left Margin = 0.
- rightBracket.Margins := TMarginRect.Create(0, cTitleTopPadding, cNodePadding, cTitleBottomPadding);
-end;
-
-function TUnquoteNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Unquote(FNode.Identity, FExpressionNode.CreateAst);
-end;
-
-{ TUnquoteSplicingNodeHandler }
-
-procedure TUnquoteSplicingNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Unquote-Splicing');
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
- FExpressionNode := visu.CallAccept(FNode.Expression);
-end;
-
-function TUnquoteSplicingNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.UnquoteSplicing(FNode.Identity, FExpressionNode.CreateAst.AsQuasiquote);
-end;
-
-{ TIndexerNodeHandler }
-
-procedure TIndexerNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- FBaseNode := visu.CallAccept(FNode.Base);
- OwnerNode.AddLabel(OwnerNode, '[');
- FIndexNode := visu.CallAccept(FNode.Index);
- OwnerNode.AddLabel(OwnerNode, ']');
-end;
-
-function TIndexerNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.Indexer(FNode.Identity, FBaseNode.CreateAst, FIndexNode.CreateAst, FNode.StaticType);
-end;
-
-{ TMemberAccessNodeHandler }
-
-procedure TMemberAccessNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := True;
- OwnerNode.Orientation := loHorizontal;
- FBaseNode := visu.CallAccept(FNode.Base);
- OwnerNode.AddLabel(OwnerNode, '.');
- OwnerNode.AddLabel(OwnerNode, FNode.Member.Value.Name);
-end;
-
-function TMemberAccessNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.MemberAccess(FNode.Identity, FBaseNode.CreateAst, TAst.Keyword(FNode.Member.Identity.AsKeyword), FNode.StaticType);
-end;
-
-{ TRecordLiteralNodeHandler }
-
-procedure TRecordLiteralNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- OwnerNode.Alignment := laFlush;
-
- // Delegate to RecordFieldList
- FFieldsNode := visu.CallAccept(FNode.Fields);
-end;
-
-function TRecordLiteralNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result :=
- TAst.RecordLiteral(
- FNode.Identity,
- FFieldsNode.CreateAst.AsRecordFieldList,
- FNode.ScalarDefinition,
- FNode.GenericDefinition,
- FNode.StaticType
- );
-end;
-
-{ TCreateSeriesNodeHandler }
-
-procedure TCreateSeriesNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- titleLabel: TTextNode;
-begin
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Create Series: ' + FNode.Definition);
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-end;
-
-function TCreateSeriesNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.CreateSeries(FNode.Identity.AsDefinition, FNode.StaticType);
-end;
-
-{ TAddSeriesItemNodeHandler }
-
-procedure TAddSeriesItemNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- visu: IAstVisualizer;
- titleLabel: TTextNode;
-begin
- visu := OwnerNode.Visualizer.Clone(OwnerNode, OwnerNode.Visualizer.ExprDepth + 1);
-
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
-
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Add Item to: ' + FNode.Series.Name);
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-
- FValueNode := visu.CallAccept(FNode.Value);
- if Assigned(FNode.Lookback) then
- FLookbackNode := visu.CallAccept(FNode.Lookback)
- else
- FLookbackNode := nil;
-end;
-
-function TAddSeriesItemNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-var
- lookbackAst: IAstNode;
-begin
- if Assigned(FLookbackNode) then
- lookbackAst := FLookbackNode.CreateAst
- else
- lookbackAst := nil;
-
- Result :=
- TAst.AddSeriesItem(
- FNode.Identity,
- FNode.Series, // Reuse original Series Identifier Node
- FValueNode.CreateAst,
- lookbackAst,
- FNode.StaticType
- );
-end;
-
-{ TSeriesLengthNodeHandler }
-
-procedure TSeriesLengthNodeHandler.BuildUI(OwnerNode: TAstViewNode);
-var
- titleLabel: TTextNode;
-begin
- OwnerNode.Frameless := False;
- OwnerNode.Orientation := loVertical;
- titleLabel := OwnerNode.AddLabel(OwnerNode, 'Length of: ' + FNode.Series.Name);
- titleLabel.FontSettings.Font.Style := [TFontStyle.fsBold];
-end;
-
-function TSeriesLengthNodeHandler.ReconstructAst(OwnerNode: TAstViewNode): IAstNode;
-begin
- Result := TAst.SeriesLength(FNode.Identity, FNode.Series, FNode.StaticType);
-end;
-
end.
diff --git a/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas b/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas
index 12dcbd6..cdb48f8 100644
--- a/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas
+++ b/Src/AST/Myc.Fmx.AstEditor.Visualizer.pas
@@ -11,7 +11,6 @@ uses
Myc.Ast.Visitor,
Myc.Fmx.AstEditor.Render, // Virtual Engine
Myc.Fmx.AstEditor.Node, // View Nodes
- Myc.Fmx.AstEditor.Handlers, // Handlers
Myc.Fmx.AstEditor.Workspace; // Host
type
@@ -87,6 +86,13 @@ type
implementation
+uses
+ Myc.Fmx.AstEditor.Handlers,
+ Myc.Fmx.AstEditor.Handlers.Data,
+ Myc.Fmx.AstEditor.Handlers.Control,
+ Myc.Fmx.AstEditor.Handlers.Primitives,
+ Myc.Fmx.AstEditor.Handlers.Lists;
+
// Helper to identify standard operators
function IsStandardOperator(const Name: string): Boolean;
begin