// Copyright (c) 2008 Roberto Raggi // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #pragma once #include "CPlusPlusForwardDeclarations.h" #include "ASTfwd.h" #include "MemoryPool.h" namespace CPlusPlus { // clang-cl needs an export for the subclass, while msvc fails to build in debug mode if // the export is present. #if defined(Q_CC_CLANG) && defined(Q_CC_MSVC) #define CPLUSPLUS_EXPORT_SUBCLASS CPLUSPLUS_EXPORT #else #define CPLUSPLUS_EXPORT_SUBCLASS #endif template class CPLUSPLUS_EXPORT List: public Managed { List(const List &other); void operator =(const List &other); public: List() : value(Tptr()), next(0) { } List(const Tptr &value) : value(value), next(0) { } int firstToken() const { if (value) return value->firstToken(); // ### CPP_CHECK(0); return 0; } int lastToken() const { Tptr lv = lastValue(); if (lv) return lv->lastToken(); // ### CPP_CHECK(0); return 0; } Tptr lastValue() const { Tptr lastValue = 0; for (const List *it = this; it; it = it->next) { if (it->value) lastValue = it->value; } return lastValue; } Tptr value; List *next; class CPLUSPLUS_EXPORT_SUBCLASS ListIterator { List *iter; public: ListIterator(List *iter) : iter(iter) {} Tptr operator*() { return iter->value; } ListIterator &operator++() { if (iter) iter = iter->next; return *this; } bool operator==(const ListIterator &other) { return iter == other.iter; } bool operator!=(const ListIterator &other) { return iter != other.iter; } }; ListIterator begin() { return {this}; } ListIterator end() { return {nullptr}; } int size() { return next ? next->size() + 1 : 1; } }; template typename List::ListIterator begin(List *list) { return list ? list->begin() : typename List::ListIterator(nullptr); } template typename List::ListIterator end(List *list) { return list ? list->end() : typename List::ListIterator(nullptr); } template int size(List *list) { if (list) return list->size(); return 0; } class CPLUSPLUS_EXPORT AST: public Managed { AST(const AST &other); void operator =(const AST &other); public: AST(); virtual ~AST(); void accept(ASTVisitor *visitor); static void accept(AST *ast, ASTVisitor *visitor) { if (ast) ast->accept(visitor); } template static void accept(List *it, ASTVisitor *visitor) { for (; it; it = it->next) accept(it->value, visitor); } static bool match(AST *ast, AST *pattern, ASTMatcher *matcher); bool match(AST *pattern, ASTMatcher *matcher); template static bool match(List *it, List *patternIt, ASTMatcher *matcher) { while (it && patternIt) { if (! match(it->value, patternIt->value, matcher)) return false; it = it->next; patternIt = patternIt->next; } if (! it && ! patternIt) return true; return false; } virtual int firstToken() const = 0; virtual int lastToken() const = 0; virtual AST *clone(MemoryPool *pool) const = 0; virtual AccessDeclarationAST *asAccessDeclaration() { return nullptr; } virtual AliasDeclarationAST *asAliasDeclaration() { return nullptr; } virtual AlignmentSpecifierAST *asAlignmentSpecifier() { return nullptr; } virtual AlignofExpressionAST *asAlignofExpression() { return nullptr; } virtual AnonymousNameAST *asAnonymousName() { return nullptr; } virtual ArrayAccessAST *asArrayAccess() { return nullptr; } virtual ArrayDeclaratorAST *asArrayDeclarator() { return nullptr; } virtual ArrayInitializerAST *asArrayInitializer() { return nullptr; } virtual AsmDefinitionAST *asAsmDefinition() { return nullptr; } virtual AttributeSpecifierAST *asAttributeSpecifier() { return nullptr; } virtual AwaitExpressionAST *asAwaitExpression() { return nullptr; } virtual BaseSpecifierAST *asBaseSpecifier() { return nullptr; } virtual BinaryExpressionAST *asBinaryExpression() { return nullptr; } virtual BoolLiteralAST *asBoolLiteral() { return nullptr; } virtual BracedInitializerAST *asBracedInitializer() { return nullptr; } virtual BracketDesignatorAST *asBracketDesignator() { return nullptr; } virtual BreakStatementAST *asBreakStatement() { return nullptr; } virtual CallAST *asCall() { return nullptr; } virtual CaptureAST *asCapture() { return nullptr; } virtual CaseStatementAST *asCaseStatement() { return nullptr; } virtual CastExpressionAST *asCastExpression() { return nullptr; } virtual CatchClauseAST *asCatchClause() { return nullptr; } virtual ClassSpecifierAST *asClassSpecifier() { return nullptr; } virtual CompoundExpressionAST *asCompoundExpression() { return nullptr; } virtual CompoundLiteralAST *asCompoundLiteral() { return nullptr; } virtual CompoundStatementAST *asCompoundStatement() { return nullptr; } virtual ConditionAST *asCondition() { return nullptr; } virtual ConditionalExpressionAST *asConditionalExpression() { return nullptr; } virtual ContinueStatementAST *asContinueStatement() { return nullptr; } virtual ConversionFunctionIdAST *asConversionFunctionId() { return nullptr; } virtual CoreDeclaratorAST *asCoreDeclarator() { return nullptr; } virtual CppCastExpressionAST *asCppCastExpression() { return nullptr; } virtual CtorInitializerAST *asCtorInitializer() { return nullptr; } virtual DeclarationAST *asDeclaration() { return nullptr; } virtual DeclarationStatementAST *asDeclarationStatement() { return nullptr; } virtual DeclaratorAST *asDeclarator() { return nullptr; } virtual DeclaratorIdAST *asDeclaratorId() { return nullptr; } virtual DecompositionDeclaratorAST *asDecompositionDeclarator() { return nullptr; } virtual DecltypeSpecifierAST *asDecltypeSpecifier() { return nullptr; } virtual DeleteExpressionAST *asDeleteExpression() { return nullptr; } virtual DesignatedInitializerAST *asDesignatedInitializer() { return nullptr; } virtual DesignatorAST *asDesignator() { return nullptr; } virtual DestructorNameAST *asDestructorName() { return nullptr; } virtual DoStatementAST *asDoStatement() { return nullptr; } virtual DotDesignatorAST *asDotDesignator() { return nullptr; } virtual DynamicExceptionSpecificationAST *asDynamicExceptionSpecification() { return nullptr; } virtual ElaboratedTypeSpecifierAST *asElaboratedTypeSpecifier() { return nullptr; } virtual EmptyDeclarationAST *asEmptyDeclaration() { return nullptr; } virtual EnumSpecifierAST *asEnumSpecifier() { return nullptr; } virtual EnumeratorAST *asEnumerator() { return nullptr; } virtual ExceptionDeclarationAST *asExceptionDeclaration() { return nullptr; } virtual ExceptionSpecificationAST *asExceptionSpecification() { return nullptr; } virtual ExpressionAST *asExpression() { return nullptr; } virtual ExpressionListParenAST *asExpressionListParen() { return nullptr; } virtual ExpressionOrDeclarationStatementAST *asExpressionOrDeclarationStatement() { return nullptr; } virtual ExpressionStatementAST *asExpressionStatement() { return nullptr; } virtual ForStatementAST *asForStatement() { return nullptr; } virtual ForeachStatementAST *asForeachStatement() { return nullptr; } virtual FunctionDeclaratorAST *asFunctionDeclarator() { return nullptr; } virtual FunctionDefinitionAST *asFunctionDefinition() { return nullptr; } virtual GnuAttributeAST *asGnuAttribute() { return nullptr; } virtual GnuAttributeSpecifierAST *asGnuAttributeSpecifier() { return nullptr; } virtual GotoStatementAST *asGotoStatement() { return nullptr; } virtual IdExpressionAST *asIdExpression() { return nullptr; } virtual IfStatementAST *asIfStatement() { return nullptr; } virtual LabeledStatementAST *asLabeledStatement() { return nullptr; } virtual LambdaCaptureAST *asLambdaCapture() { return nullptr; } virtual LambdaDeclaratorAST *asLambdaDeclarator() { return nullptr; } virtual LambdaExpressionAST *asLambdaExpression() { return nullptr; } virtual LambdaIntroducerAST *asLambdaIntroducer() { return nullptr; } virtual LinkageBodyAST *asLinkageBody() { return nullptr; } virtual LinkageSpecificationAST *asLinkageSpecification() { return nullptr; } virtual MemInitializerAST *asMemInitializer() { return nullptr; } virtual MemberAccessAST *asMemberAccess() { return nullptr; } virtual MsvcDeclspecSpecifierAST *asMsvcDeclspecSpecifier() { return nullptr; } virtual NameAST *asName() { return nullptr; } virtual NamedTypeSpecifierAST *asNamedTypeSpecifier() { return nullptr; } virtual NamespaceAST *asNamespace() { return nullptr; } virtual NamespaceAliasDefinitionAST *asNamespaceAliasDefinition() { return nullptr; } virtual NestedDeclaratorAST *asNestedDeclarator() { return nullptr; } virtual NestedExpressionAST *asNestedExpression() { return nullptr; } virtual NestedNameSpecifierAST *asNestedNameSpecifier() { return nullptr; } virtual NewArrayDeclaratorAST *asNewArrayDeclarator() { return nullptr; } virtual NewExpressionAST *asNewExpression() { return nullptr; } virtual NewTypeIdAST *asNewTypeId() { return nullptr; } virtual NoExceptOperatorExpressionAST *asNoExceptOperatorExpression() { return nullptr; } virtual NoExceptSpecificationAST *asNoExceptSpecification() { return nullptr; } virtual NumericLiteralAST *asNumericLiteral() { return nullptr; } virtual ObjCClassDeclarationAST *asObjCClassDeclaration() { return nullptr; } virtual ObjCClassForwardDeclarationAST *asObjCClassForwardDeclaration() { return nullptr; } virtual ObjCDynamicPropertiesDeclarationAST *asObjCDynamicPropertiesDeclaration() { return nullptr; } virtual ObjCEncodeExpressionAST *asObjCEncodeExpression() { return nullptr; } virtual ObjCFastEnumerationAST *asObjCFastEnumeration() { return nullptr; } virtual ObjCInstanceVariablesDeclarationAST *asObjCInstanceVariablesDeclaration() { return nullptr; } virtual ObjCMessageArgumentAST *asObjCMessageArgument() { return nullptr; } virtual ObjCMessageArgumentDeclarationAST *asObjCMessageArgumentDeclaration() { return nullptr; } virtual ObjCMessageExpressionAST *asObjCMessageExpression() { return nullptr; } virtual ObjCMethodDeclarationAST *asObjCMethodDeclaration() { return nullptr; } virtual ObjCMethodPrototypeAST *asObjCMethodPrototype() { return nullptr; } virtual ObjCPropertyAttributeAST *asObjCPropertyAttribute() { return nullptr; } virtual ObjCPropertyDeclarationAST *asObjCPropertyDeclaration() { return nullptr; } virtual ObjCProtocolDeclarationAST *asObjCProtocolDeclaration() { return nullptr; } virtual ObjCProtocolExpressionAST *asObjCProtocolExpression() { return nullptr; } virtual ObjCProtocolForwardDeclarationAST *asObjCProtocolForwardDeclaration() { return nullptr; } virtual ObjCProtocolRefsAST *asObjCProtocolRefs() { return nullptr; } virtual ObjCSelectorAST *asObjCSelector() { return nullptr; } virtual ObjCSelectorArgumentAST *asObjCSelectorArgument() { return nullptr; } virtual ObjCSelectorExpressionAST *asObjCSelectorExpression() { return nullptr; } virtual ObjCSynchronizedStatementAST *asObjCSynchronizedStatement() { return nullptr; } virtual ObjCSynthesizedPropertiesDeclarationAST *asObjCSynthesizedPropertiesDeclaration() { return nullptr; } virtual ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() { return nullptr; } virtual ObjCTypeNameAST *asObjCTypeName() { return nullptr; } virtual ObjCVisibilityDeclarationAST *asObjCVisibilityDeclaration() { return nullptr; } virtual OperatorAST *asOperator() { return nullptr; } virtual OperatorFunctionIdAST *asOperatorFunctionId() { return nullptr; } virtual ParameterDeclarationAST *asParameterDeclaration() { return nullptr; } virtual ParameterDeclarationClauseAST *asParameterDeclarationClause() { return nullptr; } virtual PlaceholderTypeSpecifierAST *asPlaceholderTypeSpecifier() { return nullptr; } virtual PointerAST *asPointer() { return nullptr; } virtual PointerLiteralAST *asPointerLiteral() { return nullptr; } virtual PointerToMemberAST *asPointerToMember() { return nullptr; } virtual PostIncrDecrAST *asPostIncrDecr() { return nullptr; } virtual PostfixAST *asPostfix() { return nullptr; } virtual PostfixDeclaratorAST *asPostfixDeclarator() { return nullptr; } virtual PtrOperatorAST *asPtrOperator() { return nullptr; } virtual QtEnumDeclarationAST *asQtEnumDeclaration() { return nullptr; } virtual QtFlagsDeclarationAST *asQtFlagsDeclaration() { return nullptr; } virtual QtInterfaceNameAST *asQtInterfaceName() { return nullptr; } virtual QtInterfacesDeclarationAST *asQtInterfacesDeclaration() { return nullptr; } virtual QtMemberDeclarationAST *asQtMemberDeclaration() { return nullptr; } virtual QtMethodAST *asQtMethod() { return nullptr; } virtual QtObjectTagAST *asQtObjectTag() { return nullptr; } virtual QtPrivateSlotAST *asQtPrivateSlot() { return nullptr; } virtual QtPropertyDeclarationAST *asQtPropertyDeclaration() { return nullptr; } virtual QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() { return nullptr; } virtual QualifiedNameAST *asQualifiedName() { return nullptr; } virtual RangeBasedForStatementAST *asRangeBasedForStatement() { return nullptr; } virtual ReferenceAST *asReference() { return nullptr; } virtual ReturnStatementAST *asReturnStatement() { return nullptr; } virtual SimpleDeclarationAST *asSimpleDeclaration() { return nullptr; } virtual SimpleNameAST *asSimpleName() { return nullptr; } virtual SimpleSpecifierAST *asSimpleSpecifier() { return nullptr; } virtual SizeofExpressionAST *asSizeofExpression() { return nullptr; } virtual SpecifierAST *asSpecifier() { return nullptr; } virtual StatementAST *asStatement() { return nullptr; } virtual StaticAssertDeclarationAST *asStaticAssertDeclaration() { return nullptr; } virtual StdAttributeSpecifierAST *asStdAttributeSpecifier() { return nullptr; } virtual StringLiteralAST *asStringLiteral() { return nullptr; } virtual SwitchStatementAST *asSwitchStatement() { return nullptr; } virtual TemplateDeclarationAST *asTemplateDeclaration() { return nullptr; } virtual ConceptDeclarationAST *asConceptDeclaration() { return nullptr; } virtual TemplateIdAST *asTemplateId() { return nullptr; } virtual TemplateTypeParameterAST *asTemplateTypeParameter() { return nullptr; } virtual ThisExpressionAST *asThisExpression() { return nullptr; } virtual ThrowExpressionAST *asThrowExpression() { return nullptr; } virtual TrailingReturnTypeAST *asTrailingReturnType() { return nullptr; } virtual TranslationUnitAST *asTranslationUnit() { return nullptr; } virtual TryBlockStatementAST *asTryBlockStatement() { return nullptr; } virtual TypeConstraintAST *asTypeConstraint() { return nullptr; } virtual TypeConstructorCallAST *asTypeConstructorCall() { return nullptr; } virtual TypeIdAST *asTypeId() { return nullptr; } virtual TypeidExpressionAST *asTypeidExpression() { return nullptr; } virtual TypenameCallExpressionAST *asTypenameCallExpression() { return nullptr; } virtual TypenameTypeParameterAST *asTypenameTypeParameter() { return nullptr; } virtual TypeofSpecifierAST *asTypeofSpecifier() { return nullptr; } virtual UnaryExpressionAST *asUnaryExpression() { return nullptr; } virtual RequiresExpressionAST *asRequiresExpression() { return nullptr; } virtual RequiresClauseAST *asRequiresClause() { return nullptr; } virtual UsingAST *asUsing() { return nullptr; } virtual UsingDirectiveAST *asUsingDirective() { return nullptr; } virtual WhileStatementAST *asWhileStatement() { return nullptr; } virtual YieldExpressionAST *asYieldExpression() { return nullptr; } protected: virtual void accept0(ASTVisitor *visitor) = 0; virtual bool match0(AST *, ASTMatcher *) = 0; }; class CPLUSPLUS_EXPORT StatementAST: public AST { public: StatementAST *asStatement() override { return this; } StatementAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT ExpressionAST: public AST { public: ExpressionAST *asExpression() override { return this; } ExpressionAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT DeclarationAST: public AST { public: DeclarationAST *asDeclaration() override { return this; } DeclarationAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT NameAST: public AST { public: // annotations const Name *name = nullptr; public: NameAST *asName() override { return this; } NameAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT SpecifierAST: public AST { public: SpecifierAST *asSpecifier() override { return this; } SpecifierAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT PtrOperatorAST: public AST { public: PtrOperatorAST *asPtrOperator() override { return this; } PtrOperatorAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT PostfixAST: public ExpressionAST { public: PostfixAST *asPostfix() override { return this; } PostfixAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT CoreDeclaratorAST: public AST { public: CoreDeclaratorAST *asCoreDeclarator() override { return this; } CoreDeclaratorAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT PostfixDeclaratorAST: public AST { public: PostfixDeclaratorAST *asPostfixDeclarator() override { return this; } PostfixDeclaratorAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT ObjCSelectorArgumentAST: public AST { public: int name_token = 0; int colon_token = 0; public: ObjCSelectorArgumentAST *asObjCSelectorArgument() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSelectorArgumentAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCSelectorAST: public NameAST { public: ObjCSelectorArgumentListAST *selector_argument_list = nullptr; public: ObjCSelectorAST *asObjCSelector() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSelectorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT SimpleSpecifierAST: public SpecifierAST { public: int specifier_token = 0; public: SimpleSpecifierAST *asSimpleSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; SimpleSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AttributeSpecifierAST: public SpecifierAST { public: AttributeSpecifierAST *asAttributeSpecifier() override { return this; } AttributeSpecifierAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT AlignmentSpecifierAST: public AttributeSpecifierAST { public: int align_token = 0; int lparen_token = 0; ExpressionAST *typeIdExprOrAlignmentExpr = nullptr; int ellipses_token = 0; int rparen_token = 0; public: AlignmentSpecifierAST *asAlignmentSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; AlignmentSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT GnuAttributeSpecifierAST: public AttributeSpecifierAST { public: int attribute_token = 0; int first_lparen_token = 0; int second_lparen_token = 0; GnuAttributeListAST *attribute_list = nullptr; int first_rparen_token = 0; int second_rparen_token = 0; public: GnuAttributeSpecifierAST *asGnuAttributeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; GnuAttributeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT MsvcDeclspecSpecifierAST: public AttributeSpecifierAST { public: int attribute_token = 0; int lparen_token = 0; GnuAttributeListAST *attribute_list = nullptr; int rparen_token = 0; public: MsvcDeclspecSpecifierAST *asMsvcDeclspecSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; MsvcDeclspecSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT StdAttributeSpecifierAST: public AttributeSpecifierAST { public: int first_lbracket_token = 0; int second_lbracket_token = 0; GnuAttributeListAST *attribute_list = nullptr; int first_rbracket_token = 0; int second_rbracket_token = 0; public: StdAttributeSpecifierAST *asStdAttributeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; StdAttributeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT GnuAttributeAST: public AST { public: int identifier_token = 0; int lparen_token = 0; int tag_token = 0; ExpressionListAST *expression_list = nullptr; int rparen_token = 0; public: GnuAttributeAST *asGnuAttribute() override { return this; } int firstToken() const override; int lastToken() const override; GnuAttributeAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypeofSpecifierAST: public SpecifierAST { public: int typeof_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: TypeofSpecifierAST *asTypeofSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; TypeofSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DecltypeSpecifierAST: public SpecifierAST { public: int decltype_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: DecltypeSpecifierAST *asDecltypeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; DecltypeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypeConstraintAST: public AST { public: NestedNameSpecifierListAST *nestedName = nullptr; NameAST *conceptName = nullptr; int lessToken = 0; ExpressionListAST *templateArgs = nullptr; int greaterToken = 0; TypeConstraintAST *asTypeConstraint() override { return this; } int firstToken() const override; int lastToken() const override; TypeConstraintAST *clone(MemoryPool *pool) const override; void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT PlaceholderTypeSpecifierAST: public SpecifierAST { public: TypeConstraintAST *typeConstraint = nullptr; int declTypetoken = 0; int lparenToken = 0; int decltypeToken = 0; int autoToken = 0; int rparenToken = 0; public: PlaceholderTypeSpecifierAST *asPlaceholderTypeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; PlaceholderTypeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DeclaratorAST: public AST { public: SpecifierListAST *attribute_list = nullptr; PtrOperatorListAST *ptr_operator_list = nullptr; CoreDeclaratorAST *core_declarator = nullptr; PostfixDeclaratorListAST *postfix_declarator_list = nullptr; SpecifierListAST *post_attribute_list = nullptr; int equal_token = 0; ExpressionAST *initializer = nullptr; RequiresClauseAST *requiresClause = nullptr; public: DeclaratorAST *asDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; DeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT SimpleDeclarationAST: public DeclarationAST { public: int qt_invokable_token = 0; SpecifierListAST *decl_specifier_list = nullptr; DeclaratorListAST *declarator_list = nullptr; int semicolon_token = 0; public: List *symbols = nullptr; public: SimpleDeclarationAST *asSimpleDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; SimpleDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT EmptyDeclarationAST: public DeclarationAST { public: int semicolon_token = 0; public: EmptyDeclarationAST *asEmptyDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; EmptyDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AccessDeclarationAST: public DeclarationAST { public: int access_specifier_token = 0; int slots_token = 0; int colon_token = 0; public: AccessDeclarationAST *asAccessDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; AccessDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtObjectTagAST: public DeclarationAST { public: int q_object_token = 0; public: QtObjectTagAST *asQtObjectTag() override { return this; } int firstToken() const override; int lastToken() const override; QtObjectTagAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtPrivateSlotAST: public DeclarationAST { public: int q_private_slot_token = 0; int lparen_token = 0; int dptr_token = 0; int dptr_lparen_token = 0; int dptr_rparen_token = 0; int comma_token = 0; SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; int rparen_token = 0; public: QtPrivateSlotAST *asQtPrivateSlot() override { return this; } int firstToken() const override; int lastToken() const override; QtPrivateSlotAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class QtPropertyDeclarationItemAST: public AST { public: int item_name_token = 0; ExpressionAST *expression = nullptr; public: QtPropertyDeclarationItemAST *asQtPropertyDeclarationItem() override { return this; } int firstToken() const override; int lastToken() const override; QtPropertyDeclarationItemAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtPropertyDeclarationAST: public DeclarationAST { public: int property_specifier_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; // for Q_PRIVATE_PROPERTY(expression, ...) int comma_token = 0; ExpressionAST *type_id = nullptr; NameAST *property_name = nullptr; QtPropertyDeclarationItemListAST *property_declaration_item_list = nullptr; int rparen_token = 0; public: QtPropertyDeclarationAST *asQtPropertyDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; QtPropertyDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtEnumDeclarationAST: public DeclarationAST { public: int enum_specifier_token = 0; int lparen_token = 0; NameListAST *enumerator_list = nullptr; int rparen_token = 0; public: QtEnumDeclarationAST *asQtEnumDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; QtEnumDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtFlagsDeclarationAST: public DeclarationAST { public: int flags_specifier_token = 0; int lparen_token = 0; NameListAST *flag_enums_list = nullptr; int rparen_token = 0; public: QtFlagsDeclarationAST *asQtFlagsDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; QtFlagsDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtInterfaceNameAST: public AST { public: NameAST *interface_name = nullptr; NameListAST *constraint_list = nullptr; public: QtInterfaceNameAST *asQtInterfaceName() override { return this; } int firstToken() const override; int lastToken() const override; QtInterfaceNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtInterfacesDeclarationAST: public DeclarationAST { public: int interfaces_token = 0; int lparen_token = 0; QtInterfaceNameListAST *interface_name_list = nullptr; int rparen_token = 0; public: QtInterfacesDeclarationAST *asQtInterfacesDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; QtInterfacesDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AsmDefinitionAST: public DeclarationAST { public: int asm_token = 0; int volatile_token = 0; int lparen_token = 0; // ### string literals // ### asm operand list int rparen_token = 0; int semicolon_token = 0; public: AsmDefinitionAST *asAsmDefinition() override { return this; } int firstToken() const override; int lastToken() const override; AsmDefinitionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT BaseSpecifierAST: public AST { public: int virtual_token = 0; int access_specifier_token = 0; NameAST *name = nullptr; int ellipsis_token = 0; public: // annotations BaseClass *symbol = nullptr; public: BaseSpecifierAST *asBaseSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; BaseSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT IdExpressionAST: public ExpressionAST { public: NameAST *name = nullptr; public: IdExpressionAST *asIdExpression() override { return this; } int firstToken() const override; int lastToken() const override; IdExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CompoundExpressionAST: public ExpressionAST { public: int lparen_token = 0; CompoundStatementAST *statement = nullptr; int rparen_token = 0; public: CompoundExpressionAST *asCompoundExpression() override { return this; } int firstToken() const override; int lastToken() const override; CompoundExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CompoundLiteralAST: public ExpressionAST { public: int lparen_token = 0; ExpressionAST *type_id = nullptr; int rparen_token = 0; ExpressionAST *initializer = nullptr; public: CompoundLiteralAST *asCompoundLiteral() override { return this; } int firstToken() const override; int lastToken() const override; CompoundLiteralAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtMethodAST: public ExpressionAST { public: int method_token = 0; int lparen_token = 0; DeclaratorAST *declarator = nullptr; int rparen_token = 0; public: QtMethodAST *asQtMethod() override { return this; } int firstToken() const override; int lastToken() const override; QtMethodAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QtMemberDeclarationAST: public StatementAST { public: int q_token = 0; int lparen_token = 0; ExpressionAST *type_id = nullptr; int rparen_token = 0; public: QtMemberDeclarationAST *asQtMemberDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; QtMemberDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT BinaryExpressionAST: public ExpressionAST { public: ExpressionAST *left_expression = nullptr; int binary_op_token = 0; ExpressionAST *right_expression = nullptr; public: BinaryExpressionAST *asBinaryExpression() override { return this; } int firstToken() const override; int lastToken() const override; BinaryExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CastExpressionAST: public ExpressionAST { public: int lparen_token = 0; ExpressionAST *type_id = nullptr; int rparen_token = 0; ExpressionAST *expression = nullptr; public: CastExpressionAST *asCastExpression() override { return this; } int firstToken() const override; int lastToken() const override; CastExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ClassSpecifierAST: public SpecifierAST { public: int classkey_token = 0; SpecifierListAST *attribute_list = nullptr; NameAST *name = nullptr; int final_token = 0; int colon_token = 0; BaseSpecifierListAST *base_clause_list = nullptr; int dot_dot_dot_token = 0; int lbrace_token = 0; DeclarationListAST *member_specifier_list = nullptr; int rbrace_token = 0; public: // annotations Class *symbol = nullptr; public: ClassSpecifierAST *asClassSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; ClassSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CaseStatementAST: public StatementAST { public: int case_token = 0; ExpressionAST *expression = nullptr; int colon_token = 0; StatementAST *statement = nullptr; public: CaseStatementAST *asCaseStatement() override { return this; } int firstToken() const override; int lastToken() const override; CaseStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CompoundStatementAST: public StatementAST { public: int lbrace_token = 0; StatementListAST *statement_list = nullptr; int rbrace_token = 0; public: // annotations Block *symbol = nullptr; public: CompoundStatementAST *asCompoundStatement() override { return this; } int firstToken() const override; int lastToken() const override; CompoundStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ConditionAST: public ExpressionAST { public: SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; public: ConditionAST *asCondition() override { return this; } int firstToken() const override; int lastToken() const override; ConditionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ConditionalExpressionAST: public ExpressionAST { public: ExpressionAST *condition = nullptr; int question_token = 0; ExpressionAST *left_expression = nullptr; int colon_token = 0; ExpressionAST *right_expression = nullptr; public: ConditionalExpressionAST *asConditionalExpression() override { return this; } int firstToken() const override; int lastToken() const override; ConditionalExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CppCastExpressionAST: public ExpressionAST { public: int cast_token = 0; int less_token = 0; ExpressionAST *type_id = nullptr; int greater_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: CppCastExpressionAST *asCppCastExpression() override { return this; } int firstToken() const override; int lastToken() const override; CppCastExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CtorInitializerAST: public AST { public: int colon_token = 0; MemInitializerListAST *member_initializer_list = nullptr; int dot_dot_dot_token = 0; public: CtorInitializerAST *asCtorInitializer() override { return this; } int firstToken() const override; int lastToken() const override; CtorInitializerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DeclarationStatementAST: public StatementAST { public: DeclarationAST *declaration = nullptr; public: DeclarationStatementAST *asDeclarationStatement() override { return this; } int firstToken() const override; int lastToken() const override; DeclarationStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DeclaratorIdAST: public CoreDeclaratorAST { public: int dot_dot_dot_token = 0; NameAST *name = nullptr; public: DeclaratorIdAST *asDeclaratorId() override { return this; } int firstToken() const override; int lastToken() const override; DeclaratorIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DecompositionDeclaratorAST: public CoreDeclaratorAST { public: NameListAST *identifiers = nullptr; public: DecompositionDeclaratorAST *asDecompositionDeclarator() override { return this; } int firstToken() const override { return identifiers->firstToken(); } int lastToken() const override { return identifiers->lastToken(); } DecompositionDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NestedDeclaratorAST: public CoreDeclaratorAST { public: int lparen_token = 0; DeclaratorAST *declarator = nullptr; int rparen_token = 0; public: NestedDeclaratorAST *asNestedDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; NestedDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT FunctionDeclaratorAST: public PostfixDeclaratorAST { public: SpecifierListAST *decl_specifier_list = nullptr; int lparen_token = 0; ParameterDeclarationClauseAST *parameter_declaration_clause = nullptr; int rparen_token = 0; SpecifierListAST *cv_qualifier_list = nullptr; int ref_qualifier_token = 0; ExceptionSpecificationAST *exception_specification = nullptr; TrailingReturnTypeAST *trailing_return_type = nullptr; // Some FunctionDeclarators can also be interpreted as an initializer, like for 'A b(c);' ExpressionAST *as_cpp_initializer = nullptr; public: // annotations Function *symbol = nullptr; public: FunctionDeclaratorAST *asFunctionDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; FunctionDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ArrayDeclaratorAST: public PostfixDeclaratorAST { public: int lbracket_token = 0; ExpressionAST *expression = nullptr; int rbracket_token = 0; public: ArrayDeclaratorAST *asArrayDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; ArrayDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DeleteExpressionAST: public ExpressionAST { public: int scope_token = 0; int delete_token = 0; int lbracket_token = 0; int rbracket_token = 0; ExpressionAST *expression = nullptr; public: DeleteExpressionAST *asDeleteExpression() override { return this; } int firstToken() const override; int lastToken() const override; DeleteExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DoStatementAST: public StatementAST { public: int do_token = 0; StatementAST *statement = nullptr; int while_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; int semicolon_token = 0; public: DoStatementAST *asDoStatement() override { return this; } int firstToken() const override; int lastToken() const override; DoStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NamedTypeSpecifierAST: public SpecifierAST { public: NameAST *name = nullptr; public: NamedTypeSpecifierAST *asNamedTypeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; NamedTypeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ElaboratedTypeSpecifierAST: public SpecifierAST { public: int classkey_token = 0; SpecifierListAST *attribute_list = nullptr; NameAST *name = nullptr; public: ElaboratedTypeSpecifierAST *asElaboratedTypeSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; ElaboratedTypeSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT EnumSpecifierAST: public SpecifierAST { public: int enum_token = 0; int key_token = 0; // struct, class or 0 NameAST *name = nullptr; int colon_token = 0; // can be 0 if there is no enum-base SpecifierListAST *type_specifier_list = nullptr; // ditto int lbrace_token = 0; EnumeratorListAST *enumerator_list = nullptr; int stray_comma_token = 0; int rbrace_token = 0; public: // annotations Enum *symbol = nullptr; public: EnumSpecifierAST *asEnumSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; EnumSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT EnumeratorAST: public AST { public: int identifier_token = 0; int equal_token = 0; ExpressionAST *expression = nullptr; public: EnumeratorAST *asEnumerator() override { return this; } int firstToken() const override; int lastToken() const override; EnumeratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ExceptionDeclarationAST: public DeclarationAST { public: SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; int dot_dot_dot_token = 0; public: ExceptionDeclarationAST *asExceptionDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ExceptionDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ExceptionSpecificationAST: public AST { public: ExceptionSpecificationAST *asExceptionSpecification() override { return this; } ExceptionSpecificationAST *clone(MemoryPool *pool) const override = 0; }; class CPLUSPLUS_EXPORT DynamicExceptionSpecificationAST: public ExceptionSpecificationAST { public: int throw_token = 0; int lparen_token = 0; int dot_dot_dot_token = 0; ExpressionListAST *type_id_list = nullptr; int rparen_token = 0; public: DynamicExceptionSpecificationAST *asDynamicExceptionSpecification() override { return this; } int firstToken() const override; int lastToken() const override; DynamicExceptionSpecificationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NoExceptSpecificationAST: public ExceptionSpecificationAST { public: int noexcept_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: NoExceptSpecificationAST *asNoExceptSpecification() override { return this; } int firstToken() const override; int lastToken() const override; NoExceptSpecificationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ExpressionOrDeclarationStatementAST: public StatementAST { public: ExpressionStatementAST *expression = nullptr; DeclarationStatementAST *declaration = nullptr; public: ExpressionOrDeclarationStatementAST *asExpressionOrDeclarationStatement() override { return this; } int firstToken() const override; int lastToken() const override; ExpressionOrDeclarationStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ExpressionStatementAST: public StatementAST { public: ExpressionAST *expression = nullptr; int semicolon_token = 0; public: ExpressionStatementAST *asExpressionStatement() override { return this; } int firstToken() const override; int lastToken() const override; ExpressionStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT FunctionDefinitionAST: public DeclarationAST { public: int qt_invokable_token = 0; SpecifierListAST *decl_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; CtorInitializerAST *ctor_initializer = nullptr; StatementAST *function_body = nullptr; public: // annotations Function *symbol = nullptr; public: FunctionDefinitionAST *asFunctionDefinition() override { return this; } int firstToken() const override; int lastToken() const override; FunctionDefinitionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ForeachStatementAST: public StatementAST { public: int foreach_token = 0; int lparen_token = 0; // declaration SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; // or an expression ExpressionAST *initializer = nullptr; int comma_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: ForeachStatementAST *asForeachStatement() override { return this; } int firstToken() const override; int lastToken() const override; ForeachStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT RangeBasedForStatementAST : public StatementAST { public: int for_token = 0; int lparen_token = 0; // declaration SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; // or an expression int colon_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: RangeBasedForStatementAST *asRangeBasedForStatement() override { return this; } int firstToken() const override; int lastToken() const override; RangeBasedForStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ForStatementAST: public StatementAST { public: int for_token = 0; int lparen_token = 0; StatementAST *initializer = nullptr; ExpressionAST *condition = nullptr; int semicolon_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: ForStatementAST *asForStatement() override { return this; } int firstToken() const override; int lastToken() const override; ForStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT IfStatementAST: public StatementAST { public: int if_token = 0; int constexpr_token = 0; int lparen_token = 0; StatementAST *initStmt = nullptr; ExpressionAST *condition = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; int else_token = 0; StatementAST *else_statement = nullptr; public: // annotations Block *symbol = nullptr; public: IfStatementAST *asIfStatement() override { return this; } int firstToken() const override; int lastToken() const override; IfStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ArrayInitializerAST: public ExpressionAST { public: int lbrace_token = 0; ExpressionListAST *expression_list = nullptr; int rbrace_token = 0; public: ArrayInitializerAST *asArrayInitializer() override { return this; } int firstToken() const override; int lastToken() const override; ArrayInitializerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT LabeledStatementAST: public StatementAST { public: int label_token = 0; int colon_token = 0; StatementAST *statement = nullptr; public: LabeledStatementAST *asLabeledStatement() override { return this; } int firstToken() const override; int lastToken() const override; LabeledStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT LinkageBodyAST: public DeclarationAST { public: int lbrace_token = 0; DeclarationListAST *declaration_list = nullptr; int rbrace_token = 0; public: LinkageBodyAST *asLinkageBody() override { return this; } int firstToken() const override; int lastToken() const override; LinkageBodyAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT LinkageSpecificationAST: public DeclarationAST { public: int extern_token = 0; int extern_type_token = 0; DeclarationAST *declaration = nullptr; public: LinkageSpecificationAST *asLinkageSpecification() override { return this; } int firstToken() const override; int lastToken() const override; LinkageSpecificationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT MemInitializerAST: public AST { public: NameAST *name = nullptr; // either a BracedInitializerAST or a ExpressionListParenAST ExpressionAST *expression = nullptr; public: MemInitializerAST *asMemInitializer() override { return this; } int firstToken() const override; int lastToken() const override; MemInitializerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NestedNameSpecifierAST: public AST { public: NameAST *class_or_namespace_name = nullptr; int scope_token = 0; public: NestedNameSpecifierAST *asNestedNameSpecifier() override { return this; } int firstToken() const override; int lastToken() const override; NestedNameSpecifierAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT QualifiedNameAST: public NameAST { public: int global_scope_token = 0; NestedNameSpecifierListAST *nested_name_specifier_list = nullptr; NameAST *unqualified_name = nullptr; public: QualifiedNameAST *asQualifiedName() override { return this; } int firstToken() const override; int lastToken() const override; QualifiedNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT OperatorFunctionIdAST: public NameAST { public: int operator_token = 0; OperatorAST *op = nullptr; public: OperatorFunctionIdAST *asOperatorFunctionId() override { return this; } int firstToken() const override; int lastToken() const override; OperatorFunctionIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ConversionFunctionIdAST: public NameAST { public: int operator_token = 0; SpecifierListAST *type_specifier_list = nullptr; PtrOperatorListAST *ptr_operator_list = nullptr; public: ConversionFunctionIdAST *asConversionFunctionId() override { return this; } int firstToken() const override; int lastToken() const override; ConversionFunctionIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AnonymousNameAST: public NameAST { public: int class_token = 0; public: AnonymousNameAST *asAnonymousName() override { return this; } int firstToken() const override { return 0; } int lastToken() const override { return 0; } AnonymousNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT SimpleNameAST: public NameAST { public: int identifier_token = 0; public: SimpleNameAST *asSimpleName() override { return this; } int firstToken() const override; int lastToken() const override; SimpleNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT DestructorNameAST: public NameAST { public: int tilde_token = 0; NameAST *unqualified_name = nullptr; public: DestructorNameAST *asDestructorName() override { return this; } int firstToken() const override; int lastToken() const override; DestructorNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TemplateIdAST: public NameAST { public: int template_token = 0; int identifier_token = 0; int less_token = 0; ExpressionListAST *template_argument_list = nullptr; int greater_token = 0; public: TemplateIdAST *asTemplateId() override { return this; } int firstToken() const override; int lastToken() const override; TemplateIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NamespaceAST: public DeclarationAST { public: int inline_token = 0; int namespace_token = 0; int identifier_token = 0; SpecifierListAST *attribute_list = nullptr; DeclarationAST *linkage_body = nullptr; public: // annotations Namespace *symbol = nullptr; public: NamespaceAST *asNamespace() override { return this; } int firstToken() const override; int lastToken() const override; NamespaceAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NamespaceAliasDefinitionAST: public DeclarationAST { public: int namespace_token = 0; int namespace_name_token = 0; int equal_token = 0; NameAST *name = nullptr; int semicolon_token = 0; public: NamespaceAliasDefinitionAST *asNamespaceAliasDefinition() override { return this; } int firstToken() const override; int lastToken() const override; NamespaceAliasDefinitionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AliasDeclarationAST: public DeclarationAST { public: int using_token = 0; NameAST *name = nullptr; int equal_token = 0; TypeIdAST *typeId = nullptr; int semicolon_token = 0; public: // annotations Declaration *symbol = nullptr; public: AliasDeclarationAST *asAliasDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; AliasDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ExpressionListParenAST: public ExpressionAST { public: int lparen_token = 0; ExpressionListAST *expression_list = nullptr; int rparen_token = 0; public: ExpressionListParenAST *asExpressionListParen() override { return this; } int firstToken() const override; int lastToken() const override; ExpressionListParenAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NewArrayDeclaratorAST: public AST { public: int lbracket_token = 0; ExpressionAST *expression = nullptr; int rbracket_token = 0; public: NewArrayDeclaratorAST *asNewArrayDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; NewArrayDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NewExpressionAST: public ExpressionAST { public: int scope_token = 0; int new_token = 0; ExpressionListParenAST *new_placement = nullptr; int lparen_token = 0; ExpressionAST *type_id = nullptr; int rparen_token = 0; NewTypeIdAST *new_type_id = nullptr; ExpressionAST *new_initializer = nullptr; // either ExpressionListParenAST or BracedInitializerAST public: NewExpressionAST *asNewExpression() override { return this; } int firstToken() const override; int lastToken() const override; NewExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NewTypeIdAST: public AST { public: SpecifierListAST *type_specifier_list = nullptr; PtrOperatorListAST *ptr_operator_list = nullptr; NewArrayDeclaratorListAST *new_array_declarator_list = nullptr; public: NewTypeIdAST *asNewTypeId() override { return this; } int firstToken() const override; int lastToken() const override; NewTypeIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT OperatorAST: public AST { public: int op_token = 0; int open_token = 0; int close_token = 0; public: OperatorAST *asOperator() override{ return this; } int firstToken() const override; int lastToken() const override; OperatorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ParameterDeclarationAST: public DeclarationAST { public: SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; int equal_token = 0; ExpressionAST *expression = nullptr; public: // annotations Argument *symbol = nullptr; public: ParameterDeclarationAST *asParameterDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ParameterDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ParameterDeclarationClauseAST: public AST { public: ParameterDeclarationListAST *parameter_declaration_list = nullptr; int dot_dot_dot_token = 0; public: ParameterDeclarationClauseAST *asParameterDeclarationClause() override { return this; } int firstToken() const override; int lastToken() const override; ParameterDeclarationClauseAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CallAST: public PostfixAST { public: ExpressionAST *base_expression = nullptr; int lparen_token = 0; ExpressionListAST *expression_list = nullptr; int rparen_token = 0; public: CallAST *asCall() override { return this; } int firstToken() const override; int lastToken() const override; CallAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ArrayAccessAST: public PostfixAST { public: ExpressionAST *base_expression = nullptr; int lbracket_token = 0; ExpressionAST *expression = nullptr; int rbracket_token = 0; public: ArrayAccessAST *asArrayAccess() override { return this; } int firstToken() const override; int lastToken() const override; ArrayAccessAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT PostIncrDecrAST: public PostfixAST { public: ExpressionAST *base_expression = nullptr; int incr_decr_token = 0; public: PostIncrDecrAST *asPostIncrDecr() override{ return this; } int firstToken() const override; int lastToken() const override; PostIncrDecrAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT MemberAccessAST: public PostfixAST { public: ExpressionAST *base_expression = nullptr; int access_token = 0; int template_token = 0; NameAST *member_name = nullptr; public: MemberAccessAST *asMemberAccess() override { return this; } int firstToken() const override; int lastToken() const override; MemberAccessAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypeidExpressionAST: public ExpressionAST { public: int typeid_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: TypeidExpressionAST *asTypeidExpression() override { return this; } int firstToken() const override; int lastToken() const override; TypeidExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypenameCallExpressionAST: public ExpressionAST { public: int typename_token = 0; NameAST *name = nullptr; ExpressionAST *expression = nullptr; // either ExpressionListParenAST or BracedInitializerAST public: TypenameCallExpressionAST *asTypenameCallExpression() override { return this; } int firstToken() const override; int lastToken() const override; TypenameCallExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypeConstructorCallAST: public ExpressionAST { public: SpecifierListAST *type_specifier_list = nullptr; ExpressionAST *expression = nullptr; // either ExpressionListParenAST or BracedInitializerAST public: TypeConstructorCallAST *asTypeConstructorCall() override { return this; } int firstToken() const override; int lastToken() const override; TypeConstructorCallAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT PointerToMemberAST: public PtrOperatorAST { public: int global_scope_token = 0; NestedNameSpecifierListAST *nested_name_specifier_list = nullptr; int star_token = 0; SpecifierListAST *cv_qualifier_list = nullptr; int ref_qualifier_token = 0; public: PointerToMemberAST *asPointerToMember() override { return this; } int firstToken() const override; int lastToken() const override; PointerToMemberAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT PointerAST: public PtrOperatorAST { public: int star_token = 0; SpecifierListAST *cv_qualifier_list = nullptr; public: PointerAST *asPointer() override { return this; } int firstToken() const override; int lastToken() const override; PointerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ReferenceAST: public PtrOperatorAST { public: int reference_token = 0; public: ReferenceAST *asReference() override { return this; } int firstToken() const override; int lastToken() const override; ReferenceAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT BreakStatementAST: public StatementAST { public: int break_token = 0; int semicolon_token = 0; public: BreakStatementAST *asBreakStatement() override { return this; } int firstToken() const override; int lastToken() const override; BreakStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ContinueStatementAST: public StatementAST { public: int continue_token = 0; int semicolon_token = 0; public: ContinueStatementAST *asContinueStatement() override { return this; } int firstToken() const override; int lastToken() const override; ContinueStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT GotoStatementAST: public StatementAST { public: int goto_token = 0; int identifier_token = 0; int semicolon_token = 0; public: GotoStatementAST *asGotoStatement() override { return this; } int firstToken() const override; int lastToken() const override; GotoStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ReturnStatementAST: public StatementAST { public: int return_token = 0; ExpressionAST *expression = nullptr; int semicolon_token = 0; public: ReturnStatementAST *asReturnStatement() override { return this; } int firstToken() const override; int lastToken() const override; ReturnStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT SizeofExpressionAST: public ExpressionAST { public: int sizeof_token = 0; int dot_dot_dot_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: SizeofExpressionAST *asSizeofExpression() override { return this; } int firstToken() const override; int lastToken() const override; SizeofExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AlignofExpressionAST: public ExpressionAST { public: int alignof_token = 0; int lparen_token = 0; TypeIdAST *typeId = nullptr; int rparen_token = 0; public: AlignofExpressionAST *asAlignofExpression() override { return this; } int firstToken() const override; int lastToken() const override; AlignofExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT PointerLiteralAST: public ExpressionAST { public: int literal_token = 0; public: PointerLiteralAST *asPointerLiteral() override { return this; } int firstToken() const override; int lastToken() const override; PointerLiteralAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NumericLiteralAST: public ExpressionAST { public: int literal_token = 0; public: NumericLiteralAST *asNumericLiteral() override { return this; } int firstToken() const override; int lastToken() const override; NumericLiteralAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT BoolLiteralAST: public ExpressionAST { public: int literal_token = 0; public: BoolLiteralAST *asBoolLiteral() override { return this; } int firstToken() const override; int lastToken() const override; BoolLiteralAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ThisExpressionAST: public ExpressionAST { public: int this_token = 0; public: ThisExpressionAST *asThisExpression() override { return this; } int firstToken() const override; int lastToken() const override; ThisExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NestedExpressionAST: public ExpressionAST { public: int lparen_token = 0; ExpressionAST *expression = nullptr; int rparen_token = 0; public: NestedExpressionAST *asNestedExpression() override { return this; } int firstToken() const override; int lastToken() const override; NestedExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT StaticAssertDeclarationAST: public DeclarationAST { public: int static_assert_token = 0; int lparen_token = 0; ExpressionAST *expression = nullptr; int comma_token = 0; ExpressionAST *string_literal = nullptr; int rparen_token = 0; int semicolon_token = 0; public: StaticAssertDeclarationAST *asStaticAssertDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; StaticAssertDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT StringLiteralAST: public ExpressionAST { public: int literal_token = 0; StringLiteralAST *next = nullptr; public: StringLiteralAST *asStringLiteral() override { return this; } int firstToken() const override; int lastToken() const override; StringLiteralAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT SwitchStatementAST: public StatementAST { public: int switch_token = 0; int lparen_token = 0; ExpressionAST *condition = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: SwitchStatementAST *asSwitchStatement() override { return this; } int firstToken() const override; int lastToken() const override; SwitchStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TemplateDeclarationAST: public DeclarationAST { public: int export_token = 0; int template_token = 0; int less_token = 0; DeclarationListAST *template_parameter_list = nullptr; int greater_token = 0; RequiresClauseAST *requiresClause = nullptr; DeclarationAST *declaration = nullptr; public: // annotations Template *symbol = nullptr; public: TemplateDeclarationAST *asTemplateDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; TemplateDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ConceptDeclarationAST: public DeclarationAST { public: int concept_token = 0; NameAST *name = nullptr; SpecifierListAST *attributes = nullptr; int equals_token = 0; ExpressionAST *constraint = nullptr; int semicolon_token = 0; public: ConceptDeclarationAST *asConceptDeclaration() override { return this; } int firstToken() const override { return concept_token; } int lastToken() const override { return semicolon_token + 1; } ConceptDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ThrowExpressionAST: public ExpressionAST { public: int throw_token = 0; ExpressionAST *expression = nullptr; public: ThrowExpressionAST *asThrowExpression() override { return this; } int firstToken() const override; int lastToken() const override; ThrowExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT YieldExpressionAST: public ExpressionAST { public: int yield_token = 0; ExpressionAST *expression = nullptr; public: YieldExpressionAST *asYieldExpression() override { return this; } int firstToken() const override { return yield_token; } int lastToken() const override { return expression->lastToken(); } YieldExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT AwaitExpressionAST: public ExpressionAST { public: int await_token = 0; ExpressionAST *castExpression = nullptr; public: AwaitExpressionAST *asAwaitExpression() override { return this; } int firstToken() const override { return await_token; } int lastToken() const override { return castExpression->lastToken(); } AwaitExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT NoExceptOperatorExpressionAST: public ExpressionAST { public: int noexcept_token = 0; ExpressionAST *expression = nullptr; public: NoExceptOperatorExpressionAST *asNoExceptOperatorExpression() override { return this; } int firstToken() const override; int lastToken() const override; NoExceptOperatorExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TranslationUnitAST: public AST { public: DeclarationListAST *declaration_list = nullptr; public: TranslationUnitAST *asTranslationUnit() override { return this; } int firstToken() const override; int lastToken() const override; TranslationUnitAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TryBlockStatementAST: public StatementAST { public: int try_token = 0; StatementAST *statement = nullptr; CatchClauseListAST *catch_clause_list = nullptr; public: TryBlockStatementAST *asTryBlockStatement() override { return this; } int firstToken() const override; int lastToken() const override; TryBlockStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT CatchClauseAST: public StatementAST { public: int catch_token = 0; int lparen_token = 0; ExceptionDeclarationAST *exception_declaration = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: CatchClauseAST *asCatchClause() override { return this; } int firstToken() const override; int lastToken() const override; CatchClauseAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypeIdAST: public ExpressionAST { public: SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; public: TypeIdAST *asTypeId() override { return this; } int firstToken() const override; int lastToken() const override; TypeIdAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TypenameTypeParameterAST: public DeclarationAST { public: int classkey_token = 0; int dot_dot_dot_token = 0; NameAST *name = nullptr; int equal_token = 0; ExpressionAST *type_id = nullptr; public: // annotations TypenameArgument *symbol = nullptr; public: TypenameTypeParameterAST *asTypenameTypeParameter() override { return this; } int firstToken() const override; int lastToken() const override; TypenameTypeParameterAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT TemplateTypeParameterAST: public DeclarationAST { public: int template_token = 0; TypeConstraintAST *typeConstraint = nullptr; int less_token = 0; DeclarationListAST *template_parameter_list = nullptr; int greater_token = 0; int class_token = 0; int dot_dot_dot_token = 0; NameAST *name = nullptr; int equal_token = 0; ExpressionAST *type_id = nullptr; public: TypenameArgument *symbol = nullptr; public: TemplateTypeParameterAST *asTemplateTypeParameter() override { return this; } int firstToken() const override; int lastToken() const override; TemplateTypeParameterAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT UnaryExpressionAST: public ExpressionAST { public: int unary_op_token = 0; ExpressionAST *expression = nullptr; public: UnaryExpressionAST *asUnaryExpression() override { return this; } int firstToken() const override; int lastToken() const override; UnaryExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT RequiresExpressionAST: public ExpressionAST { public: int requires_token = 0; int lparen_token = 0; ParameterDeclarationClauseAST *parameters = nullptr; int rparen_token = 0; int lbrace_token = 0; int rbrace_token = 0; public: RequiresExpressionAST *asRequiresExpression() override { return this; } int firstToken() const override { return requires_token; } int lastToken() const override { return rbrace_token + 1; } RequiresExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT RequiresClauseAST: public AST { public: int requires_token = 0; ExpressionAST *constraint = nullptr; public: RequiresClauseAST *asRequiresClause() override { return this; } int firstToken() const override { return requires_token; } int lastToken() const override { return constraint->lastToken(); } RequiresClauseAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT UsingAST: public DeclarationAST { public: int using_token = 0; int typename_token = 0; NameAST *name = nullptr; int semicolon_token = 0; public: // annotations UsingDeclaration *symbol = nullptr; public: UsingAST *asUsing() override { return this; } int firstToken() const override; int lastToken() const override; UsingAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT UsingDirectiveAST: public DeclarationAST { public: int using_token = 0; int namespace_token = 0; NameAST *name = nullptr; int semicolon_token = 0; public: UsingNamespaceDirective *symbol = nullptr; public: UsingDirectiveAST *asUsingDirective() override { return this; } int firstToken() const override; int lastToken() const override; UsingDirectiveAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT WhileStatementAST: public StatementAST { public: int while_token = 0; int lparen_token = 0; ExpressionAST *condition = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: WhileStatementAST *asWhileStatement() override { return this; } int firstToken() const override; int lastToken() const override; WhileStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCClassForwardDeclarationAST: public DeclarationAST { public: SpecifierListAST *attribute_list = nullptr; int class_token = 0; NameListAST *identifier_list = nullptr; int semicolon_token = 0; public: // annotations List *symbols = nullptr; public: ObjCClassForwardDeclarationAST *asObjCClassForwardDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCClassForwardDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST { public: SpecifierListAST *attribute_list = nullptr; int interface_token = 0; int implementation_token = 0; NameAST *class_name = nullptr; int lparen_token = 0; NameAST *category_name = nullptr; int rparen_token = 0; int colon_token = 0; NameAST *superclass = nullptr; ObjCProtocolRefsAST *protocol_refs = nullptr; ObjCInstanceVariablesDeclarationAST *inst_vars_decl = nullptr; DeclarationListAST *member_declaration_list = nullptr; int end_token = 0; public: // annotations ObjCClass *symbol = nullptr; public: ObjCClassDeclarationAST *asObjCClassDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCClassDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCProtocolForwardDeclarationAST: public DeclarationAST { public: SpecifierListAST *attribute_list = nullptr; int protocol_token = 0; NameListAST *identifier_list = nullptr; int semicolon_token = 0; public: // annotations List *symbols = nullptr; public: ObjCProtocolForwardDeclarationAST *asObjCProtocolForwardDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCProtocolForwardDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCProtocolDeclarationAST: public DeclarationAST { public: SpecifierListAST *attribute_list = nullptr; int protocol_token = 0; NameAST *name = nullptr; ObjCProtocolRefsAST *protocol_refs = nullptr; DeclarationListAST *member_declaration_list = nullptr; int end_token = 0; public: // annotations ObjCProtocol *symbol = nullptr; public: ObjCProtocolDeclarationAST *asObjCProtocolDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCProtocolDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCProtocolRefsAST: public AST { public: int less_token = 0; NameListAST *identifier_list = nullptr; int greater_token = 0; public: ObjCProtocolRefsAST *asObjCProtocolRefs() override { return this; } int firstToken() const override; int lastToken() const override; ObjCProtocolRefsAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCMessageArgumentAST: public AST { public: ExpressionAST *parameter_value_expression = nullptr; public: ObjCMessageArgumentAST *asObjCMessageArgument() override { return this; } int firstToken() const override; int lastToken() const override; ObjCMessageArgumentAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCMessageExpressionAST: public ExpressionAST { public: int lbracket_token = 0; ExpressionAST *receiver_expression = nullptr; ObjCSelectorAST *selector = nullptr; ObjCMessageArgumentListAST *argument_list = nullptr; int rbracket_token = 0; public: ObjCMessageExpressionAST *asObjCMessageExpression() override { return this; } int firstToken() const override; int lastToken() const override; ObjCMessageExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCProtocolExpressionAST: public ExpressionAST { public: int protocol_token = 0; int lparen_token = 0; int identifier_token = 0; int rparen_token = 0; public: ObjCProtocolExpressionAST *asObjCProtocolExpression() override { return this; } int firstToken() const override; int lastToken() const override; ObjCProtocolExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCTypeNameAST: public AST { public: int lparen_token = 0; int type_qualifier_token = 0; ExpressionAST *type_id = nullptr; int rparen_token = 0; public: ObjCTypeNameAST *asObjCTypeName() override { return this; } int firstToken() const override; int lastToken() const override; ObjCTypeNameAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCEncodeExpressionAST: public ExpressionAST { public: int encode_token = 0; ObjCTypeNameAST *type_name = nullptr; public: ObjCEncodeExpressionAST *asObjCEncodeExpression() override { return this; } int firstToken() const override; int lastToken() const override; ObjCEncodeExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCSelectorExpressionAST: public ExpressionAST { public: int selector_token = 0; int lparen_token = 0; ObjCSelectorAST *selector = nullptr; int rparen_token = 0; public: ObjCSelectorExpressionAST *asObjCSelectorExpression() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSelectorExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCInstanceVariablesDeclarationAST: public AST { public: int lbrace_token = 0; DeclarationListAST *instance_variable_list = nullptr; int rbrace_token = 0; public: ObjCInstanceVariablesDeclarationAST *asObjCInstanceVariablesDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCInstanceVariablesDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCVisibilityDeclarationAST: public DeclarationAST { public: int visibility_token = 0; public: ObjCVisibilityDeclarationAST *asObjCVisibilityDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCVisibilityDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCPropertyAttributeAST: public AST { public: int attribute_identifier_token = 0; int equals_token = 0; ObjCSelectorAST *method_selector = nullptr; public: ObjCPropertyAttributeAST *asObjCPropertyAttribute() override { return this; } int firstToken() const override; int lastToken() const override; ObjCPropertyAttributeAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCPropertyDeclarationAST: public DeclarationAST { public: SpecifierListAST *attribute_list = nullptr; int property_token = 0; int lparen_token = 0; ObjCPropertyAttributeListAST *property_attribute_list = nullptr; int rparen_token = 0; DeclarationAST *simple_declaration = nullptr; public: // annotations List *symbols = nullptr; public: ObjCPropertyDeclarationAST *asObjCPropertyDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCPropertyDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCMessageArgumentDeclarationAST: public AST { public: ObjCTypeNameAST *type_name = nullptr; SpecifierListAST *attribute_list = nullptr; NameAST *param_name = nullptr; public: // annotations Argument *argument = nullptr; public: ObjCMessageArgumentDeclarationAST *asObjCMessageArgumentDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCMessageArgumentDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCMethodPrototypeAST: public AST { public: int method_type_token = 0; ObjCTypeNameAST *type_name = nullptr; ObjCSelectorAST *selector = nullptr; ObjCMessageArgumentDeclarationListAST *argument_list = nullptr; int dot_dot_dot_token = 0; SpecifierListAST *attribute_list = nullptr; public: // annotations ObjCMethod *symbol = nullptr; public: ObjCMethodPrototypeAST *asObjCMethodPrototype() override { return this; } int firstToken() const override; int lastToken() const override; ObjCMethodPrototypeAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCMethodDeclarationAST: public DeclarationAST { public: ObjCMethodPrototypeAST *method_prototype = nullptr; StatementAST *function_body = nullptr; int semicolon_token = 0; public: ObjCMethodDeclarationAST *asObjCMethodDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCMethodDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCSynthesizedPropertyAST: public AST { public: int property_identifier_token = 0; int equals_token = 0; int alias_identifier_token = 0; public: ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSynthesizedPropertyAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCSynthesizedPropertiesDeclarationAST: public DeclarationAST { public: int synthesized_token = 0; ObjCSynthesizedPropertyListAST *property_identifier_list = nullptr; int semicolon_token = 0; public: ObjCSynthesizedPropertiesDeclarationAST *asObjCSynthesizedPropertiesDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSynthesizedPropertiesDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCDynamicPropertiesDeclarationAST: public DeclarationAST { public: int dynamic_token = 0; NameListAST *property_identifier_list = nullptr; int semicolon_token = 0; public: ObjCDynamicPropertiesDeclarationAST *asObjCDynamicPropertiesDeclaration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCDynamicPropertiesDeclarationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCFastEnumerationAST: public StatementAST { public: int for_token = 0; int lparen_token = 0; // declaration SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; // or an expression ExpressionAST *initializer = nullptr; int in_token = 0; ExpressionAST *fast_enumeratable_expression = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: // annotations Block *symbol = nullptr; public: ObjCFastEnumerationAST *asObjCFastEnumeration() override { return this; } int firstToken() const override; int lastToken() const override; ObjCFastEnumerationAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CPLUSPLUS_EXPORT ObjCSynchronizedStatementAST: public StatementAST { public: int synchronized_token = 0; int lparen_token = 0; ExpressionAST *synchronized_object = nullptr; int rparen_token = 0; StatementAST *statement = nullptr; public: ObjCSynchronizedStatementAST *asObjCSynchronizedStatement() override { return this; } int firstToken() const override; int lastToken() const override; ObjCSynchronizedStatementAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class LambdaExpressionAST: public ExpressionAST { public: LambdaIntroducerAST *lambda_introducer = nullptr; DeclarationListAST *templateParameters = nullptr; RequiresClauseAST *requiresClause = nullptr; SpecifierListAST *attributes = nullptr; LambdaDeclaratorAST *lambda_declarator = nullptr; StatementAST *statement = nullptr; public: LambdaExpressionAST *asLambdaExpression() override { return this; } int firstToken() const override; int lastToken() const override; LambdaExpressionAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class LambdaIntroducerAST: public AST { public: int lbracket_token = 0; LambdaCaptureAST *lambda_capture = nullptr; int rbracket_token = 0; public: LambdaIntroducerAST *asLambdaIntroducer() override { return this; } int firstToken() const override; int lastToken() const override; LambdaIntroducerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class LambdaCaptureAST: public AST { public: int default_capture_token = 0; CaptureListAST *capture_list = nullptr; public: LambdaCaptureAST *asLambdaCapture() override { return this; } int firstToken() const override; int lastToken() const override; LambdaCaptureAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class CaptureAST: public AST { public: int amper_token = 0; NameAST *identifier = nullptr; public: CaptureAST *asCapture() override { return this; } int firstToken() const override; int lastToken() const override; CaptureAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class LambdaDeclaratorAST: public AST { public: int lparen_token = 0; ParameterDeclarationClauseAST *parameter_declaration_clause = nullptr; int rparen_token = 0; SpecifierListAST *attributes = nullptr; int mutable_token = 0; ExceptionSpecificationAST *exception_specification = nullptr; TrailingReturnTypeAST *trailing_return_type = nullptr; RequiresClauseAST *requiresClause = nullptr; public: // annotations Function *symbol = nullptr; public: LambdaDeclaratorAST *asLambdaDeclarator() override { return this; } int firstToken() const override; int lastToken() const override; LambdaDeclaratorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class TrailingReturnTypeAST: public AST { public: int arrow_token = 0; SpecifierListAST *attributes = nullptr; SpecifierListAST *type_specifier_list = nullptr; DeclaratorAST *declarator = nullptr; public: TrailingReturnTypeAST *asTrailingReturnType() override { return this; } int firstToken() const override; int lastToken() const override; TrailingReturnTypeAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class BracedInitializerAST: public ExpressionAST { public: int lbrace_token = 0; ExpressionListAST *expression_list = nullptr; int comma_token = 0; int rbrace_token = 0; public: BracedInitializerAST *asBracedInitializer() override { return this; } int firstToken() const override; int lastToken() const override; BracedInitializerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class DesignatorAST: public AST { public: DesignatorAST *asDesignator() override { return this; } DesignatorAST *clone(MemoryPool *pool) const override = 0; }; class DotDesignatorAST: public DesignatorAST { public: int dot_token = 0; int identifier_token = 0; public: DotDesignatorAST *asDotDesignator() override { return this; } int firstToken() const override; int lastToken() const override; DotDesignatorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class BracketDesignatorAST: public DesignatorAST { public: int lbracket_token = 0; ExpressionAST *expression = nullptr; int rbracket_token = 0; public: BracketDesignatorAST *asBracketDesignator() override { return this; } int firstToken() const override; int lastToken() const override; BracketDesignatorAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; class DesignatedInitializerAST: public ExpressionAST { public: DesignatorListAST *designator_list = nullptr; int equal_token = 0; ExpressionAST *initializer = nullptr; public: DesignatedInitializerAST *asDesignatedInitializer() override { return this; } int firstToken() const override; int lastToken() const override; DesignatedInitializerAST *clone(MemoryPool *pool) const override; protected: void accept0(ASTVisitor *visitor) override; bool match0(AST *, ASTMatcher *) override; }; } // namespace CPlusPlus