/*********************************************************************** THIS FILE IS AUTOMATICALLY GENERATED. DO NOT MODIFY DEVELOPER: Zihan Chen(vczh) ***********************************************************************/ #include "VlppWorkflowLibrary.h" #include "VlppWorkflowRuntime.h" #include "VlppReflection.h" #include "VlppOS.h" #include "Vlpp.h" #include "VlppRegex.h" #include "VlppParser.h" /*********************************************************************** .\EXPRESSION\WFEXPRESSION_AST.H ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_AST #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_AST namespace vl { namespace workflow { /// Token types. Values of enum items will be used in . enum class WfParserTokenIndex { /// Token EXP: /^ EXP = 0, /// Token ADD: /+ ADD = 1, /// Token SUB: - SUB = 2, /// Token MUL: /* MUL = 3, /// Token DIV: // DIV = 4, /// Token MOD: % MOD = 5, /// Token JOIN: & JOIN = 6, /// Token INTERSECTION: /| INTERSECTION = 7, /// Token LE: /</= LE = 8, /// Token GE: />/= GE = 9, /// Token LT: /< LT = 10, /// Token GT: /> GT = 11, /// Token EQ: /=/= EQ = 12, /// Token NE: /!/= NE = 13, /// Token ASSIGN: /= ASSIGN = 14, /// Token FAILED_THEN: /?/? FAILED_THEN = 15, /// Token QUESTION_MARK: /? QUESTION_MARK = 16, /// Token SCOPE_DELIMITER: :: SCOPE_DELIMITER = 17, /// Token COLON: : COLON = 18, /// Token SEMICOLON: ; SEMICOLON = 19, /// Token COMMA: , COMMA = 20, /// Token DOT: . DOT = 21, /// Token OPEN_ARRAY: /[ OPEN_ARRAY = 22, /// Token CLOSE_ARRAY: /] CLOSE_ARRAY = 23, /// Token OPEN_BRACE: /{ OPEN_BRACE = 24, /// Token CLOSE_BRACE: /} CLOSE_BRACE = 25, /// Token OPEN_BRACKET: /( OPEN_BRACKET = 26, /// Token CLOSE_BRACKET: /) CLOSE_BRACKET = 27, /// Token AT: @ AT = 28, /// Token TYPE_VOID: void TYPE_VOID = 29, /// Token TYPE_OBJECT: object TYPE_OBJECT = 30, /// Token TYPE_INTERFACE: interface TYPE_INTERFACE = 31, /// Token TYPE_INT: int TYPE_INT = 32, /// Token TYPE_UINT: uint TYPE_UINT = 33, /// Token TYPE_FLOAT: float TYPE_FLOAT = 34, /// Token TYPE_DOUBLE: double TYPE_DOUBLE = 35, /// Token TYPE_STRING: string TYPE_STRING = 36, /// Token TYPE_CHAR: char TYPE_CHAR = 37, /// Token TYPE_BOOL: bool TYPE_BOOL = 38, /// Token KEYWORD_CONST: const KEYWORD_CONST = 39, /// Token KEYWORD_SHL: shl KEYWORD_SHL = 40, /// Token KEYWORD_SHR: shr KEYWORD_SHR = 41, /// Token KEYWORD_XOR: xor KEYWORD_XOR = 42, /// Token KEYWORD_AND: and KEYWORD_AND = 43, /// Token KEYWORD_OR: or KEYWORD_OR = 44, /// Token KEYWORD_NOT: not KEYWORD_NOT = 45, /// Token KEYWORD_NULL: null KEYWORD_NULL = 46, /// Token KEYWORD_THIS: this KEYWORD_THIS = 47, /// Token KEYWORD_TRUE: true KEYWORD_TRUE = 48, /// Token KEYWORD_FALSE: false KEYWORD_FALSE = 49, /// Token KEYWORD_LET: let KEYWORD_LET = 50, /// Token KEYWORD_IN: in KEYWORD_IN = 51, /// Token KEYWORD_RANGE: range KEYWORD_RANGE = 52, /// Token KEYWORD_NEW: new KEYWORD_NEW = 53, /// Token KEYWORD_OF: of KEYWORD_OF = 54, /// Token KEYWORD_AS: as KEYWORD_AS = 55, /// Token KEYWORD_IS: is KEYWORD_IS = 56, /// Token KEYWORD_CAST: cast KEYWORD_CAST = 57, /// Token KEYWORD_FUNC: func KEYWORD_FUNC = 58, /// Token KEYWORD_TYPEOF: typeof KEYWORD_TYPEOF = 59, /// Token KEYWORD_TYPE: type KEYWORD_TYPE = 60, /// Token KEYWORD_BIND: bind KEYWORD_BIND = 61, /// Token KEYWORD_OBSERVE: observe KEYWORD_OBSERVE = 62, /// Token KEYWORD_ON: on KEYWORD_ON = 63, /// Token KEYWORD_ATTACH: attach KEYWORD_ATTACH = 64, /// Token KEYWORD_DETACH: detach KEYWORD_DETACH = 65, /// Token KEYWORD_GOTO: goto KEYWORD_GOTO = 66, /// Token KEYWORD_VAR: var KEYWORD_VAR = 67, /// Token KEYWORD_BREAK: break KEYWORD_BREAK = 68, /// Token KEYWORD_CONTINUE: continue KEYWORD_CONTINUE = 69, /// Token KEYWORD_RETURN: return KEYWORD_RETURN = 70, /// Token KEYWORD_DELETE: delete KEYWORD_DELETE = 71, /// Token KEYWORD_RAISE: raise KEYWORD_RAISE = 72, /// Token KEYWORD_IF: if KEYWORD_IF = 73, /// Token KEYWORD_ELSE: else KEYWORD_ELSE = 74, /// Token KEYWORD_SWITCH: switch KEYWORD_SWITCH = 75, /// Token KEYWORD_CASE: case KEYWORD_CASE = 76, /// Token KEYWORD_DEFAULT: default KEYWORD_DEFAULT = 77, /// Token KEYWORD_WHILE: while KEYWORD_WHILE = 78, /// Token KEYWORD_FOR: for KEYWORD_FOR = 79, /// Token KEYWORD_REVERSED: reversed KEYWORD_REVERSED = 80, /// Token KEYWORD_TRY: try KEYWORD_TRY = 81, /// Token KEYWORD_CATCH: catch KEYWORD_CATCH = 82, /// Token KEYWORD_FINALLY: finally KEYWORD_FINALLY = 83, /// Token KEYWORD_CLASS: class KEYWORD_CLASS = 84, /// Token KEYWORD_ENUM: enum KEYWORD_ENUM = 85, /// Token KEYWORD_FLAGENUM: flagenum KEYWORD_FLAGENUM = 86, /// Token KEYWORD_STRUCT: struct KEYWORD_STRUCT = 87, /// Token KEYWORD_PROP: prop KEYWORD_PROP = 88, /// Token KEYWORD_EVENT: event KEYWORD_EVENT = 89, /// Token KEYWORD_STATIC: static KEYWORD_STATIC = 90, /// Token KEYWORD_OVERRIDE: override KEYWORD_OVERRIDE = 91, /// Token KEYWORD_USING: using KEYWORD_USING = 92, /// Token KEYWORD_NAMESPACE: namespace KEYWORD_NAMESPACE = 93, /// Token KEYWORD_MODULE: module KEYWORD_MODULE = 94, /// Token KEYWORD_UNIT: unit KEYWORD_UNIT = 95, /// Token STATE_MACHINE: /$state_machine STATE_MACHINE = 96, /// Token STATE_INPUT: /$state_input STATE_INPUT = 97, /// Token STATE_SWITCH: /$switch STATE_SWITCH = 98, /// Token STATE_GOTO: /$goto_state STATE_GOTO = 99, /// Token STATE_PUSH: /$push_state STATE_PUSH = 100, /// Token STATE_DECL: /$state STATE_DECL = 101, /// Token COROUTINE_COROUTINE: /$coroutine COROUTINE_COROUTINE = 102, /// Token COROUTINE_PAUSE: /$pause COROUTINE_PAUSE = 103, /// Token COROUTINE_INTERFACE: /$interface COROUTINE_INTERFACE = 104, /// Token COROUTINE_OPERATOR: /$[A-Z]/w* COROUTINE_OPERATOR = 105, /// Token COROUTINE_SIGN: /$ COROUTINE_SIGN = 106, /// Token NAME: [a-zA-Z_]/w* NAME = 107, /// Token ORDERED_NAME: /$[0-9]* ORDERED_NAME = 108, /// Token FLOAT: /d+./d+ FLOAT = 109, /// Token INTEGER: /d+ INTEGER = 110, /// Token STRING: '([^'\\]|\\\.)*'|"([^"\\]|\\\.)*" STRING = 111, /// Token FORMATSTRING: /$('([^'\\]|\\\.)*'|"([^"\\]|\\\.)*") FORMATSTRING = 112, /// Discardable token SPACE: /s+ SPACE = 113, /// Discardable token COMMENT: ///*([^*]|/*+[^//])*/*+// COMMENT = 114, }; class WfClassMember; class WfType; class WfExpression; class WfStatement; class WfAttribute; class WfDeclaration; class WfPredefinedType; class WfTopQualifiedType; class WfReferenceType; class WfRawPointerType; class WfSharedPointerType; class WfNullableType; class WfEnumerableType; class WfMapType; class WfObservableListType; class WfFunctionType; class WfChildType; class WfNamespaceDeclaration; class WfFunctionArgument; class WfFunctionDeclaration; class WfVariableDeclaration; class WfEventDeclaration; class WfPropertyDeclaration; class WfBaseConstructorCall; class WfConstructorDeclaration; class WfDestructorDeclaration; class WfClassDeclaration; class WfEnumItemIntersection; class WfEnumItem; class WfEnumDeclaration; class WfStructMember; class WfStructDeclaration; class WfVirtualCfeDeclaration; class WfAutoPropertyDeclaration; class WfCastResultInterfaceDeclaration; class WfVirtualCseDeclaration; class WfStateInput; class WfStateDeclaration; class WfStateMachineDeclaration; class WfBreakStatement; class WfContinueStatement; class WfReturnStatement; class WfDeleteStatement; class WfRaiseExceptionStatement; class WfIfStatement; class WfWhileStatement; class WfTryStatement; class WfBlockStatement; class WfGotoStatement; class WfVariableStatement; class WfExpressionStatement; class WfVirtualCseStatement; class WfForEachStatement; class WfSwitchCase; class WfSwitchStatement; class WfCoProviderStatement; class WfCoroutineStatement; class WfCoPauseStatement; class WfCoOperatorStatement; class WfStateMachineStatement; class WfStateSwitchArgument; class WfStateSwitchCase; class WfStateSwitchStatement; class WfStateInvokeStatement; class WfThisExpression; class WfTopQualifiedExpression; class WfReferenceExpression; class WfOrderedNameExpression; class WfOrderedLambdaExpression; class WfMemberExpression; class WfChildExpression; class WfLiteralExpression; class WfFloatingExpression; class WfIntegerExpression; class WfStringExpression; class WfUnaryExpression; class WfBinaryExpression; class WfLetVariable; class WfLetExpression; class WfIfExpression; class WfRangeExpression; class WfSetTestingExpression; class WfConstructorArgument; class WfConstructorExpression; class WfInferExpression; class WfTypeCastingExpression; class WfTypeTestingExpression; class WfTypeOfTypeExpression; class WfTypeOfExpressionExpression; class WfAttachEventExpression; class WfDetachEventExpression; class WfObserveExpression; class WfCallExpression; class WfFunctionExpression; class WfNewClassExpression; class WfNewInterfaceExpression; class WfVirtualCfeExpression; class WfFormatExpression; class WfVirtualCseExpression; class WfBindExpression; class WfNewCoroutineExpression; class WfMixinCastExpression; class WfExpectedTypeCastExpression; class WfCoOperatorExpression; class WfModuleUsingFragment; class WfModuleUsingNameFragment; class WfModuleUsingWildCardFragment; class WfModuleUsingItem; class WfModuleUsingPath; class WfModule; enum class WfClassMemberKind { Static, Override, Normal, }; class WfClassMember : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: WfClassMemberKind kind; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfType abstract : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfPredefinedType* node)=0; virtual void Visit(WfTopQualifiedType* node)=0; virtual void Visit(WfReferenceType* node)=0; virtual void Visit(WfRawPointerType* node)=0; virtual void Visit(WfSharedPointerType* node)=0; virtual void Visit(WfNullableType* node)=0; virtual void Visit(WfEnumerableType* node)=0; virtual void Visit(WfMapType* node)=0; virtual void Visit(WfObservableListType* node)=0; virtual void Visit(WfFunctionType* node)=0; virtual void Visit(WfChildType* node)=0; }; virtual void Accept(WfType::IVisitor* visitor)=0; }; class WfExpression abstract : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfThisExpression* node)=0; virtual void Visit(WfTopQualifiedExpression* node)=0; virtual void Visit(WfReferenceExpression* node)=0; virtual void Visit(WfOrderedNameExpression* node)=0; virtual void Visit(WfOrderedLambdaExpression* node)=0; virtual void Visit(WfMemberExpression* node)=0; virtual void Visit(WfChildExpression* node)=0; virtual void Visit(WfLiteralExpression* node)=0; virtual void Visit(WfFloatingExpression* node)=0; virtual void Visit(WfIntegerExpression* node)=0; virtual void Visit(WfStringExpression* node)=0; virtual void Visit(WfUnaryExpression* node)=0; virtual void Visit(WfBinaryExpression* node)=0; virtual void Visit(WfLetExpression* node)=0; virtual void Visit(WfIfExpression* node)=0; virtual void Visit(WfRangeExpression* node)=0; virtual void Visit(WfSetTestingExpression* node)=0; virtual void Visit(WfConstructorExpression* node)=0; virtual void Visit(WfInferExpression* node)=0; virtual void Visit(WfTypeCastingExpression* node)=0; virtual void Visit(WfTypeTestingExpression* node)=0; virtual void Visit(WfTypeOfTypeExpression* node)=0; virtual void Visit(WfTypeOfExpressionExpression* node)=0; virtual void Visit(WfAttachEventExpression* node)=0; virtual void Visit(WfDetachEventExpression* node)=0; virtual void Visit(WfObserveExpression* node)=0; virtual void Visit(WfCallExpression* node)=0; virtual void Visit(WfFunctionExpression* node)=0; virtual void Visit(WfNewClassExpression* node)=0; virtual void Visit(WfNewInterfaceExpression* node)=0; virtual void Visit(WfVirtualCfeExpression* node)=0; virtual void Visit(WfVirtualCseExpression* node)=0; }; virtual void Accept(WfExpression::IVisitor* visitor)=0; }; class WfStatement abstract : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfBreakStatement* node)=0; virtual void Visit(WfContinueStatement* node)=0; virtual void Visit(WfReturnStatement* node)=0; virtual void Visit(WfDeleteStatement* node)=0; virtual void Visit(WfRaiseExceptionStatement* node)=0; virtual void Visit(WfIfStatement* node)=0; virtual void Visit(WfWhileStatement* node)=0; virtual void Visit(WfTryStatement* node)=0; virtual void Visit(WfBlockStatement* node)=0; virtual void Visit(WfGotoStatement* node)=0; virtual void Visit(WfVariableStatement* node)=0; virtual void Visit(WfExpressionStatement* node)=0; virtual void Visit(WfVirtualCseStatement* node)=0; virtual void Visit(WfCoroutineStatement* node)=0; virtual void Visit(WfStateMachineStatement* node)=0; }; virtual void Accept(WfStatement::IVisitor* visitor)=0; }; class WfAttribute : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken category; vl::parsing::ParsingToken name; vl::Ptr value; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfDeclaration abstract : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfNamespaceDeclaration* node)=0; virtual void Visit(WfFunctionDeclaration* node)=0; virtual void Visit(WfVariableDeclaration* node)=0; virtual void Visit(WfEventDeclaration* node)=0; virtual void Visit(WfPropertyDeclaration* node)=0; virtual void Visit(WfConstructorDeclaration* node)=0; virtual void Visit(WfDestructorDeclaration* node)=0; virtual void Visit(WfClassDeclaration* node)=0; virtual void Visit(WfEnumDeclaration* node)=0; virtual void Visit(WfStructDeclaration* node)=0; virtual void Visit(WfVirtualCfeDeclaration* node)=0; virtual void Visit(WfVirtualCseDeclaration* node)=0; }; virtual void Accept(WfDeclaration::IVisitor* visitor)=0; vl::collections::List> attributes; vl::parsing::ParsingToken name; vl::Ptr classMember; }; enum class WfPredefinedTypeName { Void, Object, Interface, Int, UInt, Float, Double, String, Char, Bool, }; class WfPredefinedType : public WfType, vl::reflection::Description { public: WfPredefinedTypeName name; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfTopQualifiedType : public WfType, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfReferenceType : public WfType, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfRawPointerType : public WfType, vl::reflection::Description { public: vl::Ptr element; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfSharedPointerType : public WfType, vl::reflection::Description { public: vl::Ptr element; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfNullableType : public WfType, vl::reflection::Description { public: vl::Ptr element; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfEnumerableType : public WfType, vl::reflection::Description { public: vl::Ptr element; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfMapWritability { Readonly, Writable, }; class WfMapType : public WfType, vl::reflection::Description { public: WfMapWritability writability; vl::Ptr key; vl::Ptr value; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfObservableListType : public WfType, vl::reflection::Description { public: vl::Ptr element; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfFunctionType : public WfType, vl::reflection::Description { public: vl::Ptr result; vl::collections::List> arguments; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfChildType : public WfType, vl::reflection::Description { public: vl::Ptr parent; vl::parsing::ParsingToken name; void Accept(WfType::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfNamespaceDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::collections::List> declarations; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfFunctionArgument : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::collections::List> attributes; vl::parsing::ParsingToken name; vl::Ptr type; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfFunctionAnonymity { Named, Anonymous, }; class WfFunctionDeclaration : public WfDeclaration, vl::reflection::Description { public: WfFunctionAnonymity anonymity; vl::collections::List> arguments; vl::Ptr returnType; vl::Ptr statement; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVariableDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::Ptr type; vl::Ptr expression; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfEventDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::collections::List> arguments; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfPropertyDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::Ptr type; vl::parsing::ParsingToken getter; vl::parsing::ParsingToken setter; vl::parsing::ParsingToken valueChangedEvent; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfClassKind { Class, Interface, }; enum class WfConstructorType { Undefined, SharedPtr, RawPtr, }; class WfBaseConstructorCall : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::Ptr type; vl::collections::List> arguments; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfConstructorDeclaration : public WfDeclaration, vl::reflection::Description { public: WfConstructorType constructorType; vl::collections::List> baseConstructorCalls; vl::collections::List> arguments; vl::Ptr statement; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfDestructorDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::Ptr statement; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfClassDeclaration : public WfDeclaration, vl::reflection::Description { public: WfClassKind kind; WfConstructorType constructorType; vl::collections::List> baseTypes; vl::collections::List> declarations; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfEnumKind { Normal, Flag, }; enum class WfEnumItemKind { Constant, Intersection, }; class WfEnumItemIntersection : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfEnumItem : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::collections::List> attributes; vl::parsing::ParsingToken name; WfEnumItemKind kind; vl::parsing::ParsingToken number; vl::collections::List> intersections; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfEnumDeclaration : public WfDeclaration, vl::reflection::Description { public: WfEnumKind kind; vl::collections::List> items; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStructMember : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::collections::List> attributes; vl::parsing::ParsingToken name; vl::Ptr type; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStructDeclaration : public WfDeclaration, vl::reflection::Description { public: vl::collections::List> members; void Accept(WfDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVirtualCfeDeclaration abstract : public WfDeclaration, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfAutoPropertyDeclaration* node)=0; virtual void Visit(WfCastResultInterfaceDeclaration* node)=0; }; virtual void Accept(WfVirtualCfeDeclaration::IVisitor* visitor)=0; vl::collections::List> expandedDeclarations; void Accept(WfDeclaration::IVisitor* visitor)override; }; enum class WfAPConst { Readonly, Writable, }; enum class WfAPObserve { Observable, NotObservable, }; class WfAutoPropertyDeclaration : public WfVirtualCfeDeclaration, vl::reflection::Description { public: vl::Ptr type; WfAPConst configConst; WfAPObserve configObserve; vl::Ptr expression; void Accept(WfVirtualCfeDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCastResultInterfaceDeclaration : public WfVirtualCfeDeclaration, vl::reflection::Description { public: vl::Ptr baseType; vl::Ptr elementType; void Accept(WfVirtualCfeDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVirtualCseDeclaration abstract : public WfDeclaration, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfStateMachineDeclaration* node)=0; }; virtual void Accept(WfVirtualCseDeclaration::IVisitor* visitor)=0; vl::collections::List> expandedDeclarations; void Accept(WfDeclaration::IVisitor* visitor)override; }; class WfStateInput : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::collections::List> arguments; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStateDeclaration : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::collections::List> arguments; vl::Ptr statement; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStateMachineDeclaration : public WfVirtualCseDeclaration, vl::reflection::Description { public: vl::collections::List> inputs; vl::collections::List> states; void Accept(WfVirtualCseDeclaration::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfBreakStatement : public WfStatement, vl::reflection::Description { public: void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfContinueStatement : public WfStatement, vl::reflection::Description { public: void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfReturnStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfDeleteStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfRaiseExceptionStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfIfStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr type; vl::parsing::ParsingToken name; vl::Ptr expression; vl::Ptr trueBranch; vl::Ptr falseBranch; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfWhileStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr condition; vl::Ptr statement; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfTryStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr protectedStatement; vl::parsing::ParsingToken name; vl::Ptr catchStatement; vl::Ptr finallyStatement; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfBlockStatement : public WfStatement, vl::reflection::Description { public: vl::collections::List> statements; vl::parsing::ParsingToken endLabel; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfGotoStatement : public WfStatement, vl::reflection::Description { public: vl::parsing::ParsingToken label; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVariableStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr variable; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfExpressionStatement : public WfStatement, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVirtualCseStatement abstract : public WfStatement, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfForEachStatement* node)=0; virtual void Visit(WfSwitchStatement* node)=0; virtual void Visit(WfCoProviderStatement* node)=0; }; virtual void Accept(WfVirtualCseStatement::IVisitor* visitor)=0; vl::Ptr expandedStatement; void Accept(WfStatement::IVisitor* visitor)override; }; enum class WfForEachDirection { Normal, Reversed, }; class WfForEachStatement : public WfVirtualCseStatement, vl::reflection::Description { public: vl::parsing::ParsingToken name; WfForEachDirection direction; vl::Ptr collection; vl::Ptr statement; void Accept(WfVirtualCseStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfSwitchCase : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::Ptr expression; vl::Ptr statement; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfSwitchStatement : public WfVirtualCseStatement, vl::reflection::Description { public: vl::Ptr expression; vl::collections::List> caseBranches; vl::Ptr defaultBranch; void Accept(WfVirtualCseStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCoProviderStatement : public WfVirtualCseStatement, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::Ptr statement; void Accept(WfVirtualCseStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCoroutineStatement abstract : public WfStatement, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfCoPauseStatement* node)=0; virtual void Visit(WfCoOperatorStatement* node)=0; }; virtual void Accept(WfCoroutineStatement::IVisitor* visitor)=0; void Accept(WfStatement::IVisitor* visitor)override; }; class WfCoPauseStatement : public WfCoroutineStatement, vl::reflection::Description { public: vl::Ptr statement; void Accept(WfCoroutineStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCoOperatorStatement : public WfCoroutineStatement, vl::reflection::Description { public: vl::parsing::ParsingToken varName; vl::parsing::ParsingToken opName; vl::collections::List> arguments; void Accept(WfCoroutineStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfStateSwitchType { Default, Pass, PassAndReturn, Ignore, IgnoreAndReturn, }; enum class WfStateInvokeType { Goto, Push, }; class WfStateMachineStatement abstract : public WfStatement, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfStateSwitchStatement* node)=0; virtual void Visit(WfStateInvokeStatement* node)=0; }; virtual void Accept(WfStateMachineStatement::IVisitor* visitor)=0; void Accept(WfStatement::IVisitor* visitor)override; }; class WfStateSwitchArgument : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStateSwitchCase : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::collections::List> arguments; vl::Ptr statement; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStateSwitchStatement : public WfStateMachineStatement, vl::reflection::Description { public: WfStateSwitchType type; vl::collections::List> caseBranches; void Accept(WfStateMachineStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStateInvokeStatement : public WfStateMachineStatement, vl::reflection::Description { public: WfStateInvokeType type; vl::parsing::ParsingToken name; vl::collections::List> arguments; void Accept(WfStateMachineStatement::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfThisExpression : public WfExpression, vl::reflection::Description { public: void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfTopQualifiedExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfReferenceExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfOrderedNameExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfOrderedLambdaExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr body; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfMemberExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr parent; vl::parsing::ParsingToken name; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfChildExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr parent; vl::parsing::ParsingToken name; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfLiteralValue { Null, True, False, }; class WfLiteralExpression : public WfExpression, vl::reflection::Description { public: WfLiteralValue value; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfFloatingExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken value; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfIntegerExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken value; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfStringExpression : public WfExpression, vl::reflection::Description { public: vl::parsing::ParsingToken value; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfUnaryOperator { Positive, Negative, Not, }; class WfUnaryExpression : public WfExpression, vl::reflection::Description { public: WfUnaryOperator op; vl::Ptr operand; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfBinaryOperator { Assign, Index, FlagAnd, FlagOr, FailedThen, Exp, Add, Sub, Mul, Div, Mod, Shl, Shr, LT, GT, LE, GE, EQ, NE, Xor, And, Or, }; class WfBinaryExpression : public WfExpression, vl::reflection::Description { public: WfBinaryOperator op; vl::Ptr first; vl::Ptr second; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfLetVariable : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::Ptr value; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfLetExpression : public WfExpression, vl::reflection::Description { public: vl::collections::List> variables; vl::Ptr expression; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfIfExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr condition; vl::Ptr trueBranch; vl::Ptr falseBranch; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfRangeBoundary { Inclusive, Exclusive, }; class WfRangeExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr begin; WfRangeBoundary beginBoundary; vl::Ptr end; WfRangeBoundary endBoundary; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfSetTesting { In, NotIn, }; class WfSetTestingExpression : public WfExpression, vl::reflection::Description { public: WfSetTesting test; vl::Ptr element; vl::Ptr collection; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfConstructorArgument : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::Ptr key; vl::Ptr value; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfConstructorExpression : public WfExpression, vl::reflection::Description { public: vl::collections::List> arguments; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfInferExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr expression; vl::Ptr type; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfTypeCastingStrategy { Strong, Weak, }; class WfTypeCastingExpression : public WfExpression, vl::reflection::Description { public: WfTypeCastingStrategy strategy; vl::Ptr expression; vl::Ptr type; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfTypeTesting { IsType, IsNotType, IsNull, IsNotNull, }; class WfTypeTestingExpression : public WfExpression, vl::reflection::Description { public: WfTypeTesting test; vl::Ptr expression; vl::Ptr type; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfTypeOfTypeExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr type; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfTypeOfExpressionExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfAttachEventExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr event; vl::Ptr function; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfDetachEventExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr event; vl::Ptr handler; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfObserveType { SimpleObserve, ExtendedObserve, }; class WfObserveExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr parent; WfObserveType observeType; vl::parsing::ParsingToken name; vl::Ptr expression; vl::collections::List> events; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCallExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr function; vl::collections::List> arguments; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfFunctionExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr function; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfNewClassExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr type; vl::collections::List> arguments; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfNewInterfaceExpression : public WfExpression, vl::reflection::Description { public: vl::Ptr type; vl::collections::List> declarations; void Accept(WfExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVirtualCfeExpression abstract : public WfExpression, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfFormatExpression* node)=0; }; virtual void Accept(WfVirtualCfeExpression::IVisitor* visitor)=0; vl::Ptr expandedExpression; void Accept(WfExpression::IVisitor* visitor)override; }; class WfFormatExpression : public WfVirtualCfeExpression, vl::reflection::Description { public: vl::parsing::ParsingToken value; void Accept(WfVirtualCfeExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfVirtualCseExpression abstract : public WfExpression, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfBindExpression* node)=0; virtual void Visit(WfNewCoroutineExpression* node)=0; virtual void Visit(WfMixinCastExpression* node)=0; virtual void Visit(WfExpectedTypeCastExpression* node)=0; virtual void Visit(WfCoOperatorExpression* node)=0; }; virtual void Accept(WfVirtualCseExpression::IVisitor* visitor)=0; vl::Ptr expandedExpression; void Accept(WfExpression::IVisitor* visitor)override; }; class WfBindExpression : public WfVirtualCseExpression, vl::reflection::Description { public: vl::Ptr expression; void Accept(WfVirtualCseExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfNewCoroutineExpression : public WfVirtualCseExpression, vl::reflection::Description { public: vl::parsing::ParsingToken name; vl::Ptr statement; void Accept(WfVirtualCseExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfMixinCastExpression : public WfVirtualCseExpression, vl::reflection::Description { public: vl::Ptr type; vl::Ptr expression; void Accept(WfVirtualCseExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfExpectedTypeCastExpression : public WfVirtualCseExpression, vl::reflection::Description { public: WfTypeCastingStrategy strategy; vl::Ptr expression; void Accept(WfVirtualCseExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfCoOperatorExpression : public WfVirtualCseExpression, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfVirtualCseExpression::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfModuleUsingFragment abstract : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: class IVisitor : public vl::reflection::IDescriptable, vl::reflection::Description { public: virtual void Visit(WfModuleUsingNameFragment* node)=0; virtual void Visit(WfModuleUsingWildCardFragment* node)=0; }; virtual void Accept(WfModuleUsingFragment::IVisitor* visitor)=0; }; class WfModuleUsingNameFragment : public WfModuleUsingFragment, vl::reflection::Description { public: vl::parsing::ParsingToken name; void Accept(WfModuleUsingFragment::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfModuleUsingWildCardFragment : public WfModuleUsingFragment, vl::reflection::Description { public: void Accept(WfModuleUsingFragment::IVisitor* visitor)override; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfModuleUsingItem : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::collections::List> fragments; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; class WfModuleUsingPath : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: vl::collections::List> items; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; enum class WfModuleType { Module, Unit, }; class WfModule : public vl::parsing::ParsingTreeCustomBase, vl::reflection::Description { public: WfModuleType moduleType; vl::parsing::ParsingToken name; vl::collections::List> paths; vl::collections::List> declarations; static vl::Ptr Convert(vl::Ptr node, const vl::collections::List& tokens); }; } } namespace vl { namespace reflection { namespace description { #ifndef VCZH_DEBUG_NO_REFLECTION DECL_TYPE_INFO(vl::workflow::WfClassMemberKind) DECL_TYPE_INFO(vl::workflow::WfClassMember) DECL_TYPE_INFO(vl::workflow::WfType) DECL_TYPE_INFO(vl::workflow::WfExpression) DECL_TYPE_INFO(vl::workflow::WfStatement) DECL_TYPE_INFO(vl::workflow::WfAttribute) DECL_TYPE_INFO(vl::workflow::WfDeclaration) DECL_TYPE_INFO(vl::workflow::WfPredefinedTypeName) DECL_TYPE_INFO(vl::workflow::WfPredefinedType) DECL_TYPE_INFO(vl::workflow::WfTopQualifiedType) DECL_TYPE_INFO(vl::workflow::WfReferenceType) DECL_TYPE_INFO(vl::workflow::WfRawPointerType) DECL_TYPE_INFO(vl::workflow::WfSharedPointerType) DECL_TYPE_INFO(vl::workflow::WfNullableType) DECL_TYPE_INFO(vl::workflow::WfEnumerableType) DECL_TYPE_INFO(vl::workflow::WfMapWritability) DECL_TYPE_INFO(vl::workflow::WfMapType) DECL_TYPE_INFO(vl::workflow::WfObservableListType) DECL_TYPE_INFO(vl::workflow::WfFunctionType) DECL_TYPE_INFO(vl::workflow::WfChildType) DECL_TYPE_INFO(vl::workflow::WfNamespaceDeclaration) DECL_TYPE_INFO(vl::workflow::WfFunctionArgument) DECL_TYPE_INFO(vl::workflow::WfFunctionAnonymity) DECL_TYPE_INFO(vl::workflow::WfFunctionDeclaration) DECL_TYPE_INFO(vl::workflow::WfVariableDeclaration) DECL_TYPE_INFO(vl::workflow::WfEventDeclaration) DECL_TYPE_INFO(vl::workflow::WfPropertyDeclaration) DECL_TYPE_INFO(vl::workflow::WfClassKind) DECL_TYPE_INFO(vl::workflow::WfConstructorType) DECL_TYPE_INFO(vl::workflow::WfBaseConstructorCall) DECL_TYPE_INFO(vl::workflow::WfConstructorDeclaration) DECL_TYPE_INFO(vl::workflow::WfDestructorDeclaration) DECL_TYPE_INFO(vl::workflow::WfClassDeclaration) DECL_TYPE_INFO(vl::workflow::WfEnumKind) DECL_TYPE_INFO(vl::workflow::WfEnumItemKind) DECL_TYPE_INFO(vl::workflow::WfEnumItemIntersection) DECL_TYPE_INFO(vl::workflow::WfEnumItem) DECL_TYPE_INFO(vl::workflow::WfEnumDeclaration) DECL_TYPE_INFO(vl::workflow::WfStructMember) DECL_TYPE_INFO(vl::workflow::WfStructDeclaration) DECL_TYPE_INFO(vl::workflow::WfVirtualCfeDeclaration) DECL_TYPE_INFO(vl::workflow::WfAPConst) DECL_TYPE_INFO(vl::workflow::WfAPObserve) DECL_TYPE_INFO(vl::workflow::WfAutoPropertyDeclaration) DECL_TYPE_INFO(vl::workflow::WfCastResultInterfaceDeclaration) DECL_TYPE_INFO(vl::workflow::WfVirtualCseDeclaration) DECL_TYPE_INFO(vl::workflow::WfStateInput) DECL_TYPE_INFO(vl::workflow::WfStateDeclaration) DECL_TYPE_INFO(vl::workflow::WfStateMachineDeclaration) DECL_TYPE_INFO(vl::workflow::WfBreakStatement) DECL_TYPE_INFO(vl::workflow::WfContinueStatement) DECL_TYPE_INFO(vl::workflow::WfReturnStatement) DECL_TYPE_INFO(vl::workflow::WfDeleteStatement) DECL_TYPE_INFO(vl::workflow::WfRaiseExceptionStatement) DECL_TYPE_INFO(vl::workflow::WfIfStatement) DECL_TYPE_INFO(vl::workflow::WfWhileStatement) DECL_TYPE_INFO(vl::workflow::WfTryStatement) DECL_TYPE_INFO(vl::workflow::WfBlockStatement) DECL_TYPE_INFO(vl::workflow::WfGotoStatement) DECL_TYPE_INFO(vl::workflow::WfVariableStatement) DECL_TYPE_INFO(vl::workflow::WfExpressionStatement) DECL_TYPE_INFO(vl::workflow::WfVirtualCseStatement) DECL_TYPE_INFO(vl::workflow::WfForEachDirection) DECL_TYPE_INFO(vl::workflow::WfForEachStatement) DECL_TYPE_INFO(vl::workflow::WfSwitchCase) DECL_TYPE_INFO(vl::workflow::WfSwitchStatement) DECL_TYPE_INFO(vl::workflow::WfCoProviderStatement) DECL_TYPE_INFO(vl::workflow::WfCoroutineStatement) DECL_TYPE_INFO(vl::workflow::WfCoPauseStatement) DECL_TYPE_INFO(vl::workflow::WfCoOperatorStatement) DECL_TYPE_INFO(vl::workflow::WfStateSwitchType) DECL_TYPE_INFO(vl::workflow::WfStateInvokeType) DECL_TYPE_INFO(vl::workflow::WfStateMachineStatement) DECL_TYPE_INFO(vl::workflow::WfStateSwitchArgument) DECL_TYPE_INFO(vl::workflow::WfStateSwitchCase) DECL_TYPE_INFO(vl::workflow::WfStateSwitchStatement) DECL_TYPE_INFO(vl::workflow::WfStateInvokeStatement) DECL_TYPE_INFO(vl::workflow::WfThisExpression) DECL_TYPE_INFO(vl::workflow::WfTopQualifiedExpression) DECL_TYPE_INFO(vl::workflow::WfReferenceExpression) DECL_TYPE_INFO(vl::workflow::WfOrderedNameExpression) DECL_TYPE_INFO(vl::workflow::WfOrderedLambdaExpression) DECL_TYPE_INFO(vl::workflow::WfMemberExpression) DECL_TYPE_INFO(vl::workflow::WfChildExpression) DECL_TYPE_INFO(vl::workflow::WfLiteralValue) DECL_TYPE_INFO(vl::workflow::WfLiteralExpression) DECL_TYPE_INFO(vl::workflow::WfFloatingExpression) DECL_TYPE_INFO(vl::workflow::WfIntegerExpression) DECL_TYPE_INFO(vl::workflow::WfStringExpression) DECL_TYPE_INFO(vl::workflow::WfUnaryOperator) DECL_TYPE_INFO(vl::workflow::WfUnaryExpression) DECL_TYPE_INFO(vl::workflow::WfBinaryOperator) DECL_TYPE_INFO(vl::workflow::WfBinaryExpression) DECL_TYPE_INFO(vl::workflow::WfLetVariable) DECL_TYPE_INFO(vl::workflow::WfLetExpression) DECL_TYPE_INFO(vl::workflow::WfIfExpression) DECL_TYPE_INFO(vl::workflow::WfRangeBoundary) DECL_TYPE_INFO(vl::workflow::WfRangeExpression) DECL_TYPE_INFO(vl::workflow::WfSetTesting) DECL_TYPE_INFO(vl::workflow::WfSetTestingExpression) DECL_TYPE_INFO(vl::workflow::WfConstructorArgument) DECL_TYPE_INFO(vl::workflow::WfConstructorExpression) DECL_TYPE_INFO(vl::workflow::WfInferExpression) DECL_TYPE_INFO(vl::workflow::WfTypeCastingStrategy) DECL_TYPE_INFO(vl::workflow::WfTypeCastingExpression) DECL_TYPE_INFO(vl::workflow::WfTypeTesting) DECL_TYPE_INFO(vl::workflow::WfTypeTestingExpression) DECL_TYPE_INFO(vl::workflow::WfTypeOfTypeExpression) DECL_TYPE_INFO(vl::workflow::WfTypeOfExpressionExpression) DECL_TYPE_INFO(vl::workflow::WfAttachEventExpression) DECL_TYPE_INFO(vl::workflow::WfDetachEventExpression) DECL_TYPE_INFO(vl::workflow::WfObserveType) DECL_TYPE_INFO(vl::workflow::WfObserveExpression) DECL_TYPE_INFO(vl::workflow::WfCallExpression) DECL_TYPE_INFO(vl::workflow::WfFunctionExpression) DECL_TYPE_INFO(vl::workflow::WfNewClassExpression) DECL_TYPE_INFO(vl::workflow::WfNewInterfaceExpression) DECL_TYPE_INFO(vl::workflow::WfVirtualCfeExpression) DECL_TYPE_INFO(vl::workflow::WfFormatExpression) DECL_TYPE_INFO(vl::workflow::WfVirtualCseExpression) DECL_TYPE_INFO(vl::workflow::WfBindExpression) DECL_TYPE_INFO(vl::workflow::WfNewCoroutineExpression) DECL_TYPE_INFO(vl::workflow::WfMixinCastExpression) DECL_TYPE_INFO(vl::workflow::WfExpectedTypeCastExpression) DECL_TYPE_INFO(vl::workflow::WfCoOperatorExpression) DECL_TYPE_INFO(vl::workflow::WfModuleUsingFragment) DECL_TYPE_INFO(vl::workflow::WfModuleUsingNameFragment) DECL_TYPE_INFO(vl::workflow::WfModuleUsingWildCardFragment) DECL_TYPE_INFO(vl::workflow::WfModuleUsingItem) DECL_TYPE_INFO(vl::workflow::WfModuleUsingPath) DECL_TYPE_INFO(vl::workflow::WfModuleType) DECL_TYPE_INFO(vl::workflow::WfModule) DECL_TYPE_INFO(vl::workflow::WfType::IVisitor) DECL_TYPE_INFO(vl::workflow::WfExpression::IVisitor) DECL_TYPE_INFO(vl::workflow::WfStatement::IVisitor) DECL_TYPE_INFO(vl::workflow::WfDeclaration::IVisitor) DECL_TYPE_INFO(vl::workflow::WfVirtualCfeDeclaration::IVisitor) DECL_TYPE_INFO(vl::workflow::WfVirtualCseDeclaration::IVisitor) DECL_TYPE_INFO(vl::workflow::WfVirtualCseStatement::IVisitor) DECL_TYPE_INFO(vl::workflow::WfCoroutineStatement::IVisitor) DECL_TYPE_INFO(vl::workflow::WfStateMachineStatement::IVisitor) DECL_TYPE_INFO(vl::workflow::WfVirtualCfeExpression::IVisitor) DECL_TYPE_INFO(vl::workflow::WfVirtualCseExpression::IVisitor) DECL_TYPE_INFO(vl::workflow::WfModuleUsingFragment::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfType::IVisitor) void Visit(vl::workflow::WfPredefinedType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTopQualifiedType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfReferenceType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfRawPointerType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfSharedPointerType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfNullableType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfEnumerableType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfMapType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfObservableListType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfFunctionType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfChildType* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfType::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfExpression::IVisitor) void Visit(vl::workflow::WfThisExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTopQualifiedExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfReferenceExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfOrderedNameExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfOrderedLambdaExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfMemberExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfChildExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfLiteralExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfFloatingExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfIntegerExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfStringExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfUnaryExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfBinaryExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfLetExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfIfExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfRangeExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfSetTestingExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfConstructorExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfInferExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTypeCastingExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTypeTestingExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTypeOfTypeExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTypeOfExpressionExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfAttachEventExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfDetachEventExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfObserveExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCallExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfFunctionExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfNewClassExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfNewInterfaceExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVirtualCfeExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVirtualCseExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfExpression::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfStatement::IVisitor) void Visit(vl::workflow::WfBreakStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfContinueStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfReturnStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfDeleteStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfRaiseExceptionStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfIfStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfWhileStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfTryStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfBlockStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfGotoStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVariableStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfExpressionStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVirtualCseStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCoroutineStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfStateMachineStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfStatement::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfDeclaration::IVisitor) void Visit(vl::workflow::WfNamespaceDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfFunctionDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVariableDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfEventDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfPropertyDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfConstructorDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfDestructorDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfClassDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfEnumDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfStructDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVirtualCfeDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfVirtualCseDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfDeclaration::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfVirtualCfeDeclaration::IVisitor) void Visit(vl::workflow::WfAutoPropertyDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCastResultInterfaceDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfVirtualCfeDeclaration::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfVirtualCseDeclaration::IVisitor) void Visit(vl::workflow::WfStateMachineDeclaration* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfVirtualCseDeclaration::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfVirtualCseStatement::IVisitor) void Visit(vl::workflow::WfForEachStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfSwitchStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCoProviderStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfVirtualCseStatement::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfCoroutineStatement::IVisitor) void Visit(vl::workflow::WfCoPauseStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCoOperatorStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfCoroutineStatement::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfStateMachineStatement::IVisitor) void Visit(vl::workflow::WfStateSwitchStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfStateInvokeStatement* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfStateMachineStatement::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfVirtualCfeExpression::IVisitor) void Visit(vl::workflow::WfFormatExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfVirtualCfeExpression::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfVirtualCseExpression::IVisitor) void Visit(vl::workflow::WfBindExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfNewCoroutineExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfMixinCastExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfExpectedTypeCastExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfCoOperatorExpression* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfVirtualCseExpression::IVisitor) BEGIN_INTERFACE_PROXY_NOPARENT_SHAREDPTR(vl::workflow::WfModuleUsingFragment::IVisitor) void Visit(vl::workflow::WfModuleUsingNameFragment* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } void Visit(vl::workflow::WfModuleUsingWildCardFragment* node)override { INVOKE_INTERFACE_PROXY(Visit, node); } END_INTERFACE_PROXY(vl::workflow::WfModuleUsingFragment::IVisitor) #endif /// Load all reflectable AST types, only available when VCZH_DEBUG_NO_REFLECTION is off. /// Returns true if this operation succeeded. extern bool WfLoadTypes(); } } } #endif /*********************************************************************** .\EXPRESSION\WFEXPRESSION_COPY.H ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_COPY #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_COPY namespace vl { namespace workflow { namespace copy_visitor { class VisitorBase : public Object { public: vl::Ptr result; }; /// A copy visitor, overriding all abstract methods with AST copying code. class TypeVisitor : public virtual VisitorBase, public WfType::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfPredefinedType* from, WfPredefinedType* to); void CopyFields(WfType* from, WfType* to); void CopyFields(WfTopQualifiedType* from, WfTopQualifiedType* to); void CopyFields(WfReferenceType* from, WfReferenceType* to); void CopyFields(WfRawPointerType* from, WfRawPointerType* to); void CopyFields(WfSharedPointerType* from, WfSharedPointerType* to); void CopyFields(WfNullableType* from, WfNullableType* to); void CopyFields(WfEnumerableType* from, WfEnumerableType* to); void CopyFields(WfMapType* from, WfMapType* to); void CopyFields(WfObservableListType* from, WfObservableListType* to); void CopyFields(WfFunctionType* from, WfFunctionType* to); void CopyFields(WfChildType* from, WfChildType* to); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfPredefinedType* node)override; void Visit(WfTopQualifiedType* node)override; void Visit(WfReferenceType* node)override; void Visit(WfRawPointerType* node)override; void Visit(WfSharedPointerType* node)override; void Visit(WfNullableType* node)override; void Visit(WfEnumerableType* node)override; void Visit(WfMapType* node)override; void Visit(WfObservableListType* node)override; void Visit(WfFunctionType* node)override; void Visit(WfChildType* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class ExpressionVisitor : public virtual VisitorBase, public WfExpression::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfThisExpression* from, WfThisExpression* to); void CopyFields(WfExpression* from, WfExpression* to); void CopyFields(WfTopQualifiedExpression* from, WfTopQualifiedExpression* to); void CopyFields(WfReferenceExpression* from, WfReferenceExpression* to); void CopyFields(WfOrderedNameExpression* from, WfOrderedNameExpression* to); void CopyFields(WfOrderedLambdaExpression* from, WfOrderedLambdaExpression* to); void CopyFields(WfMemberExpression* from, WfMemberExpression* to); void CopyFields(WfChildExpression* from, WfChildExpression* to); void CopyFields(WfLiteralExpression* from, WfLiteralExpression* to); void CopyFields(WfFloatingExpression* from, WfFloatingExpression* to); void CopyFields(WfIntegerExpression* from, WfIntegerExpression* to); void CopyFields(WfStringExpression* from, WfStringExpression* to); void CopyFields(WfUnaryExpression* from, WfUnaryExpression* to); void CopyFields(WfBinaryExpression* from, WfBinaryExpression* to); void CopyFields(WfLetExpression* from, WfLetExpression* to); void CopyFields(WfLetVariable* from, WfLetVariable* to); void CopyFields(WfIfExpression* from, WfIfExpression* to); void CopyFields(WfRangeExpression* from, WfRangeExpression* to); void CopyFields(WfSetTestingExpression* from, WfSetTestingExpression* to); void CopyFields(WfConstructorExpression* from, WfConstructorExpression* to); void CopyFields(WfConstructorArgument* from, WfConstructorArgument* to); void CopyFields(WfInferExpression* from, WfInferExpression* to); void CopyFields(WfTypeCastingExpression* from, WfTypeCastingExpression* to); void CopyFields(WfTypeTestingExpression* from, WfTypeTestingExpression* to); void CopyFields(WfTypeOfTypeExpression* from, WfTypeOfTypeExpression* to); void CopyFields(WfTypeOfExpressionExpression* from, WfTypeOfExpressionExpression* to); void CopyFields(WfAttachEventExpression* from, WfAttachEventExpression* to); void CopyFields(WfDetachEventExpression* from, WfDetachEventExpression* to); void CopyFields(WfObserveExpression* from, WfObserveExpression* to); void CopyFields(WfCallExpression* from, WfCallExpression* to); void CopyFields(WfFunctionExpression* from, WfFunctionExpression* to); void CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to); void CopyFields(WfDeclaration* from, WfDeclaration* to); void CopyFields(WfAttribute* from, WfAttribute* to); void CopyFields(WfClassMember* from, WfClassMember* to); void CopyFields(WfFunctionArgument* from, WfFunctionArgument* to); void CopyFields(WfNewClassExpression* from, WfNewClassExpression* to); void CopyFields(WfNewInterfaceExpression* from, WfNewInterfaceExpression* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Dispatch (virtual) -------------------------------- virtual vl::Ptr Dispatch(WfVirtualCfeExpression* node) = 0; virtual vl::Ptr Dispatch(WfVirtualCseExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfThisExpression* node)override; void Visit(WfTopQualifiedExpression* node)override; void Visit(WfReferenceExpression* node)override; void Visit(WfOrderedNameExpression* node)override; void Visit(WfOrderedLambdaExpression* node)override; void Visit(WfMemberExpression* node)override; void Visit(WfChildExpression* node)override; void Visit(WfLiteralExpression* node)override; void Visit(WfFloatingExpression* node)override; void Visit(WfIntegerExpression* node)override; void Visit(WfStringExpression* node)override; void Visit(WfUnaryExpression* node)override; void Visit(WfBinaryExpression* node)override; void Visit(WfLetExpression* node)override; void Visit(WfIfExpression* node)override; void Visit(WfRangeExpression* node)override; void Visit(WfSetTestingExpression* node)override; void Visit(WfConstructorExpression* node)override; void Visit(WfInferExpression* node)override; void Visit(WfTypeCastingExpression* node)override; void Visit(WfTypeTestingExpression* node)override; void Visit(WfTypeOfTypeExpression* node)override; void Visit(WfTypeOfExpressionExpression* node)override; void Visit(WfAttachEventExpression* node)override; void Visit(WfDetachEventExpression* node)override; void Visit(WfObserveExpression* node)override; void Visit(WfCallExpression* node)override; void Visit(WfFunctionExpression* node)override; void Visit(WfNewClassExpression* node)override; void Visit(WfNewInterfaceExpression* node)override; void Visit(WfVirtualCfeExpression* node)override; void Visit(WfVirtualCseExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class StatementVisitor : public virtual VisitorBase, public WfStatement::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfBreakStatement* from, WfBreakStatement* to); void CopyFields(WfStatement* from, WfStatement* to); void CopyFields(WfContinueStatement* from, WfContinueStatement* to); void CopyFields(WfReturnStatement* from, WfReturnStatement* to); void CopyFields(WfDeleteStatement* from, WfDeleteStatement* to); void CopyFields(WfRaiseExceptionStatement* from, WfRaiseExceptionStatement* to); void CopyFields(WfIfStatement* from, WfIfStatement* to); void CopyFields(WfWhileStatement* from, WfWhileStatement* to); void CopyFields(WfTryStatement* from, WfTryStatement* to); void CopyFields(WfBlockStatement* from, WfBlockStatement* to); void CopyFields(WfGotoStatement* from, WfGotoStatement* to); void CopyFields(WfVariableStatement* from, WfVariableStatement* to); void CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to); void CopyFields(WfDeclaration* from, WfDeclaration* to); void CopyFields(WfAttribute* from, WfAttribute* to); void CopyFields(WfClassMember* from, WfClassMember* to); void CopyFields(WfExpressionStatement* from, WfExpressionStatement* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Dispatch (virtual) -------------------------------- virtual vl::Ptr Dispatch(WfVirtualCseStatement* node) = 0; virtual vl::Ptr Dispatch(WfCoroutineStatement* node) = 0; virtual vl::Ptr Dispatch(WfStateMachineStatement* node) = 0; // Visitor Members ----------------------------------- void Visit(WfBreakStatement* node)override; void Visit(WfContinueStatement* node)override; void Visit(WfReturnStatement* node)override; void Visit(WfDeleteStatement* node)override; void Visit(WfRaiseExceptionStatement* node)override; void Visit(WfIfStatement* node)override; void Visit(WfWhileStatement* node)override; void Visit(WfTryStatement* node)override; void Visit(WfBlockStatement* node)override; void Visit(WfGotoStatement* node)override; void Visit(WfVariableStatement* node)override; void Visit(WfExpressionStatement* node)override; void Visit(WfVirtualCseStatement* node)override; void Visit(WfCoroutineStatement* node)override; void Visit(WfStateMachineStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class DeclarationVisitor : public virtual VisitorBase, public WfDeclaration::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfNamespaceDeclaration* from, WfNamespaceDeclaration* to); void CopyFields(WfDeclaration* from, WfDeclaration* to); void CopyFields(WfAttribute* from, WfAttribute* to); void CopyFields(WfClassMember* from, WfClassMember* to); void CopyFields(WfFunctionDeclaration* from, WfFunctionDeclaration* to); void CopyFields(WfFunctionArgument* from, WfFunctionArgument* to); void CopyFields(WfVariableDeclaration* from, WfVariableDeclaration* to); void CopyFields(WfEventDeclaration* from, WfEventDeclaration* to); void CopyFields(WfPropertyDeclaration* from, WfPropertyDeclaration* to); void CopyFields(WfConstructorDeclaration* from, WfConstructorDeclaration* to); void CopyFields(WfBaseConstructorCall* from, WfBaseConstructorCall* to); void CopyFields(WfDestructorDeclaration* from, WfDestructorDeclaration* to); void CopyFields(WfClassDeclaration* from, WfClassDeclaration* to); void CopyFields(WfEnumDeclaration* from, WfEnumDeclaration* to); void CopyFields(WfEnumItem* from, WfEnumItem* to); void CopyFields(WfEnumItemIntersection* from, WfEnumItemIntersection* to); void CopyFields(WfStructDeclaration* from, WfStructDeclaration* to); void CopyFields(WfStructMember* from, WfStructMember* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Dispatch (virtual) -------------------------------- virtual vl::Ptr Dispatch(WfVirtualCfeDeclaration* node) = 0; virtual vl::Ptr Dispatch(WfVirtualCseDeclaration* node) = 0; // Visitor Members ----------------------------------- void Visit(WfNamespaceDeclaration* node)override; void Visit(WfFunctionDeclaration* node)override; void Visit(WfVariableDeclaration* node)override; void Visit(WfEventDeclaration* node)override; void Visit(WfPropertyDeclaration* node)override; void Visit(WfConstructorDeclaration* node)override; void Visit(WfDestructorDeclaration* node)override; void Visit(WfClassDeclaration* node)override; void Visit(WfEnumDeclaration* node)override; void Visit(WfStructDeclaration* node)override; void Visit(WfVirtualCfeDeclaration* node)override; void Visit(WfVirtualCseDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class VirtualCfeDeclarationVisitor : public virtual VisitorBase, public WfVirtualCfeDeclaration::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfAutoPropertyDeclaration* from, WfAutoPropertyDeclaration* to); void CopyFields(WfVirtualCfeDeclaration* from, WfVirtualCfeDeclaration* to); void CopyFields(WfDeclaration* from, WfDeclaration* to); void CopyFields(WfAttribute* from, WfAttribute* to); void CopyFields(WfClassMember* from, WfClassMember* to); void CopyFields(WfCastResultInterfaceDeclaration* from, WfCastResultInterfaceDeclaration* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfAutoPropertyDeclaration* node)override; void Visit(WfCastResultInterfaceDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class VirtualCseDeclarationVisitor : public virtual VisitorBase, public WfVirtualCseDeclaration::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfStateMachineDeclaration* from, WfStateMachineDeclaration* to); void CopyFields(WfVirtualCseDeclaration* from, WfVirtualCseDeclaration* to); void CopyFields(WfDeclaration* from, WfDeclaration* to); void CopyFields(WfAttribute* from, WfAttribute* to); void CopyFields(WfClassMember* from, WfClassMember* to); void CopyFields(WfStateInput* from, WfStateInput* to); void CopyFields(WfFunctionArgument* from, WfFunctionArgument* to); void CopyFields(WfStateDeclaration* from, WfStateDeclaration* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfStateMachineDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class VirtualCseStatementVisitor : public virtual VisitorBase, public WfVirtualCseStatement::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfForEachStatement* from, WfForEachStatement* to); void CopyFields(WfVirtualCseStatement* from, WfVirtualCseStatement* to); void CopyFields(WfStatement* from, WfStatement* to); void CopyFields(WfSwitchStatement* from, WfSwitchStatement* to); void CopyFields(WfSwitchCase* from, WfSwitchCase* to); void CopyFields(WfCoProviderStatement* from, WfCoProviderStatement* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfForEachStatement* node)override; void Visit(WfSwitchStatement* node)override; void Visit(WfCoProviderStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class CoroutineStatementVisitor : public virtual VisitorBase, public WfCoroutineStatement::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfCoPauseStatement* from, WfCoPauseStatement* to); void CopyFields(WfCoroutineStatement* from, WfCoroutineStatement* to); void CopyFields(WfStatement* from, WfStatement* to); void CopyFields(WfCoOperatorStatement* from, WfCoOperatorStatement* to); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfCoPauseStatement* node)override; void Visit(WfCoOperatorStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class StateMachineStatementVisitor : public virtual VisitorBase, public WfStateMachineStatement::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfStateSwitchStatement* from, WfStateSwitchStatement* to); void CopyFields(WfStateMachineStatement* from, WfStateMachineStatement* to); void CopyFields(WfStatement* from, WfStatement* to); void CopyFields(WfStateSwitchCase* from, WfStateSwitchCase* to); void CopyFields(WfStateSwitchArgument* from, WfStateSwitchArgument* to); void CopyFields(WfStateInvokeStatement* from, WfStateInvokeStatement* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfStateSwitchStatement* node)override; void Visit(WfStateInvokeStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class VirtualCfeExpressionVisitor : public virtual VisitorBase, public WfVirtualCfeExpression::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfFormatExpression* from, WfFormatExpression* to); void CopyFields(WfVirtualCfeExpression* from, WfVirtualCfeExpression* to); void CopyFields(WfExpression* from, WfExpression* to); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfFormatExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class VirtualCseExpressionVisitor : public virtual VisitorBase, public WfVirtualCseExpression::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfBindExpression* from, WfBindExpression* to); void CopyFields(WfVirtualCseExpression* from, WfVirtualCseExpression* to); void CopyFields(WfExpression* from, WfExpression* to); void CopyFields(WfNewCoroutineExpression* from, WfNewCoroutineExpression* to); void CopyFields(WfMixinCastExpression* from, WfMixinCastExpression* to); void CopyFields(WfExpectedTypeCastExpression* from, WfExpectedTypeCastExpression* to); void CopyFields(WfCoOperatorExpression* from, WfCoOperatorExpression* to); // CreateField (virtual) ----------------------------- virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; virtual vl::Ptr CreateField(vl::Ptr from) = 0; // Visitor Members ----------------------------------- void Visit(WfBindExpression* node)override; void Visit(WfNewCoroutineExpression* node)override; void Visit(WfMixinCastExpression* node)override; void Visit(WfExpectedTypeCastExpression* node)override; void Visit(WfCoOperatorExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST copying code. class ModuleUsingFragmentVisitor : public virtual VisitorBase, public WfModuleUsingFragment::IVisitor { public: // CopyFields ---------------------------------------- void CopyFields(WfModuleUsingNameFragment* from, WfModuleUsingNameFragment* to); void CopyFields(WfModuleUsingFragment* from, WfModuleUsingFragment* to); void CopyFields(WfModuleUsingWildCardFragment* from, WfModuleUsingWildCardFragment* to); // Visitor Members ----------------------------------- void Visit(WfModuleUsingNameFragment* node)override; void Visit(WfModuleUsingWildCardFragment* node)override; }; /// A copy visitor for the root node, overriding all abstract methods with AST copying code. class ModuleVisitor : public TypeVisitor , public ExpressionVisitor , public StatementVisitor , public DeclarationVisitor , public VirtualCfeDeclarationVisitor , public VirtualCseDeclarationVisitor , public VirtualCseStatementVisitor , public CoroutineStatementVisitor , public StateMachineStatementVisitor , public VirtualCfeExpressionVisitor , public VirtualCseExpressionVisitor , public ModuleUsingFragmentVisitor { public: vl::Ptr CreateField(vl::Ptr from); // CopyFields ---------------------------------------- void CopyFields(WfModule* from, WfModule* to); void CopyFields(WfModuleUsingPath* from, WfModuleUsingPath* to); void CopyFields(WfModuleUsingItem* from, WfModuleUsingItem* to); // CreateField --------------------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // CreateField (virtual) ----------------------------- vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); vl::Ptr CreateField(vl::Ptr from); // Dispatch (virtual) -------------------------------- vl::Ptr Dispatch(WfVirtualCfeExpression* node); vl::Ptr Dispatch(WfVirtualCseExpression* node); vl::Ptr Dispatch(WfVirtualCseStatement* node); vl::Ptr Dispatch(WfCoroutineStatement* node); vl::Ptr Dispatch(WfStateMachineStatement* node); vl::Ptr Dispatch(WfVirtualCfeDeclaration* node); vl::Ptr Dispatch(WfVirtualCseDeclaration* node); }; } } } #endif /*********************************************************************** .\EXPRESSION\WFEXPRESSION_EMPTY.H ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_EMPTY #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_EMPTY namespace vl { namespace workflow { namespace empty_visitor { /// An empty visitor, overriding all abstract methods with empty implementations. class TypeVisitor : public Object, public WfType::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfPredefinedType* node)override; void Visit(WfTopQualifiedType* node)override; void Visit(WfReferenceType* node)override; void Visit(WfRawPointerType* node)override; void Visit(WfSharedPointerType* node)override; void Visit(WfNullableType* node)override; void Visit(WfEnumerableType* node)override; void Visit(WfMapType* node)override; void Visit(WfObservableListType* node)override; void Visit(WfFunctionType* node)override; void Visit(WfChildType* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class ExpressionVisitor : public Object, public WfExpression::IVisitor { public: // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCfeExpression* node) = 0; virtual void Dispatch(WfVirtualCseExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfThisExpression* node)override; void Visit(WfTopQualifiedExpression* node)override; void Visit(WfReferenceExpression* node)override; void Visit(WfOrderedNameExpression* node)override; void Visit(WfOrderedLambdaExpression* node)override; void Visit(WfMemberExpression* node)override; void Visit(WfChildExpression* node)override; void Visit(WfLiteralExpression* node)override; void Visit(WfFloatingExpression* node)override; void Visit(WfIntegerExpression* node)override; void Visit(WfStringExpression* node)override; void Visit(WfUnaryExpression* node)override; void Visit(WfBinaryExpression* node)override; void Visit(WfLetExpression* node)override; void Visit(WfIfExpression* node)override; void Visit(WfRangeExpression* node)override; void Visit(WfSetTestingExpression* node)override; void Visit(WfConstructorExpression* node)override; void Visit(WfInferExpression* node)override; void Visit(WfTypeCastingExpression* node)override; void Visit(WfTypeTestingExpression* node)override; void Visit(WfTypeOfTypeExpression* node)override; void Visit(WfTypeOfExpressionExpression* node)override; void Visit(WfAttachEventExpression* node)override; void Visit(WfDetachEventExpression* node)override; void Visit(WfObserveExpression* node)override; void Visit(WfCallExpression* node)override; void Visit(WfFunctionExpression* node)override; void Visit(WfNewClassExpression* node)override; void Visit(WfNewInterfaceExpression* node)override; void Visit(WfVirtualCfeExpression* node)override; void Visit(WfVirtualCseExpression* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class StatementVisitor : public Object, public WfStatement::IVisitor { public: // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCseStatement* node) = 0; virtual void Dispatch(WfCoroutineStatement* node) = 0; virtual void Dispatch(WfStateMachineStatement* node) = 0; // Visitor Members ----------------------------------- void Visit(WfBreakStatement* node)override; void Visit(WfContinueStatement* node)override; void Visit(WfReturnStatement* node)override; void Visit(WfDeleteStatement* node)override; void Visit(WfRaiseExceptionStatement* node)override; void Visit(WfIfStatement* node)override; void Visit(WfWhileStatement* node)override; void Visit(WfTryStatement* node)override; void Visit(WfBlockStatement* node)override; void Visit(WfGotoStatement* node)override; void Visit(WfVariableStatement* node)override; void Visit(WfExpressionStatement* node)override; void Visit(WfVirtualCseStatement* node)override; void Visit(WfCoroutineStatement* node)override; void Visit(WfStateMachineStatement* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class DeclarationVisitor : public Object, public WfDeclaration::IVisitor { public: // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCfeDeclaration* node) = 0; virtual void Dispatch(WfVirtualCseDeclaration* node) = 0; // Visitor Members ----------------------------------- void Visit(WfNamespaceDeclaration* node)override; void Visit(WfFunctionDeclaration* node)override; void Visit(WfVariableDeclaration* node)override; void Visit(WfEventDeclaration* node)override; void Visit(WfPropertyDeclaration* node)override; void Visit(WfConstructorDeclaration* node)override; void Visit(WfDestructorDeclaration* node)override; void Visit(WfClassDeclaration* node)override; void Visit(WfEnumDeclaration* node)override; void Visit(WfStructDeclaration* node)override; void Visit(WfVirtualCfeDeclaration* node)override; void Visit(WfVirtualCseDeclaration* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class VirtualCfeDeclarationVisitor : public Object, public WfVirtualCfeDeclaration::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfAutoPropertyDeclaration* node)override; void Visit(WfCastResultInterfaceDeclaration* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class VirtualCseDeclarationVisitor : public Object, public WfVirtualCseDeclaration::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfStateMachineDeclaration* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class VirtualCseStatementVisitor : public Object, public WfVirtualCseStatement::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfForEachStatement* node)override; void Visit(WfSwitchStatement* node)override; void Visit(WfCoProviderStatement* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class CoroutineStatementVisitor : public Object, public WfCoroutineStatement::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfCoPauseStatement* node)override; void Visit(WfCoOperatorStatement* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class StateMachineStatementVisitor : public Object, public WfStateMachineStatement::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfStateSwitchStatement* node)override; void Visit(WfStateInvokeStatement* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class VirtualCfeExpressionVisitor : public Object, public WfVirtualCfeExpression::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfFormatExpression* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class VirtualCseExpressionVisitor : public Object, public WfVirtualCseExpression::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfBindExpression* node)override; void Visit(WfNewCoroutineExpression* node)override; void Visit(WfMixinCastExpression* node)override; void Visit(WfExpectedTypeCastExpression* node)override; void Visit(WfCoOperatorExpression* node)override; }; /// An empty visitor, overriding all abstract methods with empty implementations. class ModuleUsingFragmentVisitor : public Object, public WfModuleUsingFragment::IVisitor { public: // Visitor Members ----------------------------------- void Visit(WfModuleUsingNameFragment* node)override; void Visit(WfModuleUsingWildCardFragment* node)override; }; } } } #endif /*********************************************************************** .\EXPRESSION\WFEXPRESSION_PARSER.H ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_PARSER #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_PARSER namespace vl { namespace workflow { /// Get the grammar definition for this parser. /// The grammar definition for this parser. extern vl::WString WfGetParserTextBuffer(); /// Convert parser result to a strong typed AST node. Usually you don't need to use this function, unless you are doing meta programming like error recovering or implementing intellisense for an editor. /// Returns the strong typed AST node. /// The parser result. /// Tokens for parsing. You can get the by calling from extern vl::Ptr WfConvertParsingTreeNode(vl::Ptr node, const vl::collections::List& tokens); /// Create the parser table. You should cache the value if possible, for improving performance. /// The created parser table. extern vl::Ptr WfLoadTable(); extern vl::Ptr WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseCoProviderStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseCoProviderStatement(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseCoProviderStatement(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseDeclarationAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseDeclaration(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseDeclaration(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseExpressionAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseExpression(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseExpression(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseModuleAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseModule(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseModule(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseStatementAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseStatement(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseStatement(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseTypeAsParsingTreeNode(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); extern vl::Ptr WfParseType(const vl::WString& input, vl::Ptr table, vl::collections::List>& errors, vl::vint codeIndex = -1); extern vl::Ptr WfParseType(const vl::WString& input, vl::Ptr table, vl::vint codeIndex = -1); } } #endif /*********************************************************************** .\EXPRESSION\WFEXPRESSION_TRAVERSE.H ***********************************************************************/ /*********************************************************************** This file is generated by: Vczh Parser Generator From parser definition:WfExpression.parser.txt Licensed under https://github.com/vczh-libraries/License ***********************************************************************/ #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_TRAVERSE #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSIONPARSER_TRAVERSE namespace vl { namespace workflow { namespace traverse_visitor { /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class TypeVisitor : public Object, public WfType::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfPredefinedType* node); virtual void Traverse(WfType* node); virtual void Traverse(WfTopQualifiedType* node); virtual void Traverse(WfReferenceType* node); virtual void Traverse(WfRawPointerType* node); virtual void Traverse(WfSharedPointerType* node); virtual void Traverse(WfNullableType* node); virtual void Traverse(WfEnumerableType* node); virtual void Traverse(WfMapType* node); virtual void Traverse(WfObservableListType* node); virtual void Traverse(WfFunctionType* node); virtual void Traverse(WfChildType* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfType* node) = 0; // Visitor Members ----------------------------------- void Visit(WfPredefinedType* node)override; void Visit(WfTopQualifiedType* node)override; void Visit(WfReferenceType* node)override; void Visit(WfRawPointerType* node)override; void Visit(WfSharedPointerType* node)override; void Visit(WfNullableType* node)override; void Visit(WfEnumerableType* node)override; void Visit(WfMapType* node)override; void Visit(WfObservableListType* node)override; void Visit(WfFunctionType* node)override; void Visit(WfChildType* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class ExpressionVisitor : public Object, public WfExpression::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfThisExpression* node); virtual void Traverse(WfExpression* node); virtual void Traverse(WfTopQualifiedExpression* node); virtual void Traverse(WfReferenceExpression* node); virtual void Traverse(WfOrderedNameExpression* node); virtual void Traverse(WfOrderedLambdaExpression* node); virtual void Traverse(WfMemberExpression* node); virtual void Traverse(WfChildExpression* node); virtual void Traverse(WfLiteralExpression* node); virtual void Traverse(WfFloatingExpression* node); virtual void Traverse(WfIntegerExpression* node); virtual void Traverse(WfStringExpression* node); virtual void Traverse(WfUnaryExpression* node); virtual void Traverse(WfBinaryExpression* node); virtual void Traverse(WfLetExpression* node); virtual void Traverse(WfLetVariable* node); virtual void Traverse(WfIfExpression* node); virtual void Traverse(WfRangeExpression* node); virtual void Traverse(WfSetTestingExpression* node); virtual void Traverse(WfConstructorExpression* node); virtual void Traverse(WfConstructorArgument* node); virtual void Traverse(WfInferExpression* node); virtual void Traverse(WfTypeCastingExpression* node); virtual void Traverse(WfTypeTestingExpression* node); virtual void Traverse(WfTypeOfTypeExpression* node); virtual void Traverse(WfTypeOfExpressionExpression* node); virtual void Traverse(WfAttachEventExpression* node); virtual void Traverse(WfDetachEventExpression* node); virtual void Traverse(WfObserveExpression* node); virtual void Traverse(WfCallExpression* node); virtual void Traverse(WfFunctionExpression* node); virtual void Traverse(WfFunctionDeclaration* node); virtual void Traverse(WfDeclaration* node); virtual void Traverse(WfAttribute* node); virtual void Traverse(WfClassMember* node); virtual void Traverse(WfFunctionArgument* node); virtual void Traverse(WfNewClassExpression* node); virtual void Traverse(WfNewInterfaceExpression* node); // VisitField ---------------------------------------- void VisitField(WfLetVariable* node); void VisitField(WfConstructorArgument* node); void VisitField(WfFunctionDeclaration* node); void VisitField(WfAttribute* node); void VisitField(WfClassMember* node); void VisitField(WfFunctionArgument* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfType* node) = 0; virtual void VisitField(WfStatement* node) = 0; virtual void VisitField(WfDeclaration* node) = 0; // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCfeExpression* node) = 0; virtual void Dispatch(WfVirtualCseExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfThisExpression* node)override; void Visit(WfTopQualifiedExpression* node)override; void Visit(WfReferenceExpression* node)override; void Visit(WfOrderedNameExpression* node)override; void Visit(WfOrderedLambdaExpression* node)override; void Visit(WfMemberExpression* node)override; void Visit(WfChildExpression* node)override; void Visit(WfLiteralExpression* node)override; void Visit(WfFloatingExpression* node)override; void Visit(WfIntegerExpression* node)override; void Visit(WfStringExpression* node)override; void Visit(WfUnaryExpression* node)override; void Visit(WfBinaryExpression* node)override; void Visit(WfLetExpression* node)override; void Visit(WfIfExpression* node)override; void Visit(WfRangeExpression* node)override; void Visit(WfSetTestingExpression* node)override; void Visit(WfConstructorExpression* node)override; void Visit(WfInferExpression* node)override; void Visit(WfTypeCastingExpression* node)override; void Visit(WfTypeTestingExpression* node)override; void Visit(WfTypeOfTypeExpression* node)override; void Visit(WfTypeOfExpressionExpression* node)override; void Visit(WfAttachEventExpression* node)override; void Visit(WfDetachEventExpression* node)override; void Visit(WfObserveExpression* node)override; void Visit(WfCallExpression* node)override; void Visit(WfFunctionExpression* node)override; void Visit(WfNewClassExpression* node)override; void Visit(WfNewInterfaceExpression* node)override; void Visit(WfVirtualCfeExpression* node)override; void Visit(WfVirtualCseExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class StatementVisitor : public Object, public WfStatement::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfBreakStatement* node); virtual void Traverse(WfStatement* node); virtual void Traverse(WfContinueStatement* node); virtual void Traverse(WfReturnStatement* node); virtual void Traverse(WfDeleteStatement* node); virtual void Traverse(WfRaiseExceptionStatement* node); virtual void Traverse(WfIfStatement* node); virtual void Traverse(WfWhileStatement* node); virtual void Traverse(WfTryStatement* node); virtual void Traverse(WfBlockStatement* node); virtual void Traverse(WfGotoStatement* node); virtual void Traverse(WfVariableStatement* node); virtual void Traverse(WfVariableDeclaration* node); virtual void Traverse(WfDeclaration* node); virtual void Traverse(WfAttribute* node); virtual void Traverse(WfClassMember* node); virtual void Traverse(WfExpressionStatement* node); // VisitField ---------------------------------------- void VisitField(WfVariableDeclaration* node); void VisitField(WfAttribute* node); void VisitField(WfClassMember* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfType* node) = 0; virtual void VisitField(WfStatement* node) = 0; // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCseStatement* node) = 0; virtual void Dispatch(WfCoroutineStatement* node) = 0; virtual void Dispatch(WfStateMachineStatement* node) = 0; // Visitor Members ----------------------------------- void Visit(WfBreakStatement* node)override; void Visit(WfContinueStatement* node)override; void Visit(WfReturnStatement* node)override; void Visit(WfDeleteStatement* node)override; void Visit(WfRaiseExceptionStatement* node)override; void Visit(WfIfStatement* node)override; void Visit(WfWhileStatement* node)override; void Visit(WfTryStatement* node)override; void Visit(WfBlockStatement* node)override; void Visit(WfGotoStatement* node)override; void Visit(WfVariableStatement* node)override; void Visit(WfExpressionStatement* node)override; void Visit(WfVirtualCseStatement* node)override; void Visit(WfCoroutineStatement* node)override; void Visit(WfStateMachineStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class DeclarationVisitor : public Object, public WfDeclaration::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfNamespaceDeclaration* node); virtual void Traverse(WfDeclaration* node); virtual void Traverse(WfAttribute* node); virtual void Traverse(WfClassMember* node); virtual void Traverse(WfFunctionDeclaration* node); virtual void Traverse(WfFunctionArgument* node); virtual void Traverse(WfVariableDeclaration* node); virtual void Traverse(WfEventDeclaration* node); virtual void Traverse(WfPropertyDeclaration* node); virtual void Traverse(WfConstructorDeclaration* node); virtual void Traverse(WfBaseConstructorCall* node); virtual void Traverse(WfDestructorDeclaration* node); virtual void Traverse(WfClassDeclaration* node); virtual void Traverse(WfEnumDeclaration* node); virtual void Traverse(WfEnumItem* node); virtual void Traverse(WfEnumItemIntersection* node); virtual void Traverse(WfStructDeclaration* node); virtual void Traverse(WfStructMember* node); // VisitField ---------------------------------------- void VisitField(WfAttribute* node); void VisitField(WfClassMember* node); void VisitField(WfFunctionArgument* node); void VisitField(WfBaseConstructorCall* node); void VisitField(WfEnumItem* node); void VisitField(WfEnumItemIntersection* node); void VisitField(WfStructMember* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfDeclaration* node) = 0; virtual void VisitField(WfType* node) = 0; virtual void VisitField(WfStatement* node) = 0; // Dispatch (virtual) -------------------------------- virtual void Dispatch(WfVirtualCfeDeclaration* node) = 0; virtual void Dispatch(WfVirtualCseDeclaration* node) = 0; // Visitor Members ----------------------------------- void Visit(WfNamespaceDeclaration* node)override; void Visit(WfFunctionDeclaration* node)override; void Visit(WfVariableDeclaration* node)override; void Visit(WfEventDeclaration* node)override; void Visit(WfPropertyDeclaration* node)override; void Visit(WfConstructorDeclaration* node)override; void Visit(WfDestructorDeclaration* node)override; void Visit(WfClassDeclaration* node)override; void Visit(WfEnumDeclaration* node)override; void Visit(WfStructDeclaration* node)override; void Visit(WfVirtualCfeDeclaration* node)override; void Visit(WfVirtualCseDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class VirtualCfeDeclarationVisitor : public Object, public WfVirtualCfeDeclaration::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfAutoPropertyDeclaration* node); virtual void Traverse(WfVirtualCfeDeclaration* node); virtual void Traverse(WfDeclaration* node); virtual void Traverse(WfAttribute* node); virtual void Traverse(WfClassMember* node); virtual void Traverse(WfCastResultInterfaceDeclaration* node); // VisitField ---------------------------------------- void VisitField(WfAttribute* node); void VisitField(WfClassMember* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfDeclaration* node) = 0; virtual void VisitField(WfType* node) = 0; // Visitor Members ----------------------------------- void Visit(WfAutoPropertyDeclaration* node)override; void Visit(WfCastResultInterfaceDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class VirtualCseDeclarationVisitor : public Object, public WfVirtualCseDeclaration::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfStateMachineDeclaration* node); virtual void Traverse(WfVirtualCseDeclaration* node); virtual void Traverse(WfDeclaration* node); virtual void Traverse(WfAttribute* node); virtual void Traverse(WfClassMember* node); virtual void Traverse(WfStateInput* node); virtual void Traverse(WfFunctionArgument* node); virtual void Traverse(WfStateDeclaration* node); // VisitField ---------------------------------------- void VisitField(WfAttribute* node); void VisitField(WfClassMember* node); void VisitField(WfStateInput* node); void VisitField(WfFunctionArgument* node); void VisitField(WfStateDeclaration* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfDeclaration* node) = 0; virtual void VisitField(WfType* node) = 0; virtual void VisitField(WfStatement* node) = 0; // Visitor Members ----------------------------------- void Visit(WfStateMachineDeclaration* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class VirtualCseStatementVisitor : public Object, public WfVirtualCseStatement::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfForEachStatement* node); virtual void Traverse(WfVirtualCseStatement* node); virtual void Traverse(WfStatement* node); virtual void Traverse(WfSwitchStatement* node); virtual void Traverse(WfSwitchCase* node); virtual void Traverse(WfCoProviderStatement* node); // VisitField ---------------------------------------- void VisitField(WfSwitchCase* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfStatement* node) = 0; virtual void VisitField(WfExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfForEachStatement* node)override; void Visit(WfSwitchStatement* node)override; void Visit(WfCoProviderStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class CoroutineStatementVisitor : public Object, public WfCoroutineStatement::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfCoPauseStatement* node); virtual void Traverse(WfCoroutineStatement* node); virtual void Traverse(WfStatement* node); virtual void Traverse(WfCoOperatorStatement* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfStatement* node) = 0; virtual void VisitField(WfExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfCoPauseStatement* node)override; void Visit(WfCoOperatorStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class StateMachineStatementVisitor : public Object, public WfStateMachineStatement::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfStateSwitchStatement* node); virtual void Traverse(WfStateMachineStatement* node); virtual void Traverse(WfStatement* node); virtual void Traverse(WfStateSwitchCase* node); virtual void Traverse(WfStateSwitchArgument* node); virtual void Traverse(WfStateInvokeStatement* node); // VisitField ---------------------------------------- void VisitField(WfStateSwitchCase* node); void VisitField(WfStateSwitchArgument* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfStatement* node) = 0; virtual void VisitField(WfExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfStateSwitchStatement* node)override; void Visit(WfStateInvokeStatement* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class VirtualCfeExpressionVisitor : public Object, public WfVirtualCfeExpression::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfFormatExpression* node); virtual void Traverse(WfVirtualCfeExpression* node); virtual void Traverse(WfExpression* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; // Visitor Members ----------------------------------- void Visit(WfFormatExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class VirtualCseExpressionVisitor : public Object, public WfVirtualCseExpression::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfBindExpression* node); virtual void Traverse(WfVirtualCseExpression* node); virtual void Traverse(WfExpression* node); virtual void Traverse(WfNewCoroutineExpression* node); virtual void Traverse(WfMixinCastExpression* node); virtual void Traverse(WfExpectedTypeCastExpression* node); virtual void Traverse(WfCoOperatorExpression* node); // VisitField (virtual) ------------------------------ virtual void VisitField(WfExpression* node) = 0; virtual void VisitField(WfStatement* node) = 0; virtual void VisitField(WfType* node) = 0; // Visitor Members ----------------------------------- void Visit(WfBindExpression* node)override; void Visit(WfNewCoroutineExpression* node)override; void Visit(WfMixinCastExpression* node)override; void Visit(WfExpectedTypeCastExpression* node)override; void Visit(WfCoOperatorExpression* node)override; }; /// A copy visitor, overriding all abstract methods with AST traversing code that looks into child nodes. class ModuleUsingFragmentVisitor : public Object, public WfModuleUsingFragment::IVisitor { public: // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfModuleUsingNameFragment* node); virtual void Traverse(WfModuleUsingFragment* node); virtual void Traverse(WfModuleUsingWildCardFragment* node); // Visitor Members ----------------------------------- void Visit(WfModuleUsingNameFragment* node)override; void Visit(WfModuleUsingWildCardFragment* node)override; }; /// A copy visitor for the root node, overriding all abstract methods with AST traversing code that looks into child nodes. class ModuleVisitor : public TypeVisitor , public ExpressionVisitor , public StatementVisitor , public DeclarationVisitor , public VirtualCfeDeclarationVisitor , public VirtualCseDeclarationVisitor , public VirtualCseStatementVisitor , public CoroutineStatementVisitor , public StateMachineStatementVisitor , public VirtualCfeExpressionVisitor , public VirtualCseExpressionVisitor , public ModuleUsingFragmentVisitor { public: void VisitField(WfModule* node); // Traverse ------------------------------------------ virtual void Traverse(vl::parsing::ParsingToken& token); virtual void Traverse(vl::parsing::ParsingTreeCustomBase* node); virtual void Traverse(WfModule* node); virtual void Traverse(WfModuleUsingPath* node); virtual void Traverse(WfModuleUsingItem* node); // VisitField ---------------------------------------- void VisitField(WfModuleUsingPath* node); void VisitField(WfModuleUsingItem* node); // VisitField (virtual) ------------------------------ void VisitField(WfType* node); void VisitField(WfExpression* node); void VisitField(WfStatement* node); void VisitField(WfDeclaration* node); void VisitField(WfModuleUsingFragment* node); // Dispatch (virtual) -------------------------------- void Dispatch(WfVirtualCfeExpression* node); void Dispatch(WfVirtualCseExpression* node); void Dispatch(WfVirtualCseStatement* node); void Dispatch(WfCoroutineStatement* node); void Dispatch(WfStateMachineStatement* node); void Dispatch(WfVirtualCfeDeclaration* node); void Dispatch(WfVirtualCseDeclaration* node); }; } } } #endif /*********************************************************************** .\EXPRESSION\WFEXPRESSION.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 Developer: Zihan Chen(vczh) Parser::WfExpression Interfaces: ***********************************************************************/ #ifdef VCZH_DEBUG_NO_REFLECTION static_assert(false, "Don't use VlppWorkflow.(h|cpp) or VlppWorkflowCompiler.(h|cpp) if VCZH_DEBUG_NO_REFLECTION is defined."); #endif #ifndef VCZH_WORKFLOW_EXPRESSION_WFEXPRESSION #define VCZH_WORKFLOW_EXPRESSION_WFEXPRESSION namespace vl { namespace workflow { /// Print a Workflow attribute. /// The Workflow attribute. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow type. /// The Workflow type. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow expression. /// The Workflow expression. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow statement. /// The Workflow statement. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow declaration. /// The Workflow declaration. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow module. /// The Workflow module. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, parsing::ParsingWriter& writer); /// Print a Workflow attribute. /// The Workflow attribute. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); /// Print a Workflow type. /// The Workflow type. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); /// Print a Workflow expression. /// The Workflow expression. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); /// Print a Workflow statement. /// The Workflow statement. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); /// Print a Workflow declaration. /// The Workflow declaration. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); /// Print a Workflow module. /// The Workflow module. /// The indentation. /// The target writer. extern void WfPrint(Ptr node, const WString& indent, stream::TextWriter& writer); } } #endif /*********************************************************************** .\ANALYZER\WFANALYZER.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 Developer: Zihan Chen(vczh) Workflow::Analyzer Interfaces: **********************************************************************/ #ifndef VCZH_WORKFLOW_ANALYZER_WFANALYZER #define VCZH_WORKFLOW_ANALYZER_WFANALYZER namespace vl { namespace workflow { namespace analyzer { class WfLexicalSymbol; class WfLexicalScope; class WfLexicalScopeManager; } /*********************************************************************** Callback ***********************************************************************/ /// A callback for tracking compiling progress. This is used in and . class IWfCompilerCallback : public Interface { public: /// 1st step: Called before loading global type information. virtual void OnLoadEnvironment() = 0; /// 2nd step: Called before compiling. /// The scope manager object for storing all information generated from Workflow modules during compiling. virtual void OnInitialize(analyzer::WfLexicalScopeManager* manager) = 0; /// 3rd step: Called before validating a Workflow module. This could be called multiple times for each module. /// The module for validating. virtual void OnValidateModule(Ptr module) = 0; /// 4th step: Called before generating metadata for functions and types created by given Workflow modules. virtual void OnGenerateMetadata() = 0; /// 5th step: Called before generating instructions for a Workflow module. This could be called multiple times for each module. /// The module for generating code. virtual void OnGenerateCode(Ptr module) = 0; /// 6th step: Called before generating debug information. virtual void OnGenerateDebugInfo() = 0; }; namespace analyzer { /*********************************************************************** Scope ***********************************************************************/ class WfLexicalSymbol : public Object { public: WString name; // name of this symbol Ptr type; // type of this symbol Ptr typeInfo; // reflection type info of this symbol, nullable Ptr creatorNode; // nullable WfLexicalScope* ownerScope; // scope that contains this symbol WfLexicalSymbol(WfLexicalScope* _ownerScope); ~WfLexicalSymbol(); WString GetFriendlyName(); }; class WfLexicalFunctionConfig : public Object { public: bool lambda = false; bool thisAccessable = false; bool parentThisAccessable = false; }; class WfLexicalScope : public Object { typedef collections::Group> TypeGroup; public: WfLexicalScopeManager* ownerManager; // nullable Ptr ownerNode; // nullable parsing::ParsingTreeCustomBase* ownerNodeSource = nullptr; // nullable Ptr functionConfig; reflection::description::ITypeDescriptor* typeOfThisExpr = nullptr; // visible members to this scope Ptr parentScope; // null means that this is the root scope TypeGroup symbols; // all symbols in this scope WfLexicalScope(WfLexicalScopeManager* _ownerManager); WfLexicalScope(Ptr _parentScope); ~WfLexicalScope(); WfLexicalScopeManager* FindManager(); Ptr FindModule(); WfLexicalScope* FindFunctionScope(); WString GetFriendlyName(); Ptr GetOwnerClassMember(); }; /*********************************************************************** Scope Manager ***********************************************************************/ class WfLexicalScopeName : public Object { typedef collections::Dictionary> NameMap; typedef collections::List> DeclarationList; public: WfLexicalScopeName* parent = nullptr; bool imported = true; NameMap children; WString name; reflection::description::ITypeDescriptor* typeDescriptor = nullptr; // type that form this name DeclarationList declarations; // declarations that form this name WfLexicalScopeName(bool _imported); ~WfLexicalScopeName(); Ptr AccessChild(const WString& name, bool imported); void RemoveNonTypeDescriptorNames(WfLexicalScopeManager* manager); WString GetFriendlyName(); }; struct ResolveExpressionResult { Ptr scopeName; Ptr symbol; reflection::description::IPropertyInfo* propertyInfo = nullptr; reflection::description::IMethodInfo* methodInfo = nullptr; reflection::description::IMethodInfo* constructorInfo = nullptr; reflection::description::IEventInfo* eventInfo = nullptr; Ptr type; Ptr writableType; Ptr expectedType; WString GetFriendlyName(bool upperCase = false)const; static ResolveExpressionResult ScopeName(Ptr _scopeName); static ResolveExpressionResult ReadonlySymbol(Ptr _symbol); static ResolveExpressionResult Symbol(Ptr _symbol); static ResolveExpressionResult ReadonlyType(Ptr _type); static ResolveExpressionResult WritableType(Ptr _type); static ResolveExpressionResult Property(reflection::description::IPropertyInfo* _propertyInfo); static ResolveExpressionResult Method(reflection::description::IMethodInfo* _methodInfo); static ResolveExpressionResult Constructor(reflection::description::IMethodInfo* _constructorInfo); static ResolveExpressionResult Event(reflection::description::IEventInfo* _eventInfo); bool operator==(const ResolveExpressionResult& result) const; bool operator!=(const ResolveExpressionResult& result) const; }; struct WfLexicalCapture { collections::List> symbols; collections::List> ctorArgumentSymbols; }; struct WfStateMachineInfo { Ptr createCoroutineMethod; collections::Dictionary inputIds; collections::Dictionary stateIds; }; /// Scope manager for storing all information generated from Workflow modules during compiling. class WfLexicalScopeManager : public Object { typedef reflection::description::ITypeDescriptor ITypeDescriptor; typedef reflection::description::IMemberInfo IMemberInfo; typedef reflection::description::IMethodInfo IMethodInfo; typedef reflection::description::ITypeInfo ITypeInfo; typedef reflection::description::Value Value; typedef collections::List> ModuleList; typedef collections::List ModuleCodeList; typedef collections::Pair AttributeKey; typedef collections::Dictionary> AttributeTypeMap; typedef collections::Dictionary> TypeNameMap; typedef collections::List> ParsingErrorList; typedef collections::Dictionary, Ptr> NamespaceNameMap; typedef collections::Dictionary> NodeScopeMap; typedef collections::SortedList AnalyzedScopeList; typedef collections::Dictionary, ResolveExpressionResult> ExpressionResolvingMap; typedef collections::Dictionary, ResolveExpressionResult> CoOperatorResolvingMap; typedef collections::Pair BaseConstructorCallKey; typedef collections::Pair BaseConstructorCallValue; typedef collections::Dictionary BaseConstructorCallResolvingMap; typedef collections::Dictionary> LambdaCaptureMap; typedef collections::Dictionary InterfaceMethodImplementationMap; typedef collections::Dictionary, parsing::ParsingTreeCustomBase*> DeclarationSourceMap; typedef collections::Dictionary, Ptr> DeclarationTypeMap; typedef collections::Dictionary, Ptr> DeclarationMemberInfoMap; typedef collections::Dictionary, Ptr> StateInputMethodMap; typedef collections::Dictionary, Ptr> StateArgumentFieldMap; typedef collections::Dictionary, Ptr> StateMachineInfoMap; protected: ModuleList modules; ModuleCodeList moduleCodes; vint usedCodeIndex = 0; public: Ptr parsingTable; AttributeTypeMap attributes; Ptr globalName; // root scope TypeNameMap typeNames; // ITypeDescriptor* to scope name map vint usedTempVars = 0; ParsingErrorList errors; // compile errors NamespaceNameMap namespaceNames; // namespace to scope name map NodeScopeMap nodeScopes; // the nearest scope for a AST AnalyzedScopeList checkedScopes_DuplicatedSymbol; // scopes that validated by CheckScopes_DuplicatedSymbol AnalyzedScopeList checkedScopes_SymbolType; // scopes that validated by CheckScopes_SymbolType ExpressionResolvingMap expressionResolvings; // the resolving result for the expression ExpressionResolvingMap coNewCoroutineResolvings; // the coroutine type for the WfNewCoroutineExpression (e.g. AsyncCoroutine) CoOperatorResolvingMap coOperatorResolvings; // the method for the co-operator statement (e.g. AwaitAndRead) CoOperatorResolvingMap coProviderResolvings; // the constructor for the co-provider statement (e.g. AsyncCoroutine::Create) CoOperatorResolvingMap coCastResultResolvings; // the method for the co-operator's type casting (e.g. IStringAsync::CastResult) BaseConstructorCallResolvingMap baseConstructorCallResolvings; // all base constructor call resolvings LambdaCaptureMap lambdaCaptures; // all captured symbols in a lambda AST InterfaceMethodImplementationMap interfaceMethodImpls; // the IMethodInfo* that implemented by a function DeclarationSourceMap declaractionScopeSources; // the source used to build the scope for a declaration DeclarationTypeMap declarationTypes; // ITypeDescriptor* for type declaration DeclarationMemberInfoMap declarationMemberInfos; // IMemberInfo* for type description StateInputMethodMap stateInputMethods; // IMethodInfo* for state input StateArgumentFieldMap stateInputArguments; // IPropertyInfo* for state input argument temporary cache StateArgumentFieldMap stateDeclArguments; // IPropertyInfo* for state argument temporary cache StateMachineInfoMap stateMachineInfos; // members of state machine /// Create a Workflow compiler. /// The workflow parser table. It can be retrived from [M:vl.workflow.WfLoadTable]. WfLexicalScopeManager(Ptr _parsingTable); ~WfLexicalScopeManager(); /// Add a Workflow module. Syntax errors can be found at . /// The source code of a workflow module. /// Returns the code index, which is a number representing a module in data structured used in Workflow compiler, runtime and debugger. vint AddModule(const WString& moduleCode); /// Add a parsed Workflow module. /// The syntax tree of a workflow module. /// Returns the code index, which is a number representing a module in data structured used in Workflow compiler, runtime and debugger. vint AddModule(Ptr module); /// Get all added modules in adding order. /// All added modules in adding order. ModuleList& GetModules(); /// Get all module codes in adding order. For any added parsed module, the code is an empty string. /// All module codes in adding order. ModuleCodeList& GetModuleCodes(); /// Clean all generated information from the last called to . /// /// Set to true so that only scopes for types in Workflow modules are deleted. /// Set to false to also delete scopes for cached global types. /// If there is no new reflectable native type that is registered after the last call to , /// using true for this argument saves times by reusing scopes created from global types. /// /// Set to true to delete all added modules. void Clear(bool keepTypeDescriptorNames, bool deleteModules); /// Perform semantic analyzing for added modules. /// The same to the argument in . /// The callback to receive progress information (optional). void Rebuild(bool keepTypeDescriptorNames, IWfCompilerCallback* callback = nullptr); bool ResolveMember(ITypeDescriptor* typeDescriptor, const WString& name, bool preferStatic, collections::SortedList& searchedTypes, collections::List& results); bool ResolveName(WfLexicalScope* scope, const WString& name, collections::List& results); Ptr GetDeclarationSymbol(WfLexicalScope* scope, WfDeclaration* node); void CreateLambdaCapture(parsing::ParsingTreeCustomBase* node, Ptr capture = nullptr); }; /*********************************************************************** Type Analyzing ***********************************************************************/ enum class TypeFlag { Bool, I1, I2, I4, I8, U1, U2, U4, U8, F4, F8, String, Enum, Struct, Others, Count, Unknown = -1, }; extern TypeFlag GetTypeFlag(reflection::description::ITypeDescriptor* typeDescriptor); extern TypeFlag GetTypeFlag(reflection::description::ITypeInfo* typeInfo); extern Ptr CreateTypeInfoFromTypeFlag(TypeFlag flag); extern void GetTypeFragments(reflection::description::ITypeDescriptor* typeDescriptor, collections::List& fragments); extern Ptr GetExpressionFromTypeDescriptor(reflection::description::ITypeDescriptor* typeDescriptor); extern Ptr GetTypeFromTypeInfo(reflection::description::ITypeInfo* typeInfo); extern Ptr GetScopeNameFromReferenceType(WfLexicalScope* scope, Ptr type); extern Ptr CreateTypeInfoFromType(WfLexicalScope* scope, Ptr type, bool checkTypeForValue = true); extern Ptr CopyTypeInfo(reflection::description::ITypeInfo* typeInfo); extern bool CanConvertToType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType, bool explicitly); extern bool IsSameType(reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); extern Ptr GetMergedType(Ptr firstType, Ptr secondType); extern bool IsNullAcceptableType(reflection::description::ITypeInfo* type); extern Ptr CreateTypeInfoFromMethodInfo(reflection::description::IMethodInfo* info); extern bool IsExpressionDependOnExpectedType(WfLexicalScopeManager* manager, Ptr expression); extern WString GetExpressionName(Ptr expression); extern void SearchOrderedName(WfLexicalScope* scope, Ptr expression, collections::SortedList& names); /*********************************************************************** Structure Analyzing ***********************************************************************/ struct ValidateStructureContext { WfBindExpression* currentBindExpression = nullptr; WfObserveExpression* currentObserveExpression = nullptr; WfStatement* currentLoopStatement = nullptr; WfStatement* currentCatchStatement = nullptr; WfCoProviderStatement* currentCoProviderStatement = nullptr; WfNewCoroutineExpression* currentNewCoroutineExpression = nullptr; WfCoPauseStatement* currentCoPauseStatement = nullptr; WfStateDeclaration* currentStateDeclaration = nullptr; ValidateStructureContext(); }; enum class ValidateTypeStragety { Value, ReturnType, BaseType, }; extern void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset = false); extern void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset = false); extern void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset = false); extern void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset = false); extern void SetCodeRange(Ptr node, parsing::ParsingTextRange codeRange, bool asOffset = false); extern void ContextFreeModuleDesugar(WfLexicalScopeManager* manager, Ptr module); extern void ContextFreeDeclarationDesugar(WfLexicalScopeManager* manager, Ptr declaration); extern void ContextFreeStatementDesugar(WfLexicalScopeManager* manager, Ptr statement); extern void ContextFreeExpressionDesugar(WfLexicalScopeManager* manager, Ptr expression); extern void ValidateTypeStructure(WfLexicalScopeManager* manager, Ptr type, ValidateTypeStragety strategy = ValidateTypeStragety::Value, WfClassDeclaration* classDecl = nullptr); extern void ValidateModuleStructure(WfLexicalScopeManager* manager, Ptr module); extern void ValidateDeclarationStructure(WfLexicalScopeManager* manager, Ptr declaration, WfClassDeclaration* classDecl = 0 , WfExpression* surroundingLambda = 0); extern void ValidateStatementStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& statement); extern void ValidateExpressionStructure(WfLexicalScopeManager* manager, ValidateStructureContext* context, Ptr& expression); /*********************************************************************** Global Name ***********************************************************************/ extern void BuildGlobalNameFromTypeDescriptors(WfLexicalScopeManager* manager); extern void BuildNameForDeclaration(WfLexicalScopeManager* manager, Ptr name, WfDeclaration* decl); extern void BuildGlobalNameFromModules(WfLexicalScopeManager* manager); extern void ValidateScopeName(WfLexicalScopeManager* manager, Ptr name); /*********************************************************************** Scope Analyzing ***********************************************************************/ extern void CompleteScopeForClassMember(WfLexicalScopeManager* manager, Ptr td, Ptr classDecl, Ptr memberDecl); extern void CompleteScopeForDeclaration(WfLexicalScopeManager* manager, Ptr declaration); extern void CompleteScopeForModule(WfLexicalScopeManager* manager, Ptr module); extern void BuildScopeForModule(WfLexicalScopeManager* manager, Ptr module); extern void BuildScopeForDeclaration(WfLexicalScopeManager* manager, Ptr parentScope, Ptr declaration, parsing::ParsingTreeCustomBase* source); extern void BuildScopeForStatement(WfLexicalScopeManager* manager, Ptr parentScope, Ptr statement); extern void BuildScopeForExpression(WfLexicalScopeManager* manager, Ptr parentScope, Ptr expression); extern bool CheckScopes_DuplicatedSymbol(WfLexicalScopeManager* manager); extern bool CheckScopes_SymbolType(WfLexicalScopeManager* manager); extern bool CheckScopes_CycleDependency(WfLexicalScopeManager* manager); /*********************************************************************** Semantic Analyzing ***********************************************************************/ extern reflection::description::IMethodInfo* FindInterfaceConstructor(reflection::description::ITypeDescriptor* type); extern Ptr SelectFunction(WfLexicalScopeManager* manager, parsing::ParsingTreeCustomBase* node, Ptr functionExpression, collections::List& functions, collections::List>& arguments, vint& selectedFunctionIndex); extern void ValidateModuleSemantic(WfLexicalScopeManager* manager, Ptr module); extern void ValidateClassMemberSemantic(WfLexicalScopeManager* manager, Ptr td, Ptr classDecl, Ptr memberDecl); extern void ValidateDeclarationSemantic(WfLexicalScopeManager* manager, Ptr declaration); extern void ValidateStatementSemantic(WfLexicalScopeManager* manager, Ptr statement); extern void ValidateExpressionSemantic(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, collections::List& results); extern void ValidateConstantExpression(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType); extern Ptr GetExpressionScopeName(WfLexicalScopeManager* manager, Ptr expression); extern reflection::description::IEventInfo* GetExpressionEventInfo(WfLexicalScopeManager* manager, Ptr expression); extern void GetExpressionTypes(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType, bool allowEvent, collections::List& results); extern Ptr GetExpressionType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType); extern Ptr GetLeftValueExpressionType(WfLexicalScopeManager* manager, Ptr expression); extern Ptr GetEnumerableExpressionItemType(WfLexicalScopeManager* manager, Ptr expression, Ptr expectedType); /*********************************************************************** Expanding Virtual Nodes ***********************************************************************/ class CopyWithExpandVirtualVisitor : public copy_visitor::ModuleVisitor { private: bool expandVirtualAst; void Expand(collections::List>& decls); public: CopyWithExpandVirtualVisitor(bool _expandVirtualAst); Ptr Dispatch(WfVirtualCfeExpression* node)override; Ptr Dispatch(WfVirtualCseExpression* node)override; Ptr Dispatch(WfVirtualCseStatement* node)override; void Visit(WfNamespaceDeclaration* node)override; void Visit(WfClassDeclaration* node)override; void Visit(WfNewInterfaceExpression* node)override; }; extern Ptr SearchUntilNonVirtualStatement(Ptr statement); extern Ptr CopyType(Ptr type); extern Ptr CopyExpression(Ptr expression, bool expandVirtualExprStat); extern Ptr CopyStatement(Ptr statement, bool expandVirtualExprStat); extern Ptr CopyDeclaration(Ptr declaration, bool expandVirtualExprStat); extern Ptr CopyModule(Ptr module, bool expandVirtualExprStat); extern Ptr CreateDefaultValue(reflection::description::ITypeInfo* elementType); extern void ExpandBindExpression(WfLexicalScopeManager* manager, WfBindExpression* node); extern void ExpandNewCoroutineExpression(WfLexicalScopeManager* manager, WfNewCoroutineExpression* node); extern void ExpandCoOperatorExpression(WfLexicalScopeManager* manager, WfCoOperatorExpression* node); extern void ExpandMixinCastExpression(WfLexicalScopeManager* manager, WfMixinCastExpression* node); extern void ExpandSwitchStatement(WfLexicalScopeManager* manager, WfSwitchStatement* node); extern void ExpandForEachStatement(WfLexicalScopeManager* manager, WfForEachStatement* node); extern void ExpandCoProviderStatement(WfLexicalScopeManager* manager, WfCoProviderStatement* node); extern void ExpandStateMachine(WfLexicalScopeManager* manager, WfStateMachineDeclaration* node); /*********************************************************************** Error Messages ***********************************************************************/ struct WfErrors { // A: Expression error static Ptr WrongFormatStringSyntax(WfExpression* node); static Ptr WrongSimpleObserveExpression(WfExpression* node); static Ptr WrongSimpleObserveEvent(WfExpression* node); static Ptr EmptyObserveEvent(WfExpression* node); static Ptr ObserveNotInBind(WfExpression* node); static Ptr ObserveInObserveEvent(WfExpression* node); static Ptr BindInBind(WfExpression* node); static Ptr AttachInBind(WfExpression* node); static Ptr DetachInBind(WfExpression* node); static Ptr ConstructorMixMapAndList(WfExpression* node); static Ptr ConstructorMixStructAndList(WfExpression* node); static Ptr DuplicatedConstructorField(WfReferenceExpression* node); static Ptr ConstructorMixClassAndInterface(WfNewClassExpression* node); static Ptr ConstructorMixClassAndInterface(WfNewInterfaceExpression* node); static Ptr ScopeNameIsNotExpression(WfExpression* node, Ptr scopeName); static Ptr EventIsNotExpression(WfExpression* node, reflection::description::IEventInfo* eventInfo); static Ptr ExpressionIsNotScopeName(WfExpression* node); static Ptr ExpressionIsNotEvent(WfExpression* node); static Ptr ExpressionCannotResolveType(WfExpression* node, Ptr symbol); static Ptr NullCannotResolveType(WfExpression* node); static Ptr ConstructorCannotResolveType(WfExpression* node); static Ptr OrderedLambdaCannotResolveType(WfExpression* node); static Ptr NullCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType); static Ptr ConstructorCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType); static Ptr OrderedLambdaCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* toType); static Ptr ExpressionCannotImplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); static Ptr ExpressionCannotExplicitlyConvertToType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); static Ptr CannotWeakCastToType(WfExpression* node, reflection::description::ITypeInfo* toType); static Ptr IntegerLiteralOutOfRange(WfIntegerExpression* node); static Ptr FloatingLiteralOutOfRange(WfFloatingExpression* node); static Ptr CannotMergeTwoType(WfExpression* node, reflection::description::ITypeInfo* firstType, reflection::description::ITypeInfo* secondType); static Ptr RangeShouldBeInteger(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr UnaryOperatorOnWrongType(WfUnaryExpression* node, reflection::description::ITypeInfo* type); static Ptr BinaryOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* type); static Ptr IndexOperatorOnWrongType(WfBinaryExpression* node, reflection::description::ITypeInfo* containerType); static Ptr ExpressionIsNotCollection(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr ExpressionIsNotFunction(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr FunctionArgumentCountMismatched(parsing::ParsingTreeCustomBase* node, vint expectedCount, const ResolveExpressionResult& function); static Ptr FunctionArgumentTypeMismatched(parsing::ParsingTreeCustomBase* node, const ResolveExpressionResult& function, vint index, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); static Ptr CannotPickOverloadedFunctions(parsing::ParsingTreeCustomBase* node, collections::List& results); static Ptr ClassContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr InterfaceContainsNoConstructor(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr ConstructorReturnTypeMismatched(WfExpression* node, const ResolveExpressionResult& function, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); static Ptr ExpressionIsNotLeftValue(WfExpression* node, const ResolveExpressionResult& result); static Ptr CannotCallMemberOutsideOfClass(WfExpression* node, const ResolveExpressionResult& result); static Ptr CannotCallMemberInStaticFunction(WfExpression* node, const ResolveExpressionResult& result); static Ptr FieldCannotInitializeUsingEachOther(WfExpression* node, const ResolveExpressionResult& result); static Ptr WrongThisExpression(WfExpression* node); static Ptr IncorrectTypeForUnion(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr IncorrectTypeForIntersect(WfExpression* node, reflection::description::ITypeInfo* type); static Ptr ExpressionIsNotConstant(WfExpression* node); static Ptr WrongMixinTargetType(WfExpression* node, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType); static Ptr ExpectedTypeCastCannotResolveType(WfExpression* node); // B: Type error static Ptr WrongVoidType(WfType* node); static Ptr WrongInterfaceType(WfType* node); static Ptr RawPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo = 0); static Ptr SharedPointerToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo = 0); static Ptr NullableToNonReferenceType(WfType* node, reflection::description::ITypeInfo* typeInfo = 0); static Ptr ChildOfNonReferenceType(WfType* node); static Ptr TypeNotExists(WfType* node, Ptr scopeName); static Ptr TypeNotExists(WfType* node, const ResolveExpressionResult& result); static Ptr TypeNotForValue(WfType* node, reflection::description::ITypeInfo* typeInfo); // C: Statement error static Ptr BreakNotInLoop(WfStatement* node); static Ptr ContinueNotInLoop(WfStatement* node); static Ptr RethrowNotInCatch(WfStatement* node); static Ptr TryMissCatchAndFinally(WfStatement* node); static Ptr ReturnMissExpression(WfStatement* node, reflection::description::ITypeInfo* type); static Ptr DeleteNonRawPointer(WfStatement* node, reflection::description::ITypeInfo* type); static Ptr CannotReturnExpression(WfStatement* node); static Ptr WrongCoPause(WfStatement* node); static Ptr WrongCoOperator(WfStatement* node); static Ptr WrongCoOperator(WfExpression* node); static Ptr CoProviderNotExists(WfCoProviderStatement* node, collections::List& candidates); static Ptr CoOperatorNotExists(WfReturnStatement* node, reflection::description::ITypeInfo* type); static Ptr CoOperatorNotExists(WfCoOperatorStatement* node, reflection::description::ITypeInfo* type); static Ptr CoOperatorNotExists(WfCoOperatorExpression* node, reflection::description::ITypeInfo* type); static Ptr CoOperatorCannotResolveResultType(WfCoOperatorStatement* node, collections::List& types); static Ptr CoProviderCreateNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type); static Ptr CoProviderCreateAndRunNotExists(WfCoProviderStatement* node, reflection::description::ITypeInfo* type); static Ptr GotoLabelNotExists(WfGotoStatement* node); static Ptr TooManyGotoLabel(WfGotoStatement* node); static Ptr WrongStateSwitchStatement(WfStateSwitchStatement* node); static Ptr WrongStateInvokeStatement(WfStateInvokeStatement* node); static Ptr StateInputNotExists(WfStateSwitchCase* node); static Ptr StateSwitchArgumentCountNotMatch(WfStateSwitchCase* node); static Ptr StateNotExists(WfStateInvokeStatement* node); static Ptr StateArgumentCountNotMatch(WfStateInvokeStatement* node); // D: Declaration error static Ptr FunctionShouldHaveName(WfDeclaration* node); static Ptr FunctionShouldHaveImplementation(WfDeclaration* node); static Ptr InterfaceMethodShouldNotHaveImplementation(WfDeclaration* node); static Ptr DuplicatedDeclaration(WfDeclaration* node, const WString& firstDeclarationCategory); static Ptr DuplicatedDeclaration(WfStateMachineDeclaration* node); static Ptr DuplicatedSymbol(WfDeclaration* node, Ptr symbol); static Ptr DuplicatedSymbol(WfFunctionArgument* node, Ptr symbol); static Ptr DuplicatedSymbol(WfStatement* node, Ptr symbol); static Ptr DuplicatedSymbol(WfExpression* node, Ptr symbol); static Ptr DuplicatedSymbol(WfStateInput* node, Ptr symbol); static Ptr DuplicatedSymbol(WfStateDeclaration* node, Ptr symbol); static Ptr DuplicatedSymbol(WfStateSwitchArgument* node, Ptr symbol); static Ptr InterfaceMethodNotImplemented(WfNewInterfaceExpression* node, reflection::description::IMethodInfo* method); static Ptr InterfaceMethodNotFound(WfFunctionDeclaration* node, reflection::description::ITypeInfo* interfaceType, reflection::description::ITypeInfo* methodType); static Ptr CannotPickOverloadedInterfaceMethods(WfExpression* node, collections::List& results); static Ptr CannotPickOverloadedImplementMethods(WfFunctionDeclaration* node, reflection::description::ITypeInfo* type); static Ptr WrongDeclaration(WfEventDeclaration* node); static Ptr WrongDeclaration(WfPropertyDeclaration* node); static Ptr WrongDeclaration(WfConstructorDeclaration* node); static Ptr WrongDeclaration(WfDestructorDeclaration* node); static Ptr WrongDeclaration(WfAutoPropertyDeclaration* node); static Ptr WrongDeclaration(WfStateMachineDeclaration* node); static Ptr WrongDeclarationInInterfaceConstructor(WfDeclaration* node); static Ptr EnumValuesNotConsecutiveFromZero(WfEnumDeclaration* node); static Ptr FlagValuesNotConsecutiveFromZero(WfEnumDeclaration* node); static Ptr FlagValueNotExists(WfEnumItemIntersection* node, WfEnumDeclaration* owner); static Ptr DuplicatedEnumValue(WfEnumItem* node, WfEnumDeclaration* owner); static Ptr StructContainsNonValueType(WfStructMember* node, WfStructDeclaration* owner); static Ptr StructRecursivelyIncludeItself(WfStructDeclaration* node, collections::List& tds); static Ptr DuplicatedStructMember(WfStructMember* node, WfStructDeclaration* owner); static Ptr AttributeNotExists(WfAttribute* node); static Ptr AttributeMissValue(WfAttribute* node); static Ptr StateMachineClassNotInheritFromStateMachine(WfClassDeclaration* node); static Ptr MissingDefaultState(WfStateMachineDeclaration* node); // E: Module error static Ptr WrongUsingPathWildCard(WfModuleUsingPath* node); // F: Symbol Error static Ptr TopQualifiedSymbolNotExists(parsing::ParsingTreeCustomBase* node, const WString& name); static Ptr ChildSymbolNotExists(parsing::ParsingTreeCustomBase* node, Ptr scopeName, const WString& name); static Ptr MemberNotExists(parsing::ParsingTreeCustomBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name); static Ptr ReferenceNotExists(parsing::ParsingTreeCustomBase* node, const WString& name); static Ptr TooManyTargets(parsing::ParsingTreeCustomBase* node, collections::List& results, const WString& name); static Ptr EnumItemNotExists(parsing::ParsingTreeCustomBase* node, reflection::description::ITypeDescriptor* typeDescriptor, const WString& name); // G: Class error static Ptr WrongClassMemberConfig(WfDeclaration* node); static Ptr FunctionInNewTypeExpressionCannotBeStatic(WfDeclaration* node); static Ptr AutoPropertyCannotBeNormalOutsideOfClass(WfDeclaration* node); static Ptr AutoPropertyCannotBeStatic(WfDeclaration* node); static Ptr WrongClassMember(WfNamespaceDeclaration* node); static Ptr PropertyGetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr PropertySetterNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr PropertyEventNotFound(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr TooManyPropertyGetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr TooManyPropertySetter(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr TooManyPropertyEvent(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr PropertyGetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr PropertySetterTypeMismatched(WfPropertyDeclaration* node, WfClassDeclaration* classDecl); static Ptr WrongBaseType(WfClassDeclaration* node, WfType* type); static Ptr WrongBaseTypeOfClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type); static Ptr WrongBaseTypeOfInterface(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type); static Ptr WrongInterfaceBaseType(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type); static Ptr ClassWithInterfaceConstructor(WfClassDeclaration* node); static Ptr OverrideShouldImplementInterfaceMethod(WfFunctionDeclaration* node); static Ptr OverrideShouldImplementInterfaceMethod(WfAutoPropertyDeclaration* node); static Ptr MissingFieldType(WfVariableDeclaration* node); static Ptr DuplicatedBaseClass(WfClassDeclaration* node, reflection::description::ITypeDescriptor* type); static Ptr ClassRecursiveInheritance(WfClassDeclaration* node, collections::List& tds); static Ptr InterfaceRecursiveInheritance(WfClassDeclaration* node, collections::List& tds); static Ptr WrongBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type); static Ptr DuplicatedBaseConstructorCall(WfBaseConstructorCall* node, reflection::description::ITypeDescriptor* type); static Ptr TooManyDestructor(WfDestructorDeclaration* node, WfClassDeclaration* classDecl); static Ptr AutoPropertyShouldBeInitialized(WfAutoPropertyDeclaration* node); static Ptr AutoPropertyCannotBeInitializedInInterface(WfAutoPropertyDeclaration* node, WfClassDeclaration* classDecl); // CPP: C++ code generation error static Ptr CppUnableToDecideClassOrder(WfClassDeclaration* node, collections::List& tds); static Ptr CppUnableToSeparateCustomFile(WfClassDeclaration* node, collections::List& tds); }; } } } #endif /*********************************************************************** .\EMITTER\WFEMITTER.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 Developer: Zihan Chen(vczh) Workflow::Analyzer Interfaces: **********************************************************************/ #ifndef VCZH_WORKFLOW_ANALYZER_WFEMITTER #define VCZH_WORKFLOW_ANALYZER_WFEMITTER namespace vl { namespace workflow { namespace emitter { /*********************************************************************** Attribute Evaluator ***********************************************************************/ class WfAttributeEvaluator : public Object { typedef reflection::description::Value Value; typedef collections::Dictionary, Value> AttributeValueMap; protected: analyzer::WfLexicalScopeManager* manager; AttributeValueMap attributeValues; // cached value for attribute Ptr attributeAssembly; // shared assembly for evaluating attribute value Ptr attributeGlobalContext; // shared shared context for evaluating attribute value public: WfAttributeEvaluator(analyzer::WfLexicalScopeManager* _manager); Ptr GetAttribute(collections::List>& atts, const WString& category, const WString& name); collections::LazyList> GetAttributes(collections::List>& atts, const WString& category, const WString& name); Value GetAttributeValue(Ptr att); }; /*********************************************************************** Code Generation ***********************************************************************/ struct WfCodegenLambdaContext { WfFunctionDeclaration* functionDeclaration = 0; WfFunctionExpression* functionExpression = 0; WfOrderedLambdaExpression* orderedLambdaExpression = 0; }; enum class WfCodegenScopeType { Function, // contains the whole function Loop, // contains all loops TryCatch, // contains try and catch, not finally Block, // contains labeled blocks }; class WfCodegenScopeContext : public Object { typedef collections::List InstructionIndexList; typedef collections::List InstructionList; typedef collections::List RangeMap; public: WfCodegenScopeType type = WfCodegenScopeType::Function; InstructionIndexList continueInstructions; InstructionIndexList breakInstructions; WString name; InstructionList exitInstructions; RangeMap instructionCodeMappingBeforeCodegen; RangeMap instructionCodeMappingAfterCodegen; Ptr exitStatement; }; class WfCodegenFunctionContext : public Object { typedef collections::Dictionary VariableIndexMap; typedef collections::Dictionary ClosureIndexMap; typedef collections::List> ScopeContextList; public: Ptr function; VariableIndexMap capturedVariables; VariableIndexMap arguments; VariableIndexMap localVariables; ClosureIndexMap closuresToCodegen; ScopeContextList scopeContextStack; WfCodegenFunctionContext(); Ptr GetCurrentScopeContext(); Ptr GetCurrentScopeContext(WfCodegenScopeType type, const WString& name = WString::Empty); Ptr PushScopeContext(WfCodegenScopeType type, const WString& name = WString::Empty); void PopScopeContext(); }; class WfCodegenContext : public Object { typedef collections::Dictionary SymbolIndexMap; typedef collections::Dictionary ConstructorIndexMap; typedef collections::Dictionary DestructorIndexMap; typedef collections::Dictionary NodePositionMap; typedef collections::Dictionary, vint> ThisStackCountMap; public: Ptr assembly; analyzer::WfLexicalScopeManager* manager; SymbolIndexMap globalVariables; SymbolIndexMap globalFunctions; ConstructorIndexMap constructors; DestructorIndexMap destructors; SymbolIndexMap closureFunctions; Ptr functionContext; NodePositionMap nodePositionsBeforeCodegen; NodePositionMap nodePositionsAfterCodegen; ThisStackCountMap thisStackCounts; WfCodegenContext(Ptr _assembly, analyzer::WfLexicalScopeManager* _manager); vint AddInstruction(parsing::ParsingTreeCustomBase* node, const runtime::WfInstruction& ins); void AddExitInstruction(parsing::ParsingTreeCustomBase* node, const runtime::WfInstruction& ins); void ApplyExitInstructions(Ptr scopeContext); vint GetThisStackCount(analyzer::WfLexicalScope* scope); }; extern void GenerateFunctionDeclarationMetadata(WfCodegenContext& context, WfFunctionDeclaration* node, Ptr meta); extern void GenerateGlobalDeclarationMetadata(WfCodegenContext& context, Ptr declaration, const WString& namePrefix = L""); extern void GenerateClosureInstructions(WfCodegenContext& context, Ptr functionContext); extern void GenerateInitializeInstructions(WfCodegenContext& context, Ptr declaration); extern void GenerateDeclarationInstructions(WfCodegenContext& context, Ptr declaration); extern void GenerateStatementInstructions(WfCodegenContext& context, Ptr statement); extern Ptr GenerateExpressionInstructions(WfCodegenContext& context, Ptr expression, Ptr expectedType = 0); extern void GenerateTypeCastInstructions(WfCodegenContext& context, Ptr expectedType, bool strongCast, WfExpression* node); extern void GenerateTypeTestingInstructions(WfCodegenContext& context, Ptr expectedType, WfExpression* node); extern runtime::WfInsType GetInstructionTypeArgument(Ptr expectedType); /// Generate an assembly from semantic analyzed modules. [M:vl.workflow.analyzer.WfLexicalScopeManager.Rebuild] should be called before using this function. /// The generated assembly. /// The scope manager that is used to perform semantic analyzing. /// The callback to receive progress information (optional). extern Ptr GenerateAssembly(analyzer::WfLexicalScopeManager* manager, IWfCompilerCallback* callback = nullptr); /// Compile a Workflow program. /// The generated assembly. Return nullptr if failed to compile. /// The workflow parser table. It can be retrived from [M:vl.workflow.WfLoadTable]. This is reusable, it is recommended to keep this object alive between multiple compiling to improve performance. /// The scope manager. This is reusable, it is recommended to keep this object alive between multiple compiling to improve performance. /// All workflow module codes. /// Container to get all errors generated during compiling. extern Ptr Compile(Ptr table, analyzer::WfLexicalScopeManager* manager, collections::List& moduleCodes, collections::List>& errors); /// Compile a Workflow program. Use the other one whenever possible, which alloes reusing to improve performance. /// The generated assembly. Return nullptr if failed to compile. /// The workflow parser table. It can be retrived from [M:vl.workflow.WfLoadTable]. This is reusable, it is recommended to keep this object alive between multiple compiling to improve performance. /// All workflow module codes. /// Container to get all errors generated during compiling. extern Ptr Compile(Ptr table, collections::List& moduleCodes, collections::List>& errors); } } } #endif /*********************************************************************** .\CPP\WFCPP.H ***********************************************************************/ /*********************************************************************** Vczh Library++ 3.0 Developer: Zihan Chen(vczh) Workflow::C++ Code Generator Interfaces: **********************************************************************/ #ifndef VCZH_WORKFLOW_CPP_WFCPP #define VCZH_WORKFLOW_CPP_WFCPP namespace vl { namespace workflow { namespace cppcodegen { /* Vczh Workflow Special Name: __vwsn_not_exists__ : Represents all not supported code __vwsn_temp_(#|_) : Temporary variable __vwsn_CATEGORY : __vwsn_CATEGORY_NAME : NAME __vwsno#_ASSEMBLY_* : Ordered lambda class name __vwsnf#_ASSEMBLY_* : Function expression class name __vwsnc#_ASSEMBLY_* : Anonymous interface class name __vwsnthis_# : Captured this pointer in fields __vwsnctor_* : Captured symbol in constructor arguments, assigned to "this->*" __vwsnctorthis_# : Captured this pointer in constructor arguments assigned to "this->__vwsnthis_#"? __vwsnt_# : Temporary type __vwsne_# : Temporary variable (not for lambda) __vwsnb_# : Temporary block __vwnsl_#_LABEL_NAME : Goto label __vwsn_structs::NAME : Struct definition __vwsn_enums::NAME : Struct definition */ class WfCppConfig : public Object { using ITypeInfo = reflection::description::ITypeInfo; using IMethodInfo = reflection::description::IMethodInfo; using ITypeDescriptor = reflection::description::ITypeDescriptor; public: class ClosureInfo : public Object { using SymbolMap = collections::Dictionary>; public: WString lambdaClassName; SymbolMap symbols; SymbolMap ctorArgumentSymbols; collections::List thisTypes; // nearer this pointer first }; public: regex::Regex regexSplitName; regex::Regex regexSpecialName; regex::Regex regexTemplate; protected: Ptr CollectClosureInfo(Ptr closure); void Collect(); struct GlobalDep { collections::Dictionary allTds; // Type name to type descriptor of class decls. Class index is the position in this map. collections::Group expandedClassDecls; // Class index (-1 means top level) to all direct and indirect internal classes collections::Group dependencies; // Class dependencies collections::SortedList topLevelClasses; // Class index collections::Group topLevelClassDep; // Class dependencies for top level classes }; struct ClassLevelDep { Ptr parentClass; vint parentIndexKey = -1; collections::Group depGroup; // A slice of GlobalDep::dependencies collections::Dictionary subClass; // Classes to their ancestor, which are direct internal classes of the selected parent class }; void ExpandClassDeclGroup(Ptr parent, GlobalDep& globalDep); void GenerateClassDependencies(GlobalDep& globalDep); void GenerateGlobalDep(GlobalDep& globalDep); void CollectExpandedDepGroup(vint parentIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep); void CollectExpandedSubClass(vint subDeclIndexKey, GlobalDep& globalDep, ClassLevelDep& classLevelDep); void GenerateClassLevelDep(Ptr parent, GlobalDep& globalDep, ClassLevelDep& classLevelDep); void SortClassDecls(GlobalDep& globalDep); void GenerateFileClassMaps(GlobalDep& globalDep); void SortFileClassMaps(GlobalDep& globalDep); void AssignClassDeclsToFiles(); template void SortDeclsByName(collections::List>& decls) { collections::Sort>(&decls[0], decls.Count(), [=](Ptr a, Ptr b) { auto tdA = manager->declarationTypes[a.Obj()].Obj(); auto tdB = manager->declarationTypes[b.Obj()].Obj(); return WString::Compare(tdA->GetTypeName(), tdB->GetTypeName()); }); } public: analyzer::WfLexicalScopeManager* manager; Ptr attributeEvaluator; WString assemblyNamespace; WString assemblyName; collections::Dictionary> tdDecls; // type descriptor to declaration collections::Group, Ptr> enumDecls; // class (nullable) to direct internal enums collections::Group, Ptr> structDecls; // class (nullable) to direct internal structs collections::Group, Ptr> classDecls; // class (nullable) to direct internal classes collections::List> varDecls; // global variables collections::List> funcDecls; // global functions collections::Group> customFilesClasses; // @cpp:File to top level classes, empty key means the default cpp collections::Group> headerFilesClasses; // non-@cpp:File header file to top level classes, 0 means the default header collections::Group headerIncludes; // 0:default header, positive:@cpp:File indexed in customFilesClasses, negative:non-@cpp:File headers collections::Dictionary, WString> lambdaExprs; collections::Dictionary, WString> classExprs; collections::Dictionary, Ptr> closureInfos; collections::Group, Ptr> classClosures; WfCppConfig(analyzer::WfLexicalScopeManager* _manager, const WString& _assemblyName, const WString& _assemblyNamespace); ~WfCppConfig(); void WriteFunctionBody(stream::StreamWriter& writer, Ptr expr, const WString& prefix, ITypeInfo* expectedType); void WriteFunctionBody(stream::StreamWriter& writer, Ptr stat, const WString& prefix, ITypeInfo* expectedType); WString CppNameToHeaderEnumStructName(const WString& fullName, const WString& type); WString ConvertNameInternal(const WString& name, const WString& specialNameCategory, bool alwaysUseCategory); WString ConvertName(const WString& name); WString ConvertName(const WString& name, const WString& specialNameCategory); WString ConvertFullName(const WString& fullName, WString delimiter = L"::"); WString ConvertFunctionType(IMethodInfo* methodInfo, WString name = WString::Empty); WString ConvertFunctionType(ITypeInfo* typeInfo); bool IsSpecialGenericType(ITypeInfo* typeInfo); WString ConvertType(ITypeDescriptor* typeInfo, WString delimiter = L"::"); WString ConvertType(ITypeInfo* typeInfo, bool useHeaderEnumStructName = false); WString ConvertArgumentType(ITypeInfo* typeInfo); WString DefaultValue(ITypeInfo* typeInfo); bool IsClassHasUserImplMethods(Ptr decl, bool searchInternalClasses); vint CountClassNamespace(Ptr decl); void GetClassNamespace(Ptr decl, collections::List& nss); WString GetClassBaseName(Ptr decl); WString WriteNamespace(stream::StreamWriter& writer, collections::List& nss, collections::List& nss2); WString WriteNamespace(stream::StreamWriter& writer, const WString& fullName, collections::List& nss, WString& name); void WriteNamespaceEnd(stream::StreamWriter& writer, collections::List& nss); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, ITypeInfo* typeInfo, collections::List& arguments, const WString& name, bool writeReturnType); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, Ptr ordered, const WString& name, bool writeReturnType); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, Ptr funcExpr, const WString& name, bool writeReturnType); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, Ptr decl, const WString& name, bool writeReturnType); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, collections::List& arguments, const WString& name, bool writeReturnType); ITypeInfo* WriteFunctionHeader(stream::StreamWriter& writer, IMethodInfo* methodInfo, const WString& name, bool writeReturnType); void WriteHeader_Enum(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix, bool mainHeaderDefinition); void WriteHeader_EnumOp(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix); void WriteHeader_Enum(stream::StreamWriter& writer, Ptr decl, collections::List& nss, bool mainHeaderDefinition); void WriteHeader_MainHeaderEnums(stream::StreamWriter& writer, collections::List& nss); void WriteHeader_Struct(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix, bool mainHeaderDefinition); void WriteHeader_StructOp(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix); void WriteHeader_Struct(stream::StreamWriter& writer, Ptr decl, collections::List& nss, bool mainHeaderDefinition); void WriteHeader_MainHeaderStructs(stream::StreamWriter& writer, collections::List& nss); void WriteHeader_ClosurePreDecl(stream::StreamWriter& writer, Ptr closure); void WriteHeader_LambdaExprDecl(stream::StreamWriter& writer, Ptr lambda); void WriteHeader_ClassExprDecl(stream::StreamWriter& writer, Ptr lambda); bool WriteCpp_ClosureMembers(stream::StreamWriter& writer, Ptr closure); void WriteCpp_ClosureCtor(stream::StreamWriter& writer, Ptr closure, const WString& name); void WriteCpp_ClosureCtorInitList(stream::StreamWriter& writer, Ptr closure); void WriteCpp_LambdaExprImpl(stream::StreamWriter& writer, Ptr lambda); void WriteCpp_ClassExprImpl(stream::StreamWriter& writer, Ptr lambda); void WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix); void WriteHeader_ClassPreDecl(stream::StreamWriter& writer, Ptr decl, collections::List& nss); void WriteHeader_Class(stream::StreamWriter& writer, Ptr decl, const WString& name, const WString& prefix); WString WriteHeader_Class(stream::StreamWriter& writer, Ptr decl, collections::List& nss); bool WriteCpp_ClassMember(stream::StreamWriter& writer, Ptr decl, Ptr memberDecl, collections::List& nss); void WriteCpp_Class(stream::StreamWriter& writer, Ptr decl, collections::List& nss); void SortClosure(collections::Dictionary>& reversedLambdaExprs, collections::Dictionary>& reversedClassExprs); void WriteHeader_Global(stream::StreamWriter& writer); void WriteCpp_Global(stream::StreamWriter& writer); void WriteHeader_Reflection(stream::StreamWriter& writer); void WriteCpp_Reflection(stream::StreamWriter& writer); void WritePushCompileOptions(stream::StreamWriter& writer); void WritePopCompileOptions(stream::StreamWriter& writer); void WriteCpp_PushMacros(stream::StreamWriter& writer); void WriteCpp_PopMacros(stream::StreamWriter& writer); void WriteHeader(stream::StreamWriter& writer, bool multiFile); void WriteNonCustomSubHeader(stream::StreamWriter& writer, vint fileIndex); void WriteCpp(stream::StreamWriter& writer, bool multiFile); void WriteSubHeader(stream::StreamWriter& writer, const WString& fileName); void WriteSubCpp(stream::StreamWriter& writer, const WString& fileName); void WriteReflectionHeader(stream::StreamWriter& writer, bool multiFile); void WriteReflectionCpp(stream::StreamWriter& writer, bool multiFile); }; /*********************************************************************** WfCppConfig::Collect ***********************************************************************/ extern void CollectModule(WfCppConfig* config, Ptr module); /*********************************************************************** WfCppConfig::Write ***********************************************************************/ class FunctionRecord : public Object { using LabelMap = collections::Dictionary; public: vint exprCounter = 0; vint blockCounter = 0; vint labelCounter = 0; LabelMap labelNames; }; extern void GenerateExpression(WfCppConfig* config, stream::StreamWriter& writer, Ptr node, reflection::description::ITypeInfo* expectedType, bool useReturnValue = true); extern void GenerateStatement(WfCppConfig* config, Ptr functionRecord, stream::StreamWriter& writer, Ptr node, const WString& prefix, const WString& prefixDelta, reflection::description::ITypeInfo* returnType); extern void GenerateClassMemberDecl(WfCppConfig* config, stream::StreamWriter& writer, const WString& className, Ptr memberDecl, const WString& prefix, bool forClassExpr); extern bool GenerateClassMemberImpl(WfCppConfig* config, stream::StreamWriter& writer, WfClassDeclaration* classDef, const WString& classBaseName, const WString& className, const WString& classFullName, Ptr memberDecl, const WString& prefix); extern void ConvertType(WfCppConfig* config, stream::StreamWriter& writer, reflection::description::ITypeInfo* fromType, reflection::description::ITypeInfo* toType, const Func& writeExpression, bool strongCast); /*********************************************************************** GenerateCppFiles ***********************************************************************/ enum class WfCppFileSwitch { Enabled, Disabled, OnDemand, }; class WfCppInput : public Object { public: WfCppFileSwitch multiFile = WfCppFileSwitch::Enabled; WfCppFileSwitch reflection = WfCppFileSwitch::Enabled; WString comment; WString headerGuardPrefix; WString assemblyName; WString assemblyNamespace; WString includeFileName; WString reflectionFileName; WString defaultFileName; collections::List normalIncludes; collections::List reflectionIncludes; WfCppInput(const WString& _assemblyName); }; class WfCppOutput : public Object { public: collections::Dictionary cppFiles; bool containsReflectionInfo = false; bool multiFile = false; bool reflection = false; WString entryFileName; }; class MergeCppMultiPlatformException : public Exception { public: vint row32; vint column32; vint row64; vint column64; MergeCppMultiPlatformException(vint _row32, vint _column32, vint _row64, vint _column64); }; extern Ptr GenerateCppFiles(Ptr input, analyzer::WfLexicalScopeManager* manager); extern WString MergeCppMultiPlatform(const WString& code32, const WString& code64); extern WString MergeCppFileContent(const WString& dst, const WString& src); } } } #endif