import { AnythingConstructASTNode } from "../../../ast/ASTNode"; import { AddressOfExpressionASTNode, ArithmeticBinaryOperatorExpressionASTNode, ArrowExpressionASTNode, AssignmentExpressionASTNode, BitwiseNotExpressionASTNode, CommaASTNode, CompoundAssignmentExpressionASTNode, ConstCastExpressionASTNode, ConstructExpressionASTNode, CStyleCastExpressionASTNode, DeleteArrayExpressionASTNode, DeleteExpressionASTNode, DereferenceExpressionASTNode, DotExpressionASTNode, DynamicCastExpressionASTNode, ExpressionASTNode, FunctionCallExpressionASTNode, IdentifierExpressionASTNode, InitializerListExpressionASTNode, LogicalBinaryOperatorExpressionASTNode, LogicalNotExpressionASTNode, NewExpressionASTNode, NullptrExpressionASTNode, NumericLiteralASTNode, OpaqueExpressionASTNode, ParenthesesExpressionASTNode, PointerToMemberExpressionASTNode, PostfixIncrementExpressionASTNode, PrefixIncrementExpressionASTNode, ReinterpretCastExpressionASTNode, RelationalBinaryOperatorExpressionASTNode, SizeofExpressionASTNode, SizeofTypeExpressionASTNode, StaticCastExpressionASTNode, StringLiteralASTNode, SubscriptExpressionASTNode, TernaryASTNode, ThisExpressionASTNode, UnaryMinusExpressionASTNode, UnaryPlusExpressionASTNode } from "../../../ast/ast_expressions"; import { ExpressionContext } from "../../compilation/contexts"; import { ArithmeticType, ArrayElemType, AtomicType, CompleteClassType, CompleteObjectType, CompleteReturnType, ExpressionType, FunctionType, PeelReference, PointerToCompleteType as PointerToCompleteObjectType, PointerType } from "../../compilation/types"; import { RuntimeConstruct } from "../CPPConstruct"; import { AddressOfExpression, CompiledAddressOfExpression, RuntimeAddressOfExpression, TypedAddressOfExpression } from "./AddressOfExpression"; import { AnythingExpression } from "./AnythingExpression"; import { ArithmeticBinaryOperatorExpression, CompiledArithmeticBinaryOperatorExpression, RuntimeArithmeticBinaryOperator, TypedArithmeticBinaryOperatorExpression } from "./ArithmeticBinaryOperatorExpression"; import { ArrowExpression, CompiledFunctionArrowExpression, CompiledObjectArrowExpression, RuntimeFunctionArrowExpression, RuntimeObjectArrowExpression, TypedFunctionArrowExpression, TypedObjectArrowExpression } from "./ArrowExpression"; import { AssignmentExpression, CompiledAssignmentExpression, RuntimeAssignment, TypedAssignmentExpression } from "./AssignmentExpression"; import { AuxiliaryExpression, CompiledAuxiliaryExpression, TypedAuxiliaryExpression } from "./AuxiliaryExpression"; import { AnalyticBinaryOperatorExpression } from "./BinaryOperatorExpression"; import { CommaExpression, CompiledCommaExpression, CompiledTernaryExpression, RuntimeComma, RuntimeTernary, TernaryExpression, TypedCommaExpression, TypedTernaryExpression } from "./CommaExpression"; import { CompiledCompoundAssignmentExpression, CompoundAssignmentExpression, RuntimeCompoundAssignment, TypedCompoundAssignmentExpression } from "./CompoundAssignmentExpression"; import { CompiledDeleteArrayExpression, CompiledDeleteExpression, DeleteArrayExpression, DeleteExpression, RuntimeDeleteArrayExpression, RuntimeDeleteExpression, TypedDeleteArrayExpression, TypedDeleteExpression } from "./DeleteExpression"; import { CompiledDereferenceExpression, DereferenceExpression, RuntimeDereferenceExpression, TypedDereferenceExpression } from "./DereferenceExpression"; import { CompiledFunctionDotExpression, CompiledObjectDotExpression, DotExpression, RuntimeFunctionDotExpression, RuntimeObjectDotExpression, TypedFunctionDotExpression, TypedObjectDotExpression } from "./DotExpression"; import { CompiledExpression, ValueCategory } from "./Expression"; import { RuntimeExpression } from "./RuntimeExpression"; import { CompiledFunctionCallExpression, FunctionCallExpression, RuntimeFunctionCallExpression, TypedFunctionCallExpression } from "./FunctionCallExpression"; import { CompiledFunctionIdentifierExpression, CompiledObjectIdentifierExpression, IdentifierExpression, RuntimeFunctionIdentifierExpression, RuntimeObjectIdentifierExpression, TypedFunctionIdentifierExpression, TypedObjectIdentifierExpression } from "./IdentifierExpression"; import { CompiledImplicitConversion, ImplicitConversion, RuntimeImplicitConversion, TypedImplicitConversion } from "./ImplicitConversion"; import { CompiledInitializerListExpression, InitializerListExpression, RuntimeInitializerListExpression, TypedInitializerListExpression } from "./InitializerListExpression"; import { CompiledInputOperatorExpression, RuntimeInputOperatorExpression, TypedInputOperatorExpression } from "./InputOperatorExpression"; import { CompiledLogicalBinaryOperatorExpression, LogicalBinaryOperatorExpression, RuntimeLogicalBinaryOperatorExpression, TypedLogicalBinaryOperatorExpression } from "./LogicalBinaryOperatorExpression"; import { CompiledLogicalNotExpression, LogicalNotExpression, RuntimeLogicalNotExpression, TypedLogicalNotExpression } from "./LogicalNotExpression"; import { CompiledMagicFunctionCallExpression, MagicFunctionCallExpression, RuntimeMagicFunctionCallExpression, TypedMagicFunctionCallExpression } from "./MagicFunctionCallExpression"; import { CompiledNewArrayExpression, CompiledNewExpression, createNewExpressionFromAST, NewArrayExpression, NewExpression, NewObjectType, RuntimeNewArrayExpression, RuntimeNewExpression, TypedNewArrayExpression, TypedNewExpression } from "./NewExpression"; import { CompiledMemberOperatorOverloadExpression, CompiledNonMemberOperatorOverloadExpression, InvalidOperatorOverloadExpression, OperatorOverloadExpression, RuntimeMemberOperatorOverloadExpression, RuntimeNonMemberOperatorOverloadExpression, TypedMemberOperatorOverloadExpression, TypedNonMemberOperatorOverloadExpression } from "./OperatorOverloadExpression"; import { CompiledNullptrExpression, NullptrExpression, RuntimeNullptrExpression, TypedNullptrExpression } from "./NullptrExpression"; import { CompiledNumericLiteralExpression, NumericLiteralExpression, RuntimeNumericLiteral, TypedNumericLiteralExpression } from "./NumericLiteralExpression"; import { CompiledOpaqueExpression, OpaqueExpression, RuntimeOpaqueExpression, TypedOpaqueExpression } from "./OpaqueExpression"; import { CompiledOutputOperatorExpression, RuntimeOutputOperatorExpression, TypedOutputOperatorExpression } from "./OutputOperatorExpression"; import { CompiledParenthesesExpression, ParenthesesExpression, RuntimeParentheses, TypedParenthesesExpression } from "./ParenthesesExpression"; import { CompiledPointerComparisonExpression, RuntimePointerComparisonExpression, TypedPointerComparisonExpression } from "./PointerComparisonExpression"; import { CompiledPointerDifferenceExpression, RuntimePointerDifference, TypedPointerDifferenceExpression } from "./PointerDifferenceExpression"; import { CompiledPointerOffsetExpression, RuntimePointerOffset, TypedPointerOffsetExpression } from "./PointerOffsetExpression"; import { CompiledPostfixIncrementExpression, PostfixIncrementExpression, RuntimePostfixIncrementExpression, TypedPostfixIncrementExpression } from "./PostfixIncrementExpression"; import { CompiledPrefixIncrementExpression, PrefixIncrementExpression, RuntimePrefixIncrementExpression, TypedPrefixIncrementExpression } from "./PrefixIncrementExpression"; import { CompiledRelationalBinaryOperatorExpression, RelationalBinaryOperatorExpression, RuntimeRelationalBinaryOperator, TypedRelationalBinaryOperatorExpression } from "./RelationalBinaryOperatorExpression"; import { CompiledStringLiteralExpression, RuntimeStringLiteralExpression, StringLiteralExpression, TypedStringLiteralExpression } from "./StringLiteralExpression"; import { CompiledSubscriptExpression, RuntimeSubscriptExpression, SubscriptExpression, TypedSubscriptExpression } from "./SubscriptExpression"; import { CompiledThisExpression, RuntimeThisExpression, ThisExpression, TypedThisExpression } from "./ThisExpression"; import { CompiledUnaryMinusExpression, RuntimeUnaryMinusExpression, TypedUnaryMinusExpression, UnaryMinusExpression } from "./UnaryMinusExpression"; import { AnalyticUnaryOperatorExpression } from "./UnaryOperatorExpression"; import { CompiledUnaryPlusExpression, RuntimeUnaryPlusExpression, TypedUnaryPlusExpression, UnaryPlusExpression } from "./UnaryPlusExpression"; import { UnsupportedExpression } from "./UnsupportedExpression"; const ExpressionConstructsMap = { "comma_expression": (ast: CommaASTNode, context: ExpressionContext) => CommaExpression.createFromAST(ast, context), "ternary_expression": (ast: TernaryASTNode, context: ExpressionContext) => TernaryExpression.createFromAST(ast, context), "assignment_expression": (ast: AssignmentExpressionASTNode, context: ExpressionContext) => AssignmentExpression.createFromAST(ast, context), "compound_assignment_expression": (ast: CompoundAssignmentExpressionASTNode, context: ExpressionContext) => CompoundAssignmentExpression.createFromAST(ast, context), // binary operators "arithmetic_binary_operator_expression": (ast: ArithmeticBinaryOperatorExpressionASTNode, context: ExpressionContext) => ArithmeticBinaryOperatorExpression.createFromAST(ast, context), "relational_binary_operator_expression": (ast: RelationalBinaryOperatorExpressionASTNode, context: ExpressionContext) => RelationalBinaryOperatorExpression.createFromAST(ast, context), "logical_binary_operator_expression": (ast: LogicalBinaryOperatorExpressionASTNode, context: ExpressionContext) => LogicalBinaryOperatorExpression.createFromAST(ast, context), "pointer_to_member_expression": (ast: PointerToMemberExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "pointer-to-member"), "c_style_cast_expression": (ast: CStyleCastExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "c-style cast"), // prefix operators "prefix_increment_expression": (ast: PrefixIncrementExpressionASTNode, context: ExpressionContext) => PrefixIncrementExpression.createFromAST(ast, context), "dereference_expression": (ast: DereferenceExpressionASTNode, context: ExpressionContext) => DereferenceExpression.createFromAST(ast, context), "address_of_expression": (ast: AddressOfExpressionASTNode, context: ExpressionContext) => AddressOfExpression.createFromAST(ast, context), "unary_plus_expression": (ast: UnaryPlusExpressionASTNode, context: ExpressionContext) => UnaryPlusExpression.createFromAST(ast, context), "unary_minus_expression": (ast: UnaryMinusExpressionASTNode, context: ExpressionContext) => UnaryMinusExpression.createFromAST(ast, context), "logical_not_expression": (ast: LogicalNotExpressionASTNode, context: ExpressionContext) => LogicalNotExpression.createFromAST(ast, context), "bitwise_not_expression": (ast: BitwiseNotExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "bitwise not"), "sizeof_expression": (ast: SizeofExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "sizeof"), "sizeof_type_expression": (ast: SizeofTypeExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "sizeof (type)"), "new_expression": (ast: NewExpressionASTNode, context: ExpressionContext) => createNewExpressionFromAST(ast, context), "delete_expression": (ast: DeleteExpressionASTNode, context: ExpressionContext) => DeleteExpression.createFromAST(ast, context), "delete_array_expression": (ast: DeleteArrayExpressionASTNode, context: ExpressionContext) => DeleteArrayExpression.createFromAST(ast, context), // postfix operators "static_cast_expression": (ast: StaticCastExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "static cast"), "dynamic_cast_expression": (ast: DynamicCastExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "dynamic cast"), "reinterpret_cast_expression": (ast: ReinterpretCastExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "reinterpret cast"), "const_cast_expression": (ast: ConstCastExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "const cast"), "subscript_expression": (ast: SubscriptExpressionASTNode, context: ExpressionContext) => SubscriptExpression.createFromAST(ast, context), "function_call_expression": (ast: FunctionCallExpressionASTNode, context: ExpressionContext) => FunctionCallExpression.createFromAST(ast, context), "dot_expression": (ast: DotExpressionASTNode, context: ExpressionContext) => DotExpression.createFromAST(ast, context), "arrow_expression": (ast: ArrowExpressionASTNode, context: ExpressionContext) => ArrowExpression.createFromAST(ast, context), "postfix_increment_expression": (ast: PostfixIncrementExpressionASTNode, context: ExpressionContext) => PostfixIncrementExpression.createFromAST(ast, context), "construct_expression": (ast: ConstructExpressionASTNode, context: ExpressionContext) => new UnsupportedExpression(context, ast, "construct expression"), "identifier_expression": (ast: IdentifierExpressionASTNode, context: ExpressionContext) => IdentifierExpression.createFromAST(ast, context), "this_expression": (ast: ThisExpressionASTNode, context: ExpressionContext) => ThisExpression.createFromAST(ast, context), "nullptr_expression": (ast: NullptrExpressionASTNode, context: ExpressionContext) => NullptrExpression.createFromAST(ast, context), "numeric_literal_expression": (ast: NumericLiteralASTNode, context: ExpressionContext) => NumericLiteralExpression.createFromAST(ast, context), "string_literal_expression": (ast: StringLiteralASTNode, context: ExpressionContext) => StringLiteralExpression.createFromAST(ast, context), "parentheses_expression": (ast: ParenthesesExpressionASTNode, context: ExpressionContext) => ParenthesesExpression.createFromAST(ast, context), "initializer_list_expression": (ast: InitializerListExpressionASTNode, context: ExpressionContext) => InitializerListExpression.createFromAST(ast, context), "opaque_expression": (ast: OpaqueExpressionASTNode, context: ExpressionContext) => OpaqueExpression.createFromAST(ast, context), "anything_construct": (ast: AnythingConstructASTNode, context: ExpressionContext) => new AnythingExpression(context, ast) } /** * Creates an expression construct based on a given expression AST node. * If the `ast` argument has a union type that is a subtype of `ExpressionASTNode`, * this function's return type is inferred as corresponding union of construct types. * @param ast An expression AST node. * @param context The context in which this expression occurs. */ export function createExpressionFromAST(ast: ASTType, context: ExpressionContext): ReturnType<(typeof ExpressionConstructsMap)[ASTType["construct_type"]]> { if (!ExpressionConstructsMap[ast.construct_type]) { console.log("Oops! Can't find expression construct type: " + ast.construct_type); } return ExpressionConstructsMap[ast.construct_type](ast, context); } export type AnalyticExpression = OperatorOverloadExpression | CommaExpression | TernaryExpression | AssignmentExpression | CompoundAssignmentExpression | AnalyticBinaryOperatorExpression | // PointerToMemberExpression | // CStyleCastExpression | AnalyticUnaryOperatorExpression | NewExpression | NewArrayExpression | DeleteExpression | DeleteArrayExpression | PostfixIncrementExpression | SubscriptExpression | DotExpression | ArrowExpression | FunctionCallExpression | // ConstructExpression | IdentifierExpression | ThisExpression | NullptrExpression | NumericLiteralExpression | StringLiteralExpression | ParenthesesExpression | InitializerListExpression | OpaqueExpression | MagicFunctionCallExpression | AuxiliaryExpression | UnsupportedExpression | ImplicitConversion; export type TypedExpressionKinds = { "unsupported_expression": never; "anything_construct": never; "invalid_operator_overload_expression": never; "comma_expression": T extends NonNullable ? V extends NonNullable ? TypedCommaExpression : never : NonNullable extends T ? V extends NonNullable ? TypedCommaExpression : never : never; "ternary_expression": T extends NonNullable ? V extends NonNullable ? TypedTernaryExpression : never : NonNullable extends T ? V extends NonNullable ? TypedTernaryExpression : never : never; "assignment_expression": T extends NonNullable ? V extends NonNullable ? TypedAssignmentExpression : never : NonNullable extends T ? V extends NonNullable ? TypedAssignmentExpression : never : never; "compound_assignment_expression": T extends NonNullable ? V extends NonNullable ? TypedCompoundAssignmentExpression : never : NonNullable extends T ? V extends NonNullable ? TypedCompoundAssignmentExpression : never : never; "arithmetic_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? TypedArithmeticBinaryOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? TypedArithmeticBinaryOperatorExpression : never : never; "pointer_difference_expression": T extends NonNullable ? V extends NonNullable ? TypedPointerDifferenceExpression : never : NonNullable extends T ? V extends NonNullable ? TypedPointerDifferenceExpression : never : never; "pointer_offset_expression": T extends NonNullable ? V extends NonNullable ? TypedPointerOffsetExpression : never : NonNullable extends T ? V extends NonNullable ? TypedPointerOffsetExpression : never : never; "output_operator_expression": T extends NonNullable ? V extends NonNullable ? TypedOutputOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? TypedOutputOperatorExpression : never : never; "input_operator_expression": T extends NonNullable ? V extends NonNullable ? TypedInputOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? TypedInputOperatorExpression : never : never; "relational_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? TypedRelationalBinaryOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? TypedRelationalBinaryOperatorExpression : never : never; "pointer_comparison_expression": T extends NonNullable ? V extends NonNullable ? TypedPointerComparisonExpression : never : NonNullable extends T ? V extends NonNullable ? TypedPointerComparisonExpression : never : never; "logical_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? TypedLogicalBinaryOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? TypedLogicalBinaryOperatorExpression : never : never; "non_member_operator_overload_expression": T extends NonNullable ? V extends NonNullable ? TypedNonMemberOperatorOverloadExpression : never : NonNullable extends T ? V extends NonNullable ? TypedNonMemberOperatorOverloadExpression : never : never; "member_operator_overload_expression": T extends NonNullable ? V extends NonNullable ? TypedMemberOperatorOverloadExpression : never : NonNullable extends T ? V extends NonNullable ? TypedMemberOperatorOverloadExpression : never : never; "prefix_increment_expression": T extends NonNullable ? V extends NonNullable ? TypedPrefixIncrementExpression : never : NonNullable extends T ? V extends NonNullable ? TypedPrefixIncrementExpression : never : never; "dereference_expression": T extends NonNullable ? V extends NonNullable ? TypedDereferenceExpression : never : NonNullable extends T ? V extends NonNullable ? TypedDereferenceExpression : never : never; "address_of_expression": T extends NonNullable ? V extends NonNullable ? TypedAddressOfExpression : never : NonNullable extends T ? V extends NonNullable ? TypedAddressOfExpression : never : never; "new_expression": T extends NonNullable ? V extends NonNullable ? TypedNewExpression : never : NonNullable extends T ? V extends NonNullable ? TypedNewExpression : never : never; "new_array_expression": T extends NonNullable ? V extends NonNullable ? TypedNewArrayExpression : never : NonNullable extends T ? V extends NonNullable ? TypedNewArrayExpression : never : never; "delete_expression": T extends NonNullable ? V extends NonNullable ? TypedDeleteExpression : never : NonNullable extends T ? V extends NonNullable ? TypedDeleteExpression : never : never; "delete_array_expression": T extends NonNullable ? V extends NonNullable ? TypedDeleteArrayExpression : never : NonNullable extends T ? V extends NonNullable ? TypedDeleteArrayExpression : never : never; "this_expression": T extends NonNullable ? V extends NonNullable ? TypedThisExpression : never : NonNullable extends T ? V extends NonNullable ? TypedThisExpression : never : never; "nullptr_expression": T extends NonNullable ? V extends NonNullable ? TypedNullptrExpression : never : NonNullable extends T ? V extends NonNullable ? TypedNullptrExpression : never : never; "unary_plus_expression": T extends NonNullable ? V extends NonNullable ? TypedUnaryPlusExpression : never : NonNullable extends T ? V extends NonNullable ? TypedUnaryPlusExpression : never : never; "unary_minus_expression": T extends NonNullable ? V extends NonNullable ? TypedUnaryMinusExpression : never : NonNullable extends T ? V extends NonNullable ? TypedUnaryMinusExpression : never : never; "logical_not_expression": T extends NonNullable ? V extends NonNullable ? TypedLogicalNotExpression : never : NonNullable extends T ? V extends NonNullable ? TypedLogicalNotExpression : never : never; "postfix_increment_expression": T extends NonNullable ? V extends NonNullable ? TypedPostfixIncrementExpression : never : NonNullable extends T ? V extends NonNullable ? TypedPostfixIncrementExpression : never : never; "subscript_expression": T extends NonNullable ? V extends NonNullable ? TypedSubscriptExpression : never : NonNullable extends T ? V extends NonNullable ? TypedSubscriptExpression : never : never; "dot_expression": V extends NonNullable ? ( T extends CompleteObjectType ? TypedObjectDotExpression : T extends FunctionType ? TypedFunctionDotExpression : CompleteObjectType extends T ? FunctionType extends T ? TypedObjectDotExpression | TypedFunctionDotExpression : never : never) : never; "arrow_expression": V extends NonNullable ? ( T extends CompleteObjectType ? TypedObjectArrowExpression : T extends FunctionType ? TypedFunctionArrowExpression : CompleteObjectType extends T ? FunctionType extends T ? TypedObjectArrowExpression | TypedFunctionArrowExpression : never : never) : never; "identifier_expression": V extends NonNullable ? ( T extends CompleteObjectType ? TypedObjectIdentifierExpression : T extends FunctionType ? TypedFunctionIdentifierExpression : CompleteObjectType extends T ? FunctionType extends T ? TypedObjectIdentifierExpression | TypedFunctionIdentifierExpression : never : never) : never; "numeric_literal_expression": T extends NonNullable ? V extends NonNullable ? TypedNumericLiteralExpression : never : NonNullable extends T ? V extends NonNullable ? TypedNumericLiteralExpression : never : never; "string_literal_expression": T extends NonNullable ? V extends NonNullable ? TypedStringLiteralExpression : never : NonNullable extends T ? V extends NonNullable ? TypedStringLiteralExpression : never : never; "parentheses_expression": T extends NonNullable ? V extends NonNullable ? TypedParenthesesExpression : never : NonNullable extends T ? V extends NonNullable ? TypedParenthesesExpression : never : never; "initializer_list_expression": T extends NonNullable ? V extends NonNullable ? TypedInitializerListExpression : never : NonNullable extends T ? V extends NonNullable ? TypedInitializerListExpression : never : never; "opaque_expression": T extends NonNullable ? V extends NonNullable ? TypedOpaqueExpression : never : NonNullable extends T ? V extends NonNullable ? TypedOpaqueExpression : never : never; "auxiliary_expression": T extends NonNullable ? V extends NonNullable ? TypedAuxiliaryExpression : never : NonNullable extends T ? V extends NonNullable ? TypedAuxiliaryExpression : never : never; "magic_function_call_expression": T extends NonNullable ? V extends NonNullable ? TypedMagicFunctionCallExpression : never : NonNullable extends T ? V extends NonNullable ? TypedMagicFunctionCallExpression : never : never; "function_call_expression": T extends NonNullable ? V extends NonNullable ? TypedFunctionCallExpression : never : NonNullable extends T ? V extends NonNullable ? TypedFunctionCallExpression : never : never; "ImplicitConversion": T extends NonNullable ? V extends NonNullable ? TypedImplicitConversion : never : NonNullable extends T ? V extends NonNullable ? TypedImplicitConversion : never : never; } export type CompiledExpressionKinds = { "unsupported_expression": never; "anything_construct": never; "invalid_operator_overload_expression": never; "comma_expression": T extends NonNullable ? V extends NonNullable ? CompiledCommaExpression : never : never; "ternary_expression": T extends NonNullable ? V extends NonNullable ? CompiledTernaryExpression : never : never; "assignment_expression": T extends NonNullable ? V extends NonNullable ? CompiledAssignmentExpression : never : never; "compound_assignment_expression": T extends NonNullable ? V extends NonNullable ? CompiledCompoundAssignmentExpression : never : never; "arithmetic_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? CompiledArithmeticBinaryOperatorExpression : never : NonNullable extends T ? V extends NonNullable ? CompiledArithmeticBinaryOperatorExpression : never : never; "pointer_difference_expression": T extends NonNullable ? V extends NonNullable ? CompiledPointerDifferenceExpression : never : never; "pointer_offset_expression": T extends NonNullable ? V extends NonNullable ? CompiledPointerOffsetExpression : never : never; "output_operator_expression": T extends NonNullable ? V extends NonNullable ? CompiledOutputOperatorExpression : never : never; "input_operator_expression": T extends NonNullable ? V extends NonNullable ? CompiledInputOperatorExpression : never : never; "relational_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? CompiledRelationalBinaryOperatorExpression : never : never; "pointer_comparison_expression": T extends NonNullable ? V extends NonNullable ? CompiledPointerComparisonExpression : never : never; "logical_binary_operator_expression": T extends NonNullable ? V extends NonNullable ? CompiledLogicalBinaryOperatorExpression : never : never; "non_member_operator_overload_expression": T extends NonNullable ? V extends NonNullable ? CompiledNonMemberOperatorOverloadExpression : never : never; "member_operator_overload_expression": T extends NonNullable ? V extends NonNullable ? CompiledMemberOperatorOverloadExpression : never : never; "prefix_increment_expression": T extends NonNullable ? V extends NonNullable ? CompiledPrefixIncrementExpression : never : never; "dereference_expression": T extends NonNullable ? V extends NonNullable ? CompiledDereferenceExpression : never : never; "address_of_expression": T extends NonNullable ? V extends NonNullable ? CompiledAddressOfExpression : never : never; "new_expression": T extends NonNullable ? V extends NonNullable ? CompiledNewExpression : never : never; "new_array_expression": T extends NonNullable ? V extends NonNullable ? CompiledNewArrayExpression : never : never; "delete_expression": T extends NonNullable ? V extends NonNullable ? CompiledDeleteExpression : never : never; "delete_array_expression": T extends NonNullable ? V extends NonNullable ? CompiledDeleteArrayExpression : never : never; "this_expression": T extends NonNullable ? V extends NonNullable ? CompiledThisExpression : never : never; "nullptr_expression": T extends NonNullable ? V extends NonNullable ? CompiledNullptrExpression : never : never; "unary_plus_expression": T extends NonNullable ? V extends NonNullable ? CompiledUnaryPlusExpression : never : never; "unary_minus_expression": T extends NonNullable ? V extends NonNullable ? CompiledUnaryMinusExpression : never : never; "logical_not_expression": T extends NonNullable ? V extends NonNullable ? CompiledLogicalNotExpression : never : never; "postfix_increment_expression": T extends NonNullable ? V extends NonNullable ? CompiledPrefixIncrementExpression : never : never; "subscript_expression": T extends NonNullable ? V extends NonNullable ? CompiledSubscriptExpression : never : never; "dot_expression": V extends NonNullable ? (T extends CompleteObjectType ? CompiledObjectDotExpression : T extends FunctionType ? CompiledFunctionDotExpression : never) : never; "arrow_expression": V extends NonNullable ? (T extends CompleteObjectType ? CompiledObjectArrowExpression : T extends FunctionType ? CompiledFunctionArrowExpression : never) : never; "identifier_expression": V extends NonNullable ? (T extends CompleteObjectType ? CompiledObjectIdentifierExpression : T extends FunctionType ? CompiledFunctionIdentifierExpression : never) : never; "numeric_literal_expression": T extends NonNullable ? V extends NonNullable ? CompiledNumericLiteralExpression : never : never; "string_literal_expression": T extends NonNullable ? V extends NonNullable ? CompiledStringLiteralExpression : never : never; "parentheses_expression": T extends NonNullable ? V extends NonNullable ? CompiledParenthesesExpression : never : never; "initializer_list_expression": T extends NonNullable ? V extends NonNullable ? CompiledInitializerListExpression : never : never; "opaque_expression": T extends NonNullable ? V extends NonNullable ? CompiledOpaqueExpression : never : never; "auxiliary_expression": T extends NonNullable ? V extends NonNullable ? CompiledAuxiliaryExpression : never : never; "magic_function_call_expression": T extends NonNullable ? V extends NonNullable ? CompiledMagicFunctionCallExpression : never : never; "function_call_expression": T extends NonNullable ? V extends NonNullable ? CompiledFunctionCallExpression : never : never; "ImplicitConversion": T extends NonNullable ? V extends NonNullable ? CompiledImplicitConversion : never : never; } export type AnalyticTypedExpression, V extends ValueCategory = NonNullable> = TypedExpressionKinds[C["construct_type"]]; export type AnalyticCompiledExpression, V extends ValueCategory = NonNullable> = CompiledExpressionKinds[C["construct_type"]]; const ExpressionConstructsRuntimeMap = { "unsupported_expression": (construct: UnsupportedExpression, parent: RuntimeConstruct) => { throw new Error("Cannot create a runtime instance of an unsupported construct."); }, "anything_construct": (construct: AnythingExpression, parent: RuntimeConstruct) => { throw new Error("Cannot create a runtime instance of an \"anything\" placeholder construct."); }, "invalid_operator_overload_expression": (construct: UnsupportedExpression, parent: RuntimeConstruct) => { throw new Error("Cannot create a runtime instance of an invalid operator overload expression."); }, "comma_expression": (construct: CompiledCommaExpression, parent: RuntimeConstruct) => new RuntimeComma(construct, parent), "ternary_expression": (construct: CompiledTernaryExpression, parent: RuntimeConstruct) => new RuntimeTernary(construct, parent), "assignment_expression": (construct: CompiledAssignmentExpression, parent: RuntimeConstruct) => new RuntimeAssignment(construct, parent), "compound_assignment_expression": (construct: CompiledCompoundAssignmentExpression, parent: RuntimeConstruct) => new RuntimeCompoundAssignment(construct, parent), "arithmetic_binary_operator_expression": (construct: CompiledArithmeticBinaryOperatorExpression, parent: RuntimeConstruct) => new RuntimeArithmeticBinaryOperator(construct, parent), "pointer_difference_expression": (construct: CompiledPointerDifferenceExpression, parent: RuntimeConstruct) => new RuntimePointerDifference(construct, parent), "pointer_offset_expression": (construct: CompiledPointerOffsetExpression, parent: RuntimeConstruct) => new RuntimePointerOffset(construct, parent), "output_operator_expression": (construct: CompiledOutputOperatorExpression, parent: RuntimeConstruct) => new RuntimeOutputOperatorExpression(construct, parent), "input_operator_expression": (construct: CompiledInputOperatorExpression, parent: RuntimeConstruct) => new RuntimeInputOperatorExpression(construct, parent), "relational_binary_operator_expression": (construct: CompiledRelationalBinaryOperatorExpression, parent: RuntimeConstruct) => new RuntimeRelationalBinaryOperator(construct, parent), "pointer_comparison_expression": (construct: CompiledPointerComparisonExpression, parent: RuntimeConstruct) => new RuntimePointerComparisonExpression(construct, parent), "logical_binary_operator_expression": (construct: CompiledLogicalBinaryOperatorExpression, parent: RuntimeConstruct) => new RuntimeLogicalBinaryOperatorExpression(construct, parent), "non_member_operator_overload_expression": (construct: CompiledNonMemberOperatorOverloadExpression, parent: RuntimeConstruct) => new RuntimeNonMemberOperatorOverloadExpression(construct, parent), "member_operator_overload_expression": (construct: CompiledMemberOperatorOverloadExpression, parent: RuntimeConstruct) => new RuntimeMemberOperatorOverloadExpression(construct, parent), "prefix_increment_expression": (construct: CompiledPrefixIncrementExpression, parent: RuntimeConstruct) => new RuntimePrefixIncrementExpression(construct, parent), "dereference_expression": (construct: CompiledDereferenceExpression, parent: RuntimeConstruct) => new RuntimeDereferenceExpression(construct, parent), "address_of_expression": (construct: CompiledAddressOfExpression, parent: RuntimeConstruct) => new RuntimeAddressOfExpression(construct, parent), "new_expression": (construct: CompiledNewExpression, parent: RuntimeConstruct) => new RuntimeNewExpression(construct, parent), "new_array_expression": (construct: CompiledNewArrayExpression, parent: RuntimeConstruct) => new RuntimeNewArrayExpression(construct, parent), "delete_expression": (construct: CompiledDeleteExpression, parent: RuntimeConstruct) => new RuntimeDeleteExpression(construct, parent), "delete_array_expression": (construct: CompiledDeleteArrayExpression, parent: RuntimeConstruct) => new RuntimeDeleteArrayExpression(construct, parent), "this_expression": (construct: CompiledThisExpression, parent: RuntimeConstruct) => new RuntimeThisExpression(construct, parent), "nullptr_expression": (construct: CompiledNullptrExpression, parent: RuntimeConstruct) => new RuntimeNullptrExpression(construct, parent), "unary_plus_expression": (construct: CompiledUnaryPlusExpression, parent: RuntimeConstruct) => new RuntimeUnaryPlusExpression(construct, parent), "unary_minus_expression": (construct: CompiledUnaryMinusExpression, parent: RuntimeConstruct) => new RuntimeUnaryMinusExpression(construct, parent), "logical_not_expression": (construct: CompiledLogicalNotExpression, parent: RuntimeConstruct) => new RuntimeLogicalNotExpression(construct, parent), "postfix_increment_expression": (construct: CompiledPostfixIncrementExpression, parent: RuntimeConstruct) => new RuntimePostfixIncrementExpression(construct, parent), "subscript_expression": (construct: CompiledSubscriptExpression, parent: RuntimeConstruct) => new RuntimeSubscriptExpression(construct, parent), "dot_expression": (construct: CompiledObjectDotExpression | CompiledFunctionDotExpression, parent: RuntimeConstruct) => { if (construct.entity.declarationKind === "function") { return new RuntimeFunctionDotExpression(construct, parent); } else { return new RuntimeObjectDotExpression(construct, parent); } }, "arrow_expression": (construct: CompiledObjectArrowExpression | CompiledFunctionArrowExpression, parent: RuntimeConstruct) => { if (construct.entity.declarationKind === "function") { return new RuntimeFunctionArrowExpression(construct, parent); } else { return new RuntimeObjectArrowExpression(construct, parent); } }, "identifier_expression": (construct: CompiledObjectIdentifierExpression | CompiledFunctionIdentifierExpression, parent: RuntimeConstruct) => { if (construct.entity.declarationKind === "function") { return new RuntimeFunctionIdentifierExpression(construct, parent); } else { return new RuntimeObjectIdentifierExpression(construct, parent); } }, "numeric_literal_expression": (construct: CompiledNumericLiteralExpression, parent: RuntimeConstruct) => new RuntimeNumericLiteral(construct, parent), "string_literal_expression": (construct: CompiledStringLiteralExpression, parent: RuntimeConstruct) => new RuntimeStringLiteralExpression(construct, parent), "parentheses_expression": (construct: CompiledParenthesesExpression, parent: RuntimeConstruct) => new RuntimeParentheses(construct, parent), "initializer_list_expression": (construct: CompiledInitializerListExpression, parent: RuntimeConstruct) => new RuntimeInitializerListExpression(construct, parent), "opaque_expression": (construct: CompiledOpaqueExpression, parent: RuntimeConstruct) => new RuntimeOpaqueExpression(construct, parent), "auxiliary_expression": (construct: CompiledExpression, parent: RuntimeConstruct) => { throw new Error("Auxiliary expressions must never be instantiated at runtime.") }, "magic_function_call_expression": (construct: CompiledMagicFunctionCallExpression, parent: RuntimeConstruct) => new RuntimeMagicFunctionCallExpression(construct, parent), "function_call_expression": (construct: CompiledFunctionCallExpression, parent: RuntimeConstruct) => new RuntimeFunctionCallExpression(construct, parent), "ImplicitConversion": (construct: CompiledImplicitConversion, parent: RuntimeConstruct) => construct.createRuntimeExpression(parent) }; export function createRuntimeExpression(construct: UnsupportedExpression, parent: RuntimeConstruct): never; export function createRuntimeExpression(construct: AnythingExpression, parent: RuntimeConstruct): never; export function createRuntimeExpression(construct: InvalidOperatorOverloadExpression, parent: RuntimeConstruct): never; export function createRuntimeExpression(construct: CompiledCommaExpression, parent: RuntimeConstruct): RuntimeComma; export function createRuntimeExpression(construct: CompiledTernaryExpression, parent: RuntimeConstruct): RuntimeTernary; export function createRuntimeExpression(construct: CompiledAssignmentExpression, parent: RuntimeConstruct): RuntimeAssignment; export function createRuntimeExpression(construct: CompiledCompoundAssignmentExpression, parent: RuntimeConstruct): RuntimeCompoundAssignment; export function createRuntimeExpression(construct: CompiledArithmeticBinaryOperatorExpression, parent: RuntimeConstruct): RuntimeArithmeticBinaryOperator; export function createRuntimeExpression(construct: CompiledPointerDifferenceExpression, parent: RuntimeConstruct): RuntimePointerDifference; export function createRuntimeExpression(construct: CompiledPointerOffsetExpression, parent: RuntimeConstruct): RuntimePointerOffset; export function createRuntimeExpression(construct: CompiledPointerOffsetExpression, parent: RuntimeConstruct): RuntimePointerOffset; export function createRuntimeExpression(construct: CompiledRelationalBinaryOperatorExpression, parent: RuntimeConstruct): RuntimeRelationalBinaryOperator; export function createRuntimeExpression(construct: CompiledPointerComparisonExpression, parent: RuntimeConstruct): RuntimePointerComparisonExpression; export function createRuntimeExpression(construct: CompiledLogicalBinaryOperatorExpression, parent: RuntimeConstruct): RuntimeLogicalBinaryOperatorExpression; export function createRuntimeExpression(construct: CompiledNonMemberOperatorOverloadExpression, parent: RuntimeConstruct): RuntimeNonMemberOperatorOverloadExpression; export function createRuntimeExpression(construct: CompiledMemberOperatorOverloadExpression, parent: RuntimeConstruct): RuntimeMemberOperatorOverloadExpression; export function createRuntimeExpression(construct: CompiledOutputOperatorExpression, parent: RuntimeConstruct): RuntimeOutputOperatorExpression; export function createRuntimeExpression(construct: CompiledInputOperatorExpression, parent: RuntimeConstruct): RuntimeInputOperatorExpression; export function createRuntimeExpression(construct: CompiledPrefixIncrementExpression, parent: RuntimeConstruct): RuntimePrefixIncrementExpression; export function createRuntimeExpression(construct: CompiledDereferenceExpression, parent: RuntimeConstruct): RuntimeDereferenceExpression; export function createRuntimeExpression(construct: CompiledAddressOfExpression, parent: RuntimeConstruct): RuntimeAddressOfExpression; export function createRuntimeExpression>(construct: CompiledNewExpression, parent: RuntimeConstruct): RuntimeNewExpression; export function createRuntimeExpression>(construct: CompiledNewArrayExpression, parent: RuntimeConstruct): RuntimeNewArrayExpression; export function createRuntimeExpression(construct: CompiledDeleteArrayExpression, parent: RuntimeConstruct): RuntimeDeleteArrayExpression; export function createRuntimeExpression>(construct: CompiledThisExpression, parent: RuntimeConstruct): RuntimeThisExpression; export function createRuntimeExpression(construct: CompiledNullptrExpression, parent: RuntimeConstruct): RuntimeNullptrExpression; export function createRuntimeExpression(construct: CompiledUnaryPlusExpression, parent: RuntimeConstruct): RuntimeUnaryPlusExpression; export function createRuntimeExpression(construct: CompiledUnaryMinusExpression, parent: RuntimeConstruct): RuntimeUnaryMinusExpression; export function createRuntimeExpression(construct: CompiledLogicalNotExpression, parent: RuntimeConstruct): RuntimeLogicalNotExpression; export function createRuntimeExpression(construct: CompiledPostfixIncrementExpression, parent: RuntimeConstruct): RuntimePostfixIncrementExpression; export function createRuntimeExpression(construct: CompiledSubscriptExpression, parent: RuntimeConstruct): RuntimeSubscriptExpression; export function createRuntimeExpression(construct: CompiledObjectIdentifierExpression, parent: RuntimeConstruct): RuntimeObjectIdentifierExpression; export function createRuntimeExpression(construct: CompiledFunctionIdentifierExpression, parent: RuntimeConstruct): RuntimeFunctionIdentifierExpression; export function createRuntimeExpression(construct: CompiledObjectIdentifierExpression | CompiledFunctionIdentifierExpression, parent: RuntimeConstruct): RuntimeObjectIdentifierExpression | RuntimeFunctionIdentifierExpression; export function createRuntimeExpression(construct: CompiledObjectDotExpression, parent: RuntimeConstruct): RuntimeObjectDotExpression; export function createRuntimeExpression(construct: CompiledFunctionDotExpression, parent: RuntimeConstruct): RuntimeFunctionDotExpression; export function createRuntimeExpression(construct: CompiledObjectDotExpression | CompiledFunctionDotExpression, parent: RuntimeConstruct): RuntimeObjectDotExpression | RuntimeFunctionDotExpression; export function createRuntimeExpression(construct: CompiledObjectArrowExpression, parent: RuntimeConstruct): RuntimeObjectArrowExpression; export function createRuntimeExpression(construct: CompiledFunctionArrowExpression, parent: RuntimeConstruct): RuntimeFunctionArrowExpression; export function createRuntimeExpression(construct: CompiledObjectArrowExpression | CompiledFunctionArrowExpression, parent: RuntimeConstruct): RuntimeObjectArrowExpression | RuntimeFunctionDotExpression; export function createRuntimeExpression(construct: CompiledNumericLiteralExpression, parent: RuntimeConstruct): RuntimeNumericLiteral; export function createRuntimeExpression(construct: CompiledStringLiteralExpression, parent: RuntimeConstruct): RuntimeStringLiteralExpression; export function createRuntimeExpression(construct: CompiledParenthesesExpression, parent: RuntimeConstruct): RuntimeParentheses; export function createRuntimeExpression(construct: CompiledInitializerListExpression, parent: RuntimeConstruct): RuntimeInitializerListExpression; export function createRuntimeExpression(construct: AuxiliaryExpression, parent: RuntimeConstruct): never; export function createRuntimeExpression>(construct: CompiledMagicFunctionCallExpression, parent: RuntimeConstruct): RuntimeMagicFunctionCallExpression; export function createRuntimeExpression>(construct: CompiledFunctionCallExpression, parent: RuntimeConstruct): RuntimeFunctionCallExpression; export function createRuntimeExpression(construct: CompiledImplicitConversion, parent: RuntimeConstruct): RuntimeImplicitConversion; export function createRuntimeExpression>(construct: CompiledConstructType, parent: RuntimeConstruct): ReturnType<(typeof ExpressionConstructsRuntimeMap)[CompiledConstructType["construct_type"]]>; export function createRuntimeExpression(construct: CompiledExpression, parent: RuntimeConstruct): RuntimeExpression; export function createRuntimeExpression | UnsupportedExpression>(construct: ConstructType, parent: RuntimeConstruct): RuntimeExpression { return ((ExpressionConstructsRuntimeMap)[construct.construct_type])(construct, parent); }