mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-26 11:52:54 +00:00
1319 lines
28 KiB
C
1319 lines
28 KiB
C
![]() |
/* This file is part of KDevelop
|
||
|
Copyright 2002-2005 Roberto Raggi <roberto@kdevelop.org>
|
||
|
Copyright 2007-2008 David Nolden <david.nolden.kdevelop@art-master.de>
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Library General Public
|
||
|
License version 2 as published by the Free Software Foundation.
|
||
|
|
||
|
This library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Library General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Library General Public License
|
||
|
along with this library; see the file COPYING.LIB. If not, write to
|
||
|
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||
|
Boston, MA 02110-1301, USA.
|
||
|
*/
|
||
|
|
||
|
#ifndef AST_H
|
||
|
#define AST_H
|
||
|
|
||
|
#include "listnode.h"
|
||
|
|
||
|
#define DECLARE_AST_NODE(k) \
|
||
|
enum { __node_kind = Kind_##k };
|
||
|
|
||
|
class ParseSession;
|
||
|
namespace KDevelop
|
||
|
{
|
||
|
class DUContext;
|
||
|
}
|
||
|
class AccessSpecifierAST;
|
||
|
class AsmDefinitionAST;
|
||
|
class BaseClauseAST;
|
||
|
class BaseSpecifierAST;
|
||
|
class BinaryExpressionAST;
|
||
|
class BracedInitListAST;
|
||
|
class CastExpressionAST;
|
||
|
class ClassMemberAccessAST;
|
||
|
class ClassSpecifierAST;
|
||
|
class CompoundStatementAST;
|
||
|
class ConditionAST;
|
||
|
class ConditionalExpressionAST;
|
||
|
class CppCastExpressionAST;
|
||
|
class CtorInitializerAST;
|
||
|
class DeclarationAST;
|
||
|
class DeclarationStatementAST;
|
||
|
class DeclaratorAST;
|
||
|
class DeleteExpressionAST;
|
||
|
class DoStatementAST;
|
||
|
class Elaborated;
|
||
|
class EnumSpecifierAST;
|
||
|
class EnumeratorAST;
|
||
|
class ExceptionSpecificationAST;
|
||
|
class ExpressionAST;
|
||
|
class ExpressionOrDeclarationStatementAST;
|
||
|
class ExpressionStatementAST;
|
||
|
class ForStatementAST;
|
||
|
class ForRangeDeclarationAst;
|
||
|
class FunctionCallAST;
|
||
|
class FunctionDefinitionAST;
|
||
|
class IfStatementAST;
|
||
|
class IncrDecrExpressionAST;
|
||
|
class InitDeclaratorAST;
|
||
|
class InitializerAST;
|
||
|
class InitializerListAST;
|
||
|
class InitializerClauseAST;
|
||
|
class LabeledStatementAST;
|
||
|
class LambdaExpressionAST;
|
||
|
class LambdaCaptureAST;
|
||
|
class LambdaDeclaratorAST;
|
||
|
class LinkageBodyAST;
|
||
|
class LinkageSpecificationAST;
|
||
|
class MemInitializerAST;
|
||
|
class NameAST;
|
||
|
class NamespaceAST;
|
||
|
class NamespaceAliasDefinitionAST;
|
||
|
class NewDeclaratorAST;
|
||
|
class NewExpressionAST;
|
||
|
class NewInitializerAST;
|
||
|
class NewTypeIdAST;
|
||
|
class OperatorAST;
|
||
|
class OperatorFunctionIdAST;
|
||
|
class ParameterDeclarationAST;
|
||
|
class ParameterDeclarationClauseAST;
|
||
|
class PostfixExpressionAST;
|
||
|
class PrimaryExpressionAST;
|
||
|
class PtrOperatorAST;
|
||
|
class PtrToMemberAST;
|
||
|
class ReturnStatementAST;
|
||
|
class SimpleDeclarationAST;
|
||
|
class SimpleTypeSpecifierAST;
|
||
|
class SizeofExpressionAST;
|
||
|
class StatementAST;
|
||
|
class StringLiteralAST;
|
||
|
class SubscriptExpressionAST;
|
||
|
class SwitchStatementAST;
|
||
|
class TemplateArgumentAST;
|
||
|
class TemplateDeclarationAST;
|
||
|
class TemplateParameterAST;
|
||
|
class ThrowExpressionAST;
|
||
|
class TrailingReturnTypeAST;
|
||
|
class TranslationUnitAST;
|
||
|
class TryBlockStatementAST;
|
||
|
class CatchStatementAST;
|
||
|
class TypeIdAST;
|
||
|
class TypeIDOperatorAST;
|
||
|
class TypeIdentificationAST;
|
||
|
class TypeParameterAST;
|
||
|
class TypeSpecifierAST;
|
||
|
class TypedefAST;
|
||
|
class UnaryExpressionAST;
|
||
|
class UnqualifiedNameAST;
|
||
|
class UsingAST;
|
||
|
class UsingDirectiveAST;
|
||
|
class WhileStatementAST;
|
||
|
class WinDeclSpecAST;
|
||
|
|
||
|
class AST
|
||
|
{
|
||
|
public:
|
||
|
/**
|
||
|
* @WARNING: When adding new nodes here, you also need to modify the following places:
|
||
|
* - names[] array in dumptree.cpp
|
||
|
* - add visitXYZ to visitor.h and visitor.cpp, esp. also to the Visitor::_S_table
|
||
|
* - overload visitXYZ impl to default_visitor.cpp
|
||
|
*/
|
||
|
enum NODE_KIND
|
||
|
{
|
||
|
Kind_UNKNOWN = 0,
|
||
|
|
||
|
Kind_AccessSpecifier, // 1
|
||
|
Kind_AsmDefinition, // 2
|
||
|
Kind_BaseClause, // 3
|
||
|
Kind_BaseSpecifier, // 4
|
||
|
Kind_BinaryExpression, // 5
|
||
|
Kind_CastExpression, // 6
|
||
|
Kind_ClassMemberAccess, // 7
|
||
|
Kind_ClassSpecifier, // 8
|
||
|
Kind_CompoundStatement, // 9
|
||
|
Kind_Condition, // 10
|
||
|
Kind_ConditionalExpression, // 11
|
||
|
Kind_CppCastExpression, // 12
|
||
|
Kind_CtorInitializer, // 13
|
||
|
Kind_DeclarationStatement, // 14
|
||
|
Kind_Declarator, // 15
|
||
|
Kind_DeleteExpression, // 16
|
||
|
Kind_DoStatement, // 17
|
||
|
Kind_ElaboratedTypeSpecifier, // 18
|
||
|
Kind_EnumSpecifier, // 19
|
||
|
Kind_Enumerator, // 20
|
||
|
Kind_ExceptionSpecification, // 21
|
||
|
Kind_ExpressionOrDeclarationStatement, // 22
|
||
|
Kind_ExpressionStatement, // 23
|
||
|
Kind_ForStatement, // 24
|
||
|
Kind_FunctionCall, // 25
|
||
|
Kind_FunctionDefinition, // 26
|
||
|
Kind_IfStatement, // 27
|
||
|
Kind_IncrDecrExpression, // 28
|
||
|
Kind_InitDeclarator, // 29
|
||
|
Kind_Initializer, // 30
|
||
|
Kind_InitializerClause, // 31
|
||
|
Kind_LabeledStatement, // 32
|
||
|
Kind_LinkageBody, // 33
|
||
|
Kind_LinkageSpecification, // 34
|
||
|
Kind_MemInitializer, // 35
|
||
|
Kind_Name, // 36
|
||
|
Kind_Namespace, // 37
|
||
|
Kind_NamespaceAliasDefinition, // 38
|
||
|
Kind_NewDeclarator, // 39
|
||
|
Kind_NewExpression, // 40
|
||
|
Kind_NewInitializer, // 41
|
||
|
Kind_NewTypeId, // 42
|
||
|
Kind_Operator, // 43
|
||
|
Kind_OperatorFunctionId, // 44
|
||
|
Kind_ParameterDeclaration, // 45
|
||
|
Kind_ParameterDeclarationClause, // 46
|
||
|
Kind_PostfixExpression, // 47
|
||
|
Kind_PrimaryExpression, // 48
|
||
|
Kind_PtrOperator, // 49
|
||
|
Kind_PtrToMember, // 50
|
||
|
Kind_ReturnStatement, // 51
|
||
|
Kind_SimpleDeclaration, // 52
|
||
|
Kind_SimpleTypeSpecifier, // 53
|
||
|
Kind_SizeofExpression, // 54
|
||
|
Kind_StringLiteral, // 55
|
||
|
Kind_SubscriptExpression, // 56
|
||
|
Kind_SwitchStatement, // 57
|
||
|
Kind_TemplateArgument, // 58
|
||
|
Kind_TemplateDeclaration, // 59
|
||
|
Kind_TemplateParameter, // 60
|
||
|
Kind_ThrowExpression, // 61
|
||
|
Kind_TranslationUnit, // 62
|
||
|
Kind_TryBlockStatement, // 63
|
||
|
Kind_CatchStatement, // 64
|
||
|
Kind_TypeId, // 65
|
||
|
Kind_TypeIdentification, // 66
|
||
|
Kind_TypeParameter, // 67
|
||
|
Kind_Typedef, // 68
|
||
|
Kind_UnaryExpression, // 69
|
||
|
Kind_UnqualifiedName, // 70
|
||
|
Kind_Using, // 71
|
||
|
Kind_UsingDirective, // 72
|
||
|
Kind_WhileStatement, // 73
|
||
|
Kind_WinDeclSpec, // 74
|
||
|
Kind_Comment, // 75
|
||
|
Kind_JumpStatement, // 76
|
||
|
Kind_SignalSlotExpression, // 77
|
||
|
Kind_QPropertyDeclaration, // 78
|
||
|
Kind_ForRangeDeclaration, // 79
|
||
|
Kind_TypeIDOperator, // 80
|
||
|
Kind_StaticAssert, // 81
|
||
|
Kind_TrailingReturnType, // 82
|
||
|
Kind_LambdaExpression, // 83
|
||
|
Kind_LambdaCapture, // 84
|
||
|
Kind_LambdaDeclarator, // 85
|
||
|
Kind_InitializerList, // 86
|
||
|
Kind_BracedInitList, // 87
|
||
|
Kind_AliasDeclaration, // 88
|
||
|
NODE_KIND_COUNT
|
||
|
};
|
||
|
|
||
|
int kind;
|
||
|
|
||
|
uint start_token;
|
||
|
uint end_token;
|
||
|
|
||
|
/** Context opened by this AST
|
||
|
*This is usually not filled for all AST's, only for those that open a new context
|
||
|
*/
|
||
|
KDevelop::DUContext* ducontext;
|
||
|
};
|
||
|
|
||
|
class CommentAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
const ListNode<uint> *comments; //A list of comment-tokens
|
||
|
};
|
||
|
|
||
|
class TypeSpecifierAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
const ListNode<uint> *cv; // const or volatile tokens
|
||
|
};
|
||
|
|
||
|
class StatementAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
};
|
||
|
|
||
|
class ExpressionAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
};
|
||
|
|
||
|
class DeclarationAST : public AST, public CommentAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
};
|
||
|
|
||
|
class AccessSpecifierAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(AccessSpecifier)
|
||
|
|
||
|
const ListNode<uint> *specs;
|
||
|
};
|
||
|
|
||
|
class AsmDefinitionAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(AsmDefinition)
|
||
|
|
||
|
const ListNode<uint> *cv;
|
||
|
};
|
||
|
|
||
|
class BaseClauseAST : public AST // ### kill me
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(BaseClause)
|
||
|
|
||
|
const ListNode<BaseSpecifierAST*> *base_specifiers;
|
||
|
};
|
||
|
|
||
|
class BaseSpecifierAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(BaseSpecifier)
|
||
|
|
||
|
uint virt;
|
||
|
uint access_specifier;
|
||
|
NameAST *name;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class BinaryExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(BinaryExpression)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
ExpressionAST *left_expression;
|
||
|
ExpressionAST *right_expression;
|
||
|
};
|
||
|
|
||
|
///An expression used to do more detailed processing of SIGNAL(..) and SLOT(..) specifications
|
||
|
class SignalSlotExpressionAST : public ExpressionAST {
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SignalSlotExpression)
|
||
|
//The unqualified name also contains the argument types in its template-arguments
|
||
|
UnqualifiedNameAST *name;
|
||
|
};
|
||
|
|
||
|
// An node used to do more detailed processing of Q_PROPERTY specifications
|
||
|
class QPropertyDeclarationAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(QPropertyDeclaration)
|
||
|
|
||
|
TypeSpecifierAST *type;
|
||
|
const ListNode<PtrOperatorAST*> *ptr_ops;
|
||
|
NameAST *name;
|
||
|
|
||
|
/// MEMBER, since Qt 5.1
|
||
|
NameAST *member;
|
||
|
NameAST *getter;
|
||
|
NameAST *setter;
|
||
|
NameAST *resetter;
|
||
|
NameAST *notifier;
|
||
|
|
||
|
NameAST *designableMethod;
|
||
|
NameAST *scriptableMethod;
|
||
|
};
|
||
|
|
||
|
class CastExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(CastExpression)
|
||
|
|
||
|
TypeIdAST *type_id;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class ClassMemberAccessAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ClassMemberAccess)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
NameAST *name;
|
||
|
};
|
||
|
|
||
|
class ClassSpecifierAST : public TypeSpecifierAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ClassSpecifier)
|
||
|
|
||
|
WinDeclSpecAST *win_decl_specifiers;
|
||
|
uint class_key;
|
||
|
NameAST *name;
|
||
|
BaseClauseAST *base_clause;
|
||
|
const ListNode<DeclarationAST*> *member_specs;
|
||
|
const ListNode<uint> *virt_specifiers;
|
||
|
};
|
||
|
|
||
|
class CompoundStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(CompoundStatement)
|
||
|
|
||
|
const ListNode<StatementAST*> *statements;
|
||
|
};
|
||
|
|
||
|
class ConditionAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Condition)
|
||
|
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
DeclaratorAST *declarator;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class ConditionalExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ConditionalExpression)
|
||
|
|
||
|
ExpressionAST *condition;
|
||
|
ExpressionAST *left_expression;
|
||
|
ExpressionAST *right_expression;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* type_id is the type that should be casted to
|
||
|
* expression is the expression casted from
|
||
|
* sub_expressions is a list of post-fix expressions, see PostfixExpressionAST
|
||
|
*/
|
||
|
class CppCastExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(CppCastExpression)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
TypeIdAST *type_id;
|
||
|
ExpressionAST *expression;
|
||
|
const ListNode<ExpressionAST*> *sub_expressions;
|
||
|
};
|
||
|
|
||
|
class CtorInitializerAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(CtorInitializer)
|
||
|
|
||
|
uint colon;
|
||
|
const ListNode<MemInitializerAST*> *member_initializers;
|
||
|
};
|
||
|
|
||
|
class DeclarationStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(DeclarationStatement)
|
||
|
|
||
|
DeclarationAST *declaration;
|
||
|
};
|
||
|
|
||
|
class DeclaratorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Declarator)
|
||
|
|
||
|
const ListNode<PtrOperatorAST*> *ptr_ops;
|
||
|
DeclaratorAST *sub_declarator;
|
||
|
NameAST *id;
|
||
|
ExpressionAST *bit_expression;
|
||
|
const ListNode<ExpressionAST*> *array_dimensions;
|
||
|
|
||
|
ParameterDeclarationClauseAST *parameter_declaration_clause;
|
||
|
const ListNode<uint> *fun_cv;
|
||
|
ExceptionSpecificationAST *exception_spec;
|
||
|
TrailingReturnTypeAST* trailing_return_type;
|
||
|
const ListNode<uint> *virt_specifiers;
|
||
|
// either & or && token or null
|
||
|
uint ref_qualifier;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class DeleteExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(DeleteExpression)
|
||
|
|
||
|
uint scope_token;
|
||
|
uint delete_token;
|
||
|
uint lbracket_token;
|
||
|
uint rbracket_token;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class DoStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(DoStatement)
|
||
|
|
||
|
StatementAST *statement;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class ElaboratedTypeSpecifierAST : public TypeSpecifierAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ElaboratedTypeSpecifier)
|
||
|
|
||
|
uint type;
|
||
|
NameAST *name;
|
||
|
bool isDeclaration; //Whether this type-specifier is a forward declaration rather than use use
|
||
|
};
|
||
|
|
||
|
class EnumSpecifierAST : public TypeSpecifierAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(EnumSpecifier)
|
||
|
|
||
|
NameAST *name;
|
||
|
TypeSpecifierAST* type;
|
||
|
const ListNode<EnumeratorAST*> *enumerators;
|
||
|
bool isClass : 1;
|
||
|
bool isOpaque : 1;
|
||
|
};
|
||
|
|
||
|
class EnumeratorAST : public AST, public CommentAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Enumerator)
|
||
|
|
||
|
uint id;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class ExceptionSpecificationAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ExceptionSpecification)
|
||
|
|
||
|
// when type_ids _and_ ellipsis is not null,
|
||
|
// the exception spec is variadic (pack expansion)
|
||
|
uint ellipsis;
|
||
|
const ListNode<TypeIdAST*> *type_ids;
|
||
|
|
||
|
// noexcept token
|
||
|
uint no_except;
|
||
|
// if set, this is actually a noexcept(...) expression
|
||
|
// and the ast node below points to the ...
|
||
|
ExpressionAST *noexcept_expression;
|
||
|
};
|
||
|
|
||
|
class ExpressionOrDeclarationStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ExpressionOrDeclarationStatement)
|
||
|
|
||
|
StatementAST *expression;
|
||
|
StatementAST *declaration;
|
||
|
|
||
|
// This was not originally part of the AST - added by the context visitor
|
||
|
bool expressionChosen;
|
||
|
};
|
||
|
|
||
|
///An expression terminated by a semicolon or similar
|
||
|
class ExpressionStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ExpressionStatement)
|
||
|
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class FunctionCallAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(FunctionCall)
|
||
|
|
||
|
ExpressionAST *arguments;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class FunctionDefinitionAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(FunctionDefinition)
|
||
|
|
||
|
const ListNode<uint> *storage_specifiers;
|
||
|
const ListNode<uint> *function_specifiers;
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
DeclaratorAST *declarator;
|
||
|
StatementAST *function_body;
|
||
|
WinDeclSpecAST *win_decl_specifiers;
|
||
|
CtorInitializerAST *constructor_initializers;
|
||
|
|
||
|
// support for = default or = deleted functions
|
||
|
enum DefaultDeleted {
|
||
|
NotDefaultOrDeleted,
|
||
|
Default,
|
||
|
Deleted
|
||
|
};
|
||
|
DefaultDeleted defaultDeleted;
|
||
|
};
|
||
|
|
||
|
class ForStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ForStatement)
|
||
|
|
||
|
// either init_statement == 0 or range_declaration == 0
|
||
|
|
||
|
// c-style for
|
||
|
StatementAST *init_statement;
|
||
|
ConditionAST *condition;
|
||
|
|
||
|
// range-based for
|
||
|
ForRangeDeclarationAst *range_declaration;
|
||
|
|
||
|
// shared between both for
|
||
|
ExpressionAST *expression;
|
||
|
|
||
|
// body
|
||
|
StatementAST *statement;
|
||
|
};
|
||
|
|
||
|
class ForRangeDeclarationAst : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ForRangeDeclaration)
|
||
|
|
||
|
const ListNode<uint> *storage_specifiers;
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
DeclaratorAST *declarator;
|
||
|
};
|
||
|
|
||
|
class IfStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(IfStatement)
|
||
|
|
||
|
ConditionAST *condition;
|
||
|
StatementAST *statement;
|
||
|
StatementAST *else_statement;
|
||
|
};
|
||
|
|
||
|
class IncrDecrExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(IncrDecrExpression)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
};
|
||
|
|
||
|
class InitDeclaratorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(InitDeclarator)
|
||
|
|
||
|
DeclaratorAST *declarator;
|
||
|
InitializerAST *initializer;
|
||
|
};
|
||
|
|
||
|
class InitializerAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Initializer)
|
||
|
|
||
|
InitializerClauseAST *initializer_clause;
|
||
|
// expression list or braced init list
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class InitializerListAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_AST_NODE(InitializerList)
|
||
|
|
||
|
const ListNode<InitializerClauseAST*> *clauses;
|
||
|
bool isVariadic : 1;
|
||
|
};
|
||
|
|
||
|
class BracedInitListAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
DECLARE_AST_NODE(BracedInitList)
|
||
|
|
||
|
InitializerListAST *list;
|
||
|
};
|
||
|
|
||
|
|
||
|
class InitializerClauseAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(InitializerClause)
|
||
|
|
||
|
// assignment expression or braced-init-list
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class LabeledStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LabeledStatement)
|
||
|
|
||
|
uint label;
|
||
|
//The constant label expression
|
||
|
ExpressionAST *expression;
|
||
|
StatementAST* statement;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* lambda-expression from the spec
|
||
|
*
|
||
|
* for optimization purposes we also include
|
||
|
* lambda-introducer, lambda-capture, capture-default
|
||
|
* and capture-list in here
|
||
|
*/
|
||
|
class LambdaExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LambdaExpression)
|
||
|
|
||
|
// '&' or '=' or neither
|
||
|
uint default_capture;
|
||
|
const ListNode<LambdaCaptureAST*> *capture_list;
|
||
|
|
||
|
LambdaDeclaratorAST *declarator;
|
||
|
StatementAST *compound;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* in the spec this is called just 'capture'.
|
||
|
* We wrapped lambda-capture in LambdaExpressionAST
|
||
|
*/
|
||
|
class LambdaCaptureAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LambdaCapture)
|
||
|
|
||
|
NameAST* identifier;
|
||
|
|
||
|
bool isThis : 1;
|
||
|
bool isRef : 1;
|
||
|
bool isVariadic : 1;
|
||
|
};
|
||
|
|
||
|
class LambdaDeclaratorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LambdaDeclarator)
|
||
|
|
||
|
ParameterDeclarationClauseAST *parameter_declaration_clause;
|
||
|
///TODO: attribute-specifier
|
||
|
bool isMutable : 1;
|
||
|
ExceptionSpecificationAST *exception_spec;
|
||
|
TrailingReturnTypeAST *trailing_return_type;
|
||
|
};
|
||
|
|
||
|
class LinkageBodyAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LinkageBody)
|
||
|
|
||
|
const ListNode<DeclarationAST*> *declarations;
|
||
|
};
|
||
|
|
||
|
class LinkageSpecificationAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(LinkageSpecification)
|
||
|
|
||
|
uint extern_type;
|
||
|
LinkageBodyAST *linkage_body;
|
||
|
DeclarationAST *declaration;
|
||
|
};
|
||
|
|
||
|
class MemInitializerAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(MemInitializer)
|
||
|
|
||
|
NameAST *initializer_id;
|
||
|
ExpressionAST *expression;
|
||
|
// : foo(args)...
|
||
|
bool initializerIsVariadic : 1;
|
||
|
// : foo(args...)
|
||
|
bool expressionIsVariadic : 1;;
|
||
|
};
|
||
|
|
||
|
class NameAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Name)
|
||
|
|
||
|
bool global;
|
||
|
const ListNode<UnqualifiedNameAST*> *qualified_names;
|
||
|
UnqualifiedNameAST *unqualified_name;
|
||
|
};
|
||
|
|
||
|
class NamespaceAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Namespace)
|
||
|
|
||
|
LinkageBodyAST *linkage_body;
|
||
|
uint namespace_name;
|
||
|
bool inlined : 1;
|
||
|
};
|
||
|
|
||
|
class NamespaceAliasDefinitionAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(NamespaceAliasDefinition)
|
||
|
|
||
|
uint namespace_name;
|
||
|
NameAST *alias_name;
|
||
|
};
|
||
|
|
||
|
class NewDeclaratorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(NewDeclarator)
|
||
|
|
||
|
PtrOperatorAST *ptr_op;
|
||
|
NewDeclaratorAST *sub_declarator;
|
||
|
const ListNode<ExpressionAST*> *expressions;
|
||
|
};
|
||
|
|
||
|
class NewExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(NewExpression)
|
||
|
|
||
|
uint scope_token;
|
||
|
uint new_token;
|
||
|
ExpressionAST *expression;
|
||
|
TypeIdAST *type_id;
|
||
|
NewTypeIdAST *new_type_id;
|
||
|
NewInitializerAST *new_initializer;
|
||
|
};
|
||
|
|
||
|
class NewInitializerAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(NewInitializer)
|
||
|
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class NewTypeIdAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(NewTypeId)
|
||
|
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
NewInitializerAST *new_initializer;
|
||
|
NewDeclaratorAST *new_declarator;
|
||
|
};
|
||
|
|
||
|
class OperatorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Operator)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
uint open;
|
||
|
uint close;
|
||
|
};
|
||
|
|
||
|
class OperatorFunctionIdAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(OperatorFunctionId)
|
||
|
|
||
|
OperatorAST *op;
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
const ListNode<PtrOperatorAST*> *ptr_ops;
|
||
|
};
|
||
|
|
||
|
class ParameterDeclarationAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ParameterDeclaration)
|
||
|
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
DeclaratorAST *declarator;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class ParameterDeclarationClauseAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ParameterDeclarationClause)
|
||
|
|
||
|
const ListNode<ParameterDeclarationAST*> *parameter_declarations;
|
||
|
uint ellipsis;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A post-fix expression is an expression that consists of one primary expression and multiple sub-expressions that are evaluated from
|
||
|
* left to right, each sub-expression based on the previous expression.
|
||
|
*
|
||
|
*
|
||
|
* Examples:
|
||
|
* "a->b" : "a" is the primary expression, "->b" is a sub-expression
|
||
|
* "a->b(5,3)" : "a" is the primary expression, "->b" is a sub-expression, and "(5,3)" is a sub-expression
|
||
|
**/
|
||
|
class PostfixExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(PostfixExpression)
|
||
|
|
||
|
// Eventually the type-specifier of a constructed type, eg. "MyClass(expression)"
|
||
|
// If this is nonzero, then expression is most probably zero.
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
ExpressionAST *expression;
|
||
|
const ListNode<ExpressionAST*> *sub_expressions;
|
||
|
};
|
||
|
|
||
|
class PrimaryExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(PrimaryExpression)
|
||
|
|
||
|
union {
|
||
|
StringLiteralAST *literal;
|
||
|
StatementAST *expression_statement;
|
||
|
ExpressionAST *sub_expression;
|
||
|
NameAST *name;
|
||
|
uint token;
|
||
|
};
|
||
|
enum Type {
|
||
|
Literal,
|
||
|
Token,
|
||
|
Statement,
|
||
|
SubExpression,
|
||
|
Name
|
||
|
};
|
||
|
Type type;
|
||
|
};
|
||
|
|
||
|
class PtrOperatorAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(PtrOperator)
|
||
|
|
||
|
const ListNode<uint> *cv;
|
||
|
uint op; //Index of the token that describes the operator. Is zero when mem_ptr is non-zero.
|
||
|
PtrToMemberAST *mem_ptr;
|
||
|
};
|
||
|
|
||
|
class PtrToMemberAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(PtrToMember)
|
||
|
|
||
|
TypeSpecifierAST *class_type;
|
||
|
};
|
||
|
|
||
|
class JumpStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(JumpStatement)
|
||
|
|
||
|
// index of operator token which describes the jump, one of
|
||
|
// 'break', 'continue' or 'goto. Return statements are handled by
|
||
|
// ReturnStatementAST
|
||
|
uint op;
|
||
|
// identifier for 'goto' statements
|
||
|
uint identifier;
|
||
|
};
|
||
|
|
||
|
class ReturnStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ReturnStatement)
|
||
|
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class SimpleDeclarationAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SimpleDeclaration)
|
||
|
|
||
|
const ListNode<uint> *storage_specifiers;
|
||
|
const ListNode<uint> *function_specifiers;
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
const ListNode<InitDeclaratorAST*> *init_declarators;
|
||
|
WinDeclSpecAST *win_decl_specifiers;
|
||
|
};
|
||
|
|
||
|
class SimpleTypeSpecifierAST : public TypeSpecifierAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SimpleTypeSpecifier)
|
||
|
|
||
|
const ListNode<uint> *integrals;
|
||
|
TypeIdAST *type_id;
|
||
|
NameAST *name;
|
||
|
// expression for typeof or decltype
|
||
|
ExpressionAST *expression;
|
||
|
bool isTypeof : 1;
|
||
|
bool isDecltype : 1;
|
||
|
};
|
||
|
|
||
|
class SizeofExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SizeofExpression)
|
||
|
|
||
|
uint sizeof_token;
|
||
|
TypeIdAST *type_id;
|
||
|
ExpressionAST *expression;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class StaticAssertAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(StaticAssert)
|
||
|
|
||
|
ExpressionAST *expression;
|
||
|
StringLiteralAST *string;
|
||
|
};
|
||
|
|
||
|
class StringLiteralAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(StringLiteral)
|
||
|
|
||
|
const ListNode<uint> *literals;
|
||
|
};
|
||
|
|
||
|
/// operator []
|
||
|
class SubscriptExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SubscriptExpression)
|
||
|
|
||
|
ExpressionAST *subscript;
|
||
|
};
|
||
|
|
||
|
class SwitchStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(SwitchStatement)
|
||
|
|
||
|
ConditionAST *condition;
|
||
|
StatementAST *statement;
|
||
|
};
|
||
|
|
||
|
class TemplateArgumentAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TemplateArgument)
|
||
|
|
||
|
TypeIdAST *type_id;
|
||
|
ExpressionAST *expression;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class TemplateDeclarationAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TemplateDeclaration)
|
||
|
|
||
|
uint exported;
|
||
|
const ListNode<TemplateParameterAST*> *template_parameters;
|
||
|
DeclarationAST* declaration;
|
||
|
};
|
||
|
|
||
|
class TemplateParameterAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TemplateParameter)
|
||
|
|
||
|
TypeParameterAST *type_parameter; //This is used if this is a template-parameter like "class A"
|
||
|
ParameterDeclarationAST *parameter_declaration; //This is used if this is a template-parameter like "int a"
|
||
|
};
|
||
|
|
||
|
class ThrowExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(ThrowExpression)
|
||
|
|
||
|
uint throw_token;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class TrailingReturnTypeAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TrailingReturnType)
|
||
|
|
||
|
const ListNode<TypeSpecifierAST*> *type_specifier;
|
||
|
// TODO: attribute-specifier-seq
|
||
|
DeclaratorAST* abstractDeclarator;
|
||
|
};
|
||
|
|
||
|
class TranslationUnitAST : public AST, public CommentAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TranslationUnit)
|
||
|
|
||
|
const ListNode<DeclarationAST*> *declarations;
|
||
|
|
||
|
///true if either a '}' was missing at the end, or there was a '}' too much.
|
||
|
///This indicates a temporary state where the user is typing, and the document is completely invalid.
|
||
|
bool hadMissingCompoundTokens;
|
||
|
|
||
|
// Note: non AST related, saves parsing session...
|
||
|
ParseSession* session;
|
||
|
};
|
||
|
|
||
|
class TryBlockStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TryBlockStatement)
|
||
|
|
||
|
StatementAST* try_block;
|
||
|
const ListNode<CatchStatementAST*> *catch_blocks;
|
||
|
};
|
||
|
|
||
|
class CatchStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(CatchStatement)
|
||
|
|
||
|
ConditionAST* condition;
|
||
|
StatementAST* statement;
|
||
|
};
|
||
|
|
||
|
class TypeIdAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TypeId)
|
||
|
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
DeclaratorAST *declarator;
|
||
|
};
|
||
|
|
||
|
/// typeid(...)
|
||
|
class TypeIDOperatorAST : public PostfixExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TypeIDOperator)
|
||
|
|
||
|
TypeIdAST* typeId;
|
||
|
};
|
||
|
|
||
|
///"typename"
|
||
|
class TypeIdentificationAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TypeIdentification)
|
||
|
|
||
|
uint typename_token;
|
||
|
NameAST *name;
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class TypeParameterAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(TypeParameter)
|
||
|
|
||
|
NameAST *name;
|
||
|
TypeIdAST *type_id;
|
||
|
const ListNode<TemplateParameterAST*> *template_parameters;
|
||
|
NameAST *template_name;
|
||
|
uint type;
|
||
|
bool isVariadic;
|
||
|
};
|
||
|
|
||
|
class TypedefAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Typedef)
|
||
|
|
||
|
TypeSpecifierAST *type_specifier;
|
||
|
const ListNode<InitDeclaratorAST*> *init_declarators;
|
||
|
};
|
||
|
|
||
|
class UnaryExpressionAST : public ExpressionAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(UnaryExpression)
|
||
|
|
||
|
uint op; //Index of the token that describes the operator
|
||
|
ExpressionAST *expression;
|
||
|
};
|
||
|
|
||
|
class UnqualifiedNameAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(UnqualifiedName)
|
||
|
|
||
|
bool tilde : 1;
|
||
|
bool ellipsis : 1;
|
||
|
uint id;
|
||
|
OperatorFunctionIdAST *operator_id;
|
||
|
const ListNode<TemplateArgumentAST*> *template_arguments;
|
||
|
};
|
||
|
|
||
|
class UsingAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(Using)
|
||
|
|
||
|
uint type_name;
|
||
|
NameAST *name;
|
||
|
};
|
||
|
|
||
|
class UsingDirectiveAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(UsingDirective)
|
||
|
|
||
|
NameAST *name;
|
||
|
};
|
||
|
|
||
|
class AliasDeclarationAST : public DeclarationAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(AliasDeclaration)
|
||
|
|
||
|
NameAST *name;
|
||
|
TypeIdAST *type_id;
|
||
|
};
|
||
|
|
||
|
class WhileStatementAST : public StatementAST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(WhileStatement)
|
||
|
|
||
|
ConditionAST *condition;
|
||
|
StatementAST *statement;
|
||
|
};
|
||
|
|
||
|
class WinDeclSpecAST : public AST
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_AST_NODE(WinDeclSpec)
|
||
|
|
||
|
uint specifier;
|
||
|
uint modifier;
|
||
|
};
|
||
|
|
||
|
|
||
|
template <class _Tp>
|
||
|
_Tp ast_cast(AST *item)
|
||
|
{
|
||
|
if (item && static_cast<_Tp>(0)->__node_kind == item->kind)
|
||
|
return static_cast<_Tp>(item);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
#endif // AST_H
|
||
|
|