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