/****************************************************************************
**
** Copyright (C) 2001-2004 Roberto Raggi
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (qt-info@nokia.com)
**
** This file is part of the qt3to4 porting application of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
** This file may be used under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation and
** appearing in the file LICENSE.LGPL included in the packaging of this
** file. Please review the following information to ensure the GNU Lesser
** General Public License version 2.1 requirements will be met:
** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU General
** Public License version 3.0 as published by the Free Software Foundation
** and appearing in the file LICENSE.GPL included in the packaging of this
** file. Please review the following information to ensure the GNU General
** Public License version 3.0 requirements will be met:
** http://www.gnu.org/copyleft/gpl.html.
**
** Other Usage
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
**
**
**
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef AST_H
#define AST_H

#include "smallobject.h"
#include "list.h"

QT_BEGIN_NAMESPACE

class AST;
class NameAST;
class TypeIdAST;
class TypeSpecifierAST;
class DeclaratorAST;

class Symbol;
class Scope;

enum NodeType
{
    NodeType_Generic = 0,

    NodeType_TemplateArgumentList = 1000,
    NodeType_ClassOrNamespaceName,
    NodeType_Name,
    NodeType_Declaration,
    NodeType_TypeSpecifier,
    NodeType_BaseSpecifier,
    NodeType_BaseClause,
    NodeType_ClassSpecifier,
    NodeType_Enumerator,
    NodeType_EnumSpecifier,
    NodeType_ElaboratedTypeSpecifier,
    NodeType_LinkageBody,
    NodeType_LinkageSpecification,
    NodeType_Namespace,
    NodeType_NamespaceAlias,
    NodeType_Using,
    NodeType_UsingDirective,
    NodeType_InitDeclaratorList,
    NodeType_Typedef,
    NodeType_Declarator,
    NodeType_InitDeclarator,
    NodeType_TemplateDeclaration,
    NodeType_SimpleDeclaration,
    NodeType_Statement,
    NodeType_StatementList,
    NodeType_IfStatement,
    NodeType_WhileStatement,
    NodeType_DoStatement,
    NodeType_ForStatement,
    NodeType_SwitchStatement,
    NodeType_DeclarationStatement,
    NodeType_LabeledStatement,
    NodeType_ReturnStatement,
    NodeType_TranslationUnit,
    NodeType_FunctionDefinition,
    NodeType_ExpressionStatement,
    NodeType_ParameterDeclaration,
    NodeType_ParameterDeclarationList,
    NodeType_ParameterDeclarationClause,
    NodeType_AccessDeclaration,
    NodeType_TypeParameter,
    NodeType_TemplateParameter,
    NodeType_TemplateParameterList,
    NodeType_Condition,

    NodeType_TypeId,

    NodeType_Expression = 2000,
    NodeType_BinaryExpression,
    NodeType_PrimaryExpression,

//
// postfix expression
//
    NodeType_PostfixExpression,
    NodeType_Subscripting,
    NodeType_FunctionCall,
    NodeType_ExplicitTypeConversion,
    NodeType_PseudoConstructorCall,
    NodeType_ClassMemberAccess,
    NodeType_IncrDecr,
    NodeType_CppCastExpression,
    NodeType_TypeIdentification,

    NodeType_UnaryExpression,
    NodeType_NewExpression,
    NodeType_NewTypeId,
    NodeType_NewDeclarator,
    NodeType_NewInitializer,
    NodeType_DeleteExpression,
    NodeType_CastExpression,
    NodeType_ConditionalExpression,
    NodeType_ThrowExpression,

    NodeType_Custom = 3000
};


template <typename T>
inline int length(List<T> *e)
{
    return e ? e->size() : 0;
}

class AST
{
public:
    enum { Type=NodeType_Generic };

    pool *_pool;

    static int N;

public:
    AST(int startToken=0, int count=1);
    virtual ~AST() { --N; }

    inline int startToken() const
    { return m_startToken; }

    inline int endToken() const
    { return m_endToken; }

    inline void setPosition(int startToken, int endToken)
    {
        m_startToken = startToken;
        m_endToken = endToken;
    }

    inline int nodeType() const
    { return m_nodeType; }

    inline void setNodeType(int nodeType)
    { m_nodeType = nodeType; }

    inline AST *parent() const
    { return m_parent; }

    void setParent(AST *parent);

    inline List<AST *> *children() const
    { return m_children; }

    void appendChild(AST *child);
    void removeChild(AST *child);

// ### move
    inline Scope *scope() const
    {
        if (m_scope)
            return m_scope;

        return m_parent ? m_parent->scope() : 0;
    }

    inline void setScope(Scope *scope)
    { m_scope = scope; }

private:
    Scope *m_scope;
    int m_nodeType;
    int m_startToken;
    int m_endToken;
    AST *m_parent;
    List<AST *> *m_children;

private:
    AST(const AST &source);
    void operator = (const AST &source);
};

class AbstractExpressionAST: public AST
{
public:
    enum { Type = NodeType_Expression };

    AbstractExpressionAST();

    inline Symbol *symbol() const
    { return m_symbol; }

    inline void setSymbol(Symbol *symbol)
    { m_symbol = symbol; }

private:
    Symbol *m_symbol;
};

// ### remove me
template <int kind, class Base = AbstractExpressionAST>
class ExpressionAST: public Base
{
public:
    enum { Type = kind };

public:
    inline ExpressionAST() {}

private:
    ExpressionAST(const ExpressionAST &source);
    void operator = (const ExpressionAST &source);
};

class BinaryExpressionAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_BinaryExpression };

public:
    BinaryExpressionAST();

    inline AST *op() const
    { return m_op; }

    inline AbstractExpressionAST *leftExpression() const
    { return m_left; }

    inline AbstractExpressionAST *rightExpression() const
    { return m_right; }

    void setOp(AST *op);
    void setLeftExpression(AbstractExpressionAST *left);
    void setRightExpression(AbstractExpressionAST *right);

private:
    AST *m_op;
    AbstractExpressionAST *m_left;
    AbstractExpressionAST *m_right;

private:
    BinaryExpressionAST(const BinaryExpressionAST &source);
    void operator = (const BinaryExpressionAST &source);
};

class ConditionalExpressionAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_ConditionalExpression };

public:
    ConditionalExpressionAST();

    inline AbstractExpressionAST *condition() const
    { return m_condition; }

    inline AbstractExpressionAST *leftExpression() const
    { return m_left; }

    inline AbstractExpressionAST *rightExpression() const
    { return m_right; }

    void setCondition(AbstractExpressionAST *condition);
    void setLeftExpression(AbstractExpressionAST *left);
    void setRightExpression(AbstractExpressionAST *right);

private:
    AbstractExpressionAST *m_condition;
    AbstractExpressionAST *m_left;
    AbstractExpressionAST *m_right;

private:
    ConditionalExpressionAST(const ConditionalExpressionAST& source);
    void operator = (const ConditionalExpressionAST &source);
};


//
// postfix expression
//

class SubscriptingAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_Subscripting };

public:
    SubscriptingAST();

    inline AbstractExpressionAST *expression() const
    { return m_expression; }

    inline AbstractExpressionAST *subscript() const
    { return m_subscript; }

    void setExpression(AbstractExpressionAST *expression);
    void setSubscript(AbstractExpressionAST *subscript);

private:
    AbstractExpressionAST *m_expression;
    AbstractExpressionAST *m_subscript;

private:
    SubscriptingAST(const SubscriptingAST &source);
    void operator = (const SubscriptingAST &source);
};

class FunctionCallAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_FunctionCall };

public:
    FunctionCallAST();

    inline AbstractExpressionAST *expression() const
    { return m_expression; }

    inline AbstractExpressionAST *arguments() const
    { return m_arguments; }

    void setExpression(AbstractExpressionAST *expression);
    void setArguments(AbstractExpressionAST *arguments);

private:
    AbstractExpressionAST *m_expression;
    AbstractExpressionAST *m_arguments;

private:
    FunctionCallAST(const FunctionCallAST &source);
    void operator = (const FunctionCallAST &source);
};

class ExplicitTypeConversionAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_ExplicitTypeConversion };

public:
    ExplicitTypeConversionAST();

private:
    ExplicitTypeConversionAST(const ExplicitTypeConversionAST &source);
    void operator = (const ExplicitTypeConversionAST &source);
};

class PseudoDestructorCallAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_PseudoConstructorCall };

public:
    PseudoDestructorCallAST();

private:
    PseudoDestructorCallAST(const PseudoDestructorCallAST &source);
    void operator = (const PseudoDestructorCallAST &source);
};

class ClassMemberAccessAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_ClassMemberAccess };

public:
    ClassMemberAccessAST();

    inline AST *op() const
    { return m_op; }

    inline AbstractExpressionAST *expression() const
    { return m_expression; }

    inline NameAST *name() const
    { return m_name; }

    void setOp(AST *op);
    void setExpression(AbstractExpressionAST *expression);
    void setName(NameAST *name);

private:
    AST *m_op;
    AbstractExpressionAST *m_expression;
    AST *m_templ;
    NameAST *m_name;

private:
    ClassMemberAccessAST(const ClassMemberAccessAST &source);
    void operator = (const ClassMemberAccessAST &source);
};

class IncrDecrAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_IncrDecr };

public:
    IncrDecrAST();

    inline AST *op() const
    { return m_op; }

    inline AbstractExpressionAST *expression() const
    { return m_expression; }

    void setOp(AST *op);
    void setExpression(AbstractExpressionAST *expression);

private:
    AST *m_op;
    AbstractExpressionAST *m_expression;

private:
    IncrDecrAST(const IncrDecrAST &source);
    void operator = (const IncrDecrAST &source);
};

class CppCastExpressionAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_CppCastExpression };

public:
    CppCastExpressionAST();

    inline AST *castOp() const
    { return m_castOp; }

    inline AST *typeId() const
    { return m_typeId; }

    inline AbstractExpressionAST *expression() const
    { return m_expression; }

    void setCastOp(AST *castOp);
    void setTypeId(AST *typeId);
    void setExpression(AbstractExpressionAST *expression);

private:
    AST *m_castOp;
    AST *m_typeId;
    AbstractExpressionAST *m_expression;

private:
    CppCastExpressionAST(const CppCastExpressionAST &source);
    void operator = (const CppCastExpressionAST &source);
};

class TypeIdentificationAST: public AbstractExpressionAST
{
public:
    enum { Type = NodeType_TypeIdentification };

public:
    TypeIdentificationAST();

private:
    TypeIdentificationAST(const TypeIdentificationAST &source);
    void operator = (const TypeIdentificationAST &source);
};

class TypeIdAST: public AST
{
public:
    enum { Type = NodeType_TypeId };

public:
    TypeIdAST();

    inline TypeSpecifierAST *typeSpecifier() const
    { return m_typeSpecifier; }

    inline DeclaratorAST *declarator() const
    { return m_declarator; }

    void setTypeSpecifier(TypeSpecifierAST *typeSpecifier);
    void setDeclarator(DeclaratorAST *declarator);

private:
    TypeSpecifierAST *m_typeSpecifier;
    DeclaratorAST *m_declarator;

private:
    TypeIdAST(const TypeIdAST &source);
    void operator = (const TypeIdAST &source);
};

class StatementAST: public AST
{
public:
    enum { Type = NodeType_Statement };
};

class TemplateArgumentListAST: public AST
{
public:
    enum { Type = NodeType_TemplateArgumentList };

public:
    TemplateArgumentListAST();

    void addArgument(AST *arg);
    inline List<AST *> *argumentList() const { return m_argumentList; }

private:
    List<AST *> *m_argumentList;

private:
    TemplateArgumentListAST(const TemplateArgumentListAST &source);
    void operator = (const TemplateArgumentListAST &source);
};

class ClassOrNamespaceNameAST: public AST
{
public:
    enum { Type = NodeType_ClassOrNamespaceName };

public:
    ClassOrNamespaceNameAST();

    inline AST *name() const { return m_name; }
    void setName(AST *name);

    inline TemplateArgumentListAST *templateArgumentList() const { return m_templateArgumentList; }
    void setTemplateArgumentList(TemplateArgumentListAST *templateArgumentList);

private:
    AST* m_name;
    TemplateArgumentListAST* m_templateArgumentList;

private:
    ClassOrNamespaceNameAST(const ClassOrNamespaceNameAST &source);
    void operator = (const ClassOrNamespaceNameAST &source);
};

class NameAST: public AST
{
public:
    enum { Type = NodeType_Name };

public:
    NameAST();

    inline bool isGlobal() const { return m_global; }
    void setGlobal(bool b);

    void addClassOrNamespaceName(ClassOrNamespaceNameAST *classOrNamespaceName);
    inline List<ClassOrNamespaceNameAST *> *classOrNamespaceNameList() const { return m_classOrNamespaceNameList; }

    inline ClassOrNamespaceNameAST *unqualifiedName() const { return m_unqualifiedName; }
    void setUnqualifiedName(ClassOrNamespaceNameAST *unqualifiedName);

private:
    bool m_global;
    ClassOrNamespaceNameAST* m_unqualifiedName;
    List<ClassOrNamespaceNameAST *> *m_classOrNamespaceNameList;

private:
    NameAST(const NameAST &source);
    void operator = (const NameAST &source);
};

class TypeParameterAST: public AST
{
public:
    enum { Type = NodeType_TypeParameter };

public:
    TypeParameterAST();

    inline AST *kind() const { return m_kind; }
    void setKind(AST *kind);

    inline class TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; }
    void setTemplateParameterList(class TemplateParameterListAST *templateParameterList);

    inline NameAST *name() const { return m_name; }
    void setName(NameAST *name);

    inline AST *typeId() const { return m_typeId; }
    void setTypeId(AST *typeId);

private:
    AST* m_kind;
    class TemplateParameterListAST *m_templateParameterList;
    NameAST* m_name;
    AST* m_typeId;

private:
    TypeParameterAST(const TypeParameterAST &source);
    void operator = (const TypeParameterAST &source);
};

class DeclarationAST: public AST
{
public:
    enum { Type = NodeType_Declaration };

public:
    DeclarationAST();

private:
    DeclarationAST(const DeclarationAST &source);
    void operator = (const DeclarationAST &source);
};

class AccessDeclarationAST: public DeclarationAST
{
public:
    enum { Type = NodeType_AccessDeclaration };

public:
    AccessDeclarationAST();

    inline List<AST *> *accessList() const { return m_accessList; }
    void addAccess(AST *access);

private:
    List<AST *> *m_accessList;

private:
    AccessDeclarationAST(const AccessDeclarationAST &source);
    void operator = (const AccessDeclarationAST &source);
};

class TypeSpecifierAST: public AST
{
public:
    enum { Type = NodeType_TypeSpecifier };

public:
    TypeSpecifierAST();

    inline virtual NameAST *name() const { return m_name; }
    virtual void setName(NameAST *name);

    inline AST *cvQualify() const { return m_cvQualify; }
    void setCvQualify(AST *cvQualify);

    inline AST *cv2Qualify() const { return m_cv2Qualify; }
    void setCv2Qualify(AST *cv2Qualify);

private:
    NameAST* m_name;
    AST* m_cvQualify;
    AST* m_cv2Qualify;

private:
    TypeSpecifierAST(const TypeSpecifierAST &source);
    void operator = (const TypeSpecifierAST &source);
};

class BaseSpecifierAST: public AST
{
public:
    enum { Type = NodeType_BaseSpecifier };

public:
    BaseSpecifierAST();

    inline AST *isVirtual() const { return m_isVirtual; }
    void setIsVirtual(AST *isVirtual);

    inline AST *access() const { return m_access; }
    void setAccess(AST *access);

    inline NameAST *name() const { return m_name; }
    void setName(NameAST *name);

private:
    AST* m_isVirtual;
    AST* m_access;
    NameAST* m_name;

private:
    BaseSpecifierAST(const BaseSpecifierAST &source);
    void operator = (const BaseSpecifierAST &source);
};

class BaseClauseAST: public AST
{
public:
    enum { Type = NodeType_BaseClause };

public:
    BaseClauseAST();

    void addBaseSpecifier(BaseSpecifierAST *baseSpecifier);
    inline List<BaseSpecifierAST *> *baseSpecifierList() const { return m_baseSpecifierList; }

private:
    List<BaseSpecifierAST *> *m_baseSpecifierList;

private:
    BaseClauseAST(const BaseClauseAST &source);
    void operator = (const BaseClauseAST &source);
};

class ClassSpecifierAST: public TypeSpecifierAST
{
public:
    enum { Type = NodeType_ClassSpecifier };

public:
    ClassSpecifierAST();

    inline AST *winDeclSpec() const { return m_winDeclSpec; }
    void setWinDeclSpec(AST *winDeclSpec);

    inline AST *classKey() const { return m_classKey; }
    void setClassKey(AST *classKey);

    inline BaseClauseAST *baseClause() const { return m_baseClause; }
    void setBaseClause(BaseClauseAST *baseClause);

    inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }
    void addDeclaration(DeclarationAST *declaration);

private:
    AST* m_winDeclSpec;
    AST* m_classKey;
    BaseClauseAST* m_baseClause;
    List<DeclarationAST *> *m_declarationList;

private:
    ClassSpecifierAST(const ClassSpecifierAST &source);
    void operator = (const ClassSpecifierAST &source);
};

class EnumeratorAST: public AST
{
public:
    enum { Type = NodeType_Enumerator };

public:
    EnumeratorAST();

    inline AST *id() const { return m_id; }
    void setId(AST *id);

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expr);

private:
    AST* m_id;
    AbstractExpressionAST* m_expression;

private:
    EnumeratorAST(const EnumeratorAST &source);
    void operator = (const EnumeratorAST &source);
};

class EnumSpecifierAST: public TypeSpecifierAST
{
public:
    enum { Type = NodeType_EnumSpecifier };

public:
    EnumSpecifierAST();

    void addEnumerator(EnumeratorAST *enumerator);
    inline List<EnumeratorAST *> *enumeratorList() const { return m_enumeratorList; }

private:
    List<EnumeratorAST *> *m_enumeratorList;

private:
    EnumSpecifierAST(const EnumSpecifierAST &source);
    void operator = (const EnumSpecifierAST &source);
};

class ElaboratedTypeSpecifierAST: public TypeSpecifierAST
{
public:
    enum { Type = NodeType_ElaboratedTypeSpecifier };

public:
    ElaboratedTypeSpecifierAST();

    inline AST *kind() const { return m_kind; }
    void setKind(AST *kind);

private:
    AST* m_kind;

private:
    ElaboratedTypeSpecifierAST(const ElaboratedTypeSpecifierAST &source);
    void operator = (const ElaboratedTypeSpecifierAST &source);
};


class LinkageBodyAST: public AST
{
public:
    enum { Type = NodeType_LinkageBody };

public:
    LinkageBodyAST();

    void addDeclaration(DeclarationAST *ast);
    inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }

private:
    List<DeclarationAST *> *m_declarationList;

private:
    LinkageBodyAST(const LinkageBodyAST &source);
    void operator = (const LinkageBodyAST &source);
};

class LinkageSpecificationAST: public DeclarationAST
{
public:
    enum { Type = NodeType_LinkageSpecification };

public:
    LinkageSpecificationAST();

    inline AST *externType() const { return m_externType; }
    void setExternType(AST *externType);

    inline LinkageBodyAST *linkageBody() const { return m_linkageBody; }
    void setLinkageBody(LinkageBodyAST *linkageBody);

    inline DeclarationAST *declaration() const { return m_declaration; }
    void setDeclaration(DeclarationAST *decl);

private:
    AST* m_externType;
    LinkageBodyAST* m_linkageBody;
    DeclarationAST* m_declaration;

private:
    LinkageSpecificationAST(const LinkageSpecificationAST &source);
    void operator = (const LinkageSpecificationAST &source);
};

class NamespaceAST: public DeclarationAST
{
public:
    enum { Type = NodeType_Namespace };

public:
    NamespaceAST();

    inline AST *namespaceName() const { return m_namespaceName; }
    void setNamespaceName(AST *namespaceName);

    inline LinkageBodyAST *linkageBody() const { return m_linkageBody; }
    void setLinkageBody(LinkageBodyAST *linkageBody);

private:
    AST* m_namespaceName;
    LinkageBodyAST* m_linkageBody;

private:
    NamespaceAST(const NamespaceAST &source);
    void operator = (const NamespaceAST &source);
};

class NamespaceAliasAST: public DeclarationAST
{
public:
    enum { Type = NodeType_NamespaceAlias };

public:
    NamespaceAliasAST();

    inline AST *namespaceName() const { return m_namespaceName; }
    void setNamespaceName(AST *name);

    inline NameAST *aliasName() const { return m_aliasName; }
    void setAliasName(NameAST *name);

private:
    AST* m_namespaceName;
    NameAST* m_aliasName;

private:
    NamespaceAliasAST(const NamespaceAliasAST &source);
    void operator = (const NamespaceAliasAST &source);
};

class UsingAST: public DeclarationAST
{
public:
    enum { Type = NodeType_Using };

public:
    UsingAST();

    inline AST *typeName() const { return m_typeName; }
    void setTypeName(AST *typeName);

    inline NameAST *name() const { return m_name; }
    void setName(NameAST *name);

private:
    AST* m_typeName;
    NameAST* m_name;

private:
    UsingAST(const UsingAST &source);
    void operator = (const UsingAST &source);
};

class UsingDirectiveAST: public DeclarationAST
{
public:
    enum { Type = NodeType_UsingDirective };

public:
    UsingDirectiveAST();

    inline NameAST *name() const { return m_name; }
    void setName(NameAST *name);

private:
    NameAST* m_name;

private:
    UsingDirectiveAST(const UsingDirectiveAST &source);
    void operator = (const UsingDirectiveAST &source);
};

class DeclaratorAST: public AST
{
public:
    enum { Type = NodeType_Declarator };

public:
    DeclaratorAST();

    inline List<AST *> *ptrOpList() const { return m_ptrOpList; }
    void addPtrOp(AST *ptrOp);

    inline DeclaratorAST *subDeclarator() const { return m_subDeclarator; }
    void setSubDeclarator(DeclaratorAST *subDeclarator);

    inline NameAST *declaratorId() const { return m_declaratorId; }
    void setDeclaratorId(NameAST *declaratorId);

    inline AST *bitfieldInitialization() const { return m_bitfieldInitialization; }
    void setBitfieldInitialization(AST *bitfieldInitialization);

    inline List<AST *> *arrayDimensionList() const { return m_arrayDimensionList; }
    void addArrayDimension(AST *arrayDimension);

    inline class ParameterDeclarationClauseAST *parameterDeclarationClause() const { return m_parameterDeclarationClause; }
    void setParameterDeclarationClause(class ParameterDeclarationClauseAST  *parameterDeclarationClause);

    // ### replace 'constant' with cvQualify
    inline AST *constant() const { return m_constant; }
    void setConstant(AST *constant);

    inline AST *exceptionSpecification() const { return m_exceptionSpecification; }
    void setExceptionSpecification(AST *exceptionSpecification);

private:
    List<AST *> *m_ptrOpList;
    DeclaratorAST * m_subDeclarator;
    NameAST* m_declaratorId;
    AST* m_bitfieldInitialization;
    List<AST *> *m_arrayDimensionList;
    class ParameterDeclarationClauseAST * m_parameterDeclarationClause;
    AST* m_constant;
    AST* m_exceptionSpecification;

private:
    DeclaratorAST(const DeclaratorAST &source);
    void operator = (const DeclaratorAST &source);
};

class ParameterDeclarationAST: public AST
{
public:
    enum { Type = NodeType_ParameterDeclaration };

public:
    ParameterDeclarationAST();

    inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
    void setTypeSpec(TypeSpecifierAST *typeSpec);

    inline DeclaratorAST *declarator() const { return m_declarator; }
    void setDeclarator(DeclaratorAST *declarator);

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);

private:
    TypeSpecifierAST* m_typeSpec;
    DeclaratorAST* m_declarator;
    AbstractExpressionAST* m_expression;

private:
    ParameterDeclarationAST(const ParameterDeclarationAST &source);
    void operator = (const ParameterDeclarationAST &source);
};

class ParameterDeclarationListAST: public AST
{
public:
    enum { Type = NodeType_ParameterDeclarationList };

public:
    ParameterDeclarationListAST();

    inline List<ParameterDeclarationAST *> *parameterList() const { return m_parameterList; }
    void addParameter(ParameterDeclarationAST *parameter);

private:
    List<ParameterDeclarationAST *> *m_parameterList;

private:
    ParameterDeclarationListAST(const ParameterDeclarationListAST &source);
    void operator = (const ParameterDeclarationListAST &source);
};

class ParameterDeclarationClauseAST: public AST
{
public:
    enum { Type = NodeType_ParameterDeclarationClause };

public:
    ParameterDeclarationClauseAST();

    inline ParameterDeclarationListAST *parameterDeclarationList() const { return m_parameterDeclarationList; }
    void setParameterDeclarationList(ParameterDeclarationListAST *parameterDeclarationList);

    inline AST *ellipsis() const { return m_ellipsis; }
    void setEllipsis(AST *ellipsis);

private:
    ParameterDeclarationListAST* m_parameterDeclarationList;
    AST* m_ellipsis;

private:
    ParameterDeclarationClauseAST(const ParameterDeclarationClauseAST &source);
    void operator = (const ParameterDeclarationClauseAST &source);
};


class InitDeclaratorAST: public AST
{
public:
    enum { Type = NodeType_InitDeclarator };

public:
    InitDeclaratorAST();

    inline DeclaratorAST *declarator() const { return m_declarator; }
    void setDeclarator(DeclaratorAST *declarator);

    inline AST *initializer() const { return m_initializer; }
    void setInitializer(AST *initializer);

private:
    DeclaratorAST* m_declarator;
    AST* m_initializer;

private:
    InitDeclaratorAST(const InitDeclaratorAST &source);
    void operator = (const InitDeclaratorAST &source);
};

class InitDeclaratorListAST: public AST
{
public:
    enum { Type = NodeType_InitDeclaratorList };

public:
    InitDeclaratorListAST();

    inline List<InitDeclaratorAST *> *initDeclaratorList() const { return m_initDeclaratorList; }
    void addInitDeclarator(InitDeclaratorAST *decl);

private:
    List<InitDeclaratorAST *> *m_initDeclaratorList;

private:
    InitDeclaratorListAST(const InitDeclaratorListAST &source);
    void operator = (const InitDeclaratorListAST &source);
};

class TypedefAST: public DeclarationAST
{
public:
    enum { Type = NodeType_Typedef };

public:
    TypedefAST();

    inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
    void setTypeSpec(TypeSpecifierAST *typeSpec);

    inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; }
    void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList);

private:
    TypeSpecifierAST* m_typeSpec;
    InitDeclaratorListAST* m_initDeclaratorList;

private:
    void operator = (const TypedefAST &source);
};

class TemplateParameterAST: public AST
{
public:
    enum { Type = NodeType_TemplateParameter };

public:
    TemplateParameterAST();

    inline TypeParameterAST *typeParameter() const { return m_typeParameter; }
    void setTypeParameter(TypeParameterAST *typeParameter);

    inline ParameterDeclarationAST *typeValueParameter() const { return m_typeValueParameter; }
    void setTypeValueParameter(ParameterDeclarationAST *typeValueParameter);

private:
    TypeParameterAST* m_typeParameter;
    ParameterDeclarationAST* m_typeValueParameter;

private:
    TemplateParameterAST(const TemplateParameterAST &source);
    void operator = (const TemplateParameterAST &source);
};

class TemplateParameterListAST: public AST
{
public:
    enum { Type = NodeType_TemplateParameterList };

public:
    TemplateParameterListAST();

    inline List<TemplateParameterAST *> *templateParameterList() const { return m_templateParameterList; }
    void addTemplateParameter(TemplateParameterAST *templateParameter);

private:
    List<TemplateParameterAST *> *m_templateParameterList;

private:
    TemplateParameterListAST(const TemplateParameterListAST &source);
    void operator = (const TemplateParameterListAST &source);
};

class TemplateDeclarationAST: public DeclarationAST
{
public:
    enum { Type = NodeType_TemplateDeclaration };

public:
    TemplateDeclarationAST();

    inline AST *exported() const { return m_exported; }
    void setExported(AST *exported);

    inline TemplateParameterListAST *templateParameterList() const { return m_templateParameterList; }
    void setTemplateParameterList(TemplateParameterListAST *templateParameterList);

    inline DeclarationAST *declaration() const { return m_declaration; }
    void setDeclaration(DeclarationAST *declaration);

private:
    AST* m_exported;
    TemplateParameterListAST* m_templateParameterList;
    DeclarationAST* m_declaration;

private:
    TemplateDeclarationAST(const TemplateDeclarationAST &source);
    void operator = (const TemplateDeclarationAST &source);
};

class SimpleDeclarationAST: public DeclarationAST
{
public:
    enum { Type = NodeType_SimpleDeclaration };

public:
    SimpleDeclarationAST();

    inline AST *functionSpecifier() const { return m_functionSpecifier; }
    void setFunctionSpecifier(AST *functionSpecifier);

    inline AST *storageSpecifier() const { return m_storageSpecifier; }
    void setStorageSpecifier(AST *storageSpecifier);

    inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
    void setTypeSpec(TypeSpecifierAST *typeSpec);

    inline InitDeclaratorListAST *initDeclaratorList() const { return m_initDeclaratorList; }
    void setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList);

    inline AST *winDeclSpec() const { return m_winDeclSpec; }
    void setWinDeclSpec(AST *winDeclSpec);

private:
    AST* m_functionSpecifier;
    AST* m_storageSpecifier;
    TypeSpecifierAST* m_typeSpec;
    InitDeclaratorListAST* m_initDeclaratorList;
    AST* m_winDeclSpec;

private:
    SimpleDeclarationAST(const SimpleDeclarationAST &source);
    void operator = (const SimpleDeclarationAST &source);
};

class ExpressionStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_ExpressionStatement };

public:
    ExpressionStatementAST();

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);

private:
    AbstractExpressionAST* m_expression;

private:
    ExpressionStatementAST(const ExpressionStatementAST &source);
    void operator = (const ExpressionStatementAST &source);
};

class ReturnStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_ReturnStatement };

public:
    ReturnStatementAST();

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);

private:
    AbstractExpressionAST* m_expression;

private:
    ReturnStatementAST(const ReturnStatementAST &source);
    void operator = (const ReturnStatementAST &source);
};


class ConditionAST: public AST
{
public:
    enum { Type = NodeType_Condition };

public:
    ConditionAST();

    inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
    void setTypeSpec(TypeSpecifierAST *typeSpec);

    inline DeclaratorAST *declarator() const { return m_declarator; }
    void setDeclarator(DeclaratorAST *declarator);

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);

private:
    TypeSpecifierAST* m_typeSpec;
    DeclaratorAST* m_declarator;
    AbstractExpressionAST* m_expression;

private:
    ConditionAST(const ConditionAST &source);
    void operator = (const ConditionAST &source);
};

class IfStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_IfStatement };

public:
    IfStatementAST();

    inline ConditionAST *condition() const { return m_condition; }
    void setCondition(ConditionAST *condition);

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

    inline StatementAST *elseStatement() const { return m_elseStatement; }
    void setElseStatement(StatementAST *statement);

private:
    ConditionAST* m_condition;
    StatementAST* m_statement;
    StatementAST* m_elseStatement;

private:
    IfStatementAST(const IfStatementAST &source);
    void operator = (const IfStatementAST &source);
};

class WhileStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_WhileStatement };

public:
    WhileStatementAST();

    inline ConditionAST *condition() const { return m_condition; }
    void setCondition(ConditionAST *condition);

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

private:
    ConditionAST* m_condition;
    StatementAST* m_statement;

private:
    WhileStatementAST(const WhileStatementAST &source);
    void operator = (const WhileStatementAST &source);
};

class DoStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_DoStatement };

public:
    DoStatementAST();

    inline ConditionAST *condition() const { return m_condition; }
    void setCondition(ConditionAST *condition);

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

private:
    ConditionAST* m_condition;
    StatementAST* m_statement;

private:
    DoStatementAST(const DoStatementAST &source);
    void operator = (const DoStatementAST &source);
};

class ForStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_ForStatement };

public:
    ForStatementAST();

    inline StatementAST *initStatement() const { return m_initStatement; }
    void setInitStatement(StatementAST *statement);

    inline ConditionAST *condition() const { return m_condition; }
    void setCondition(ConditionAST *condition);

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

private:
    ConditionAST* m_condition;
    StatementAST* m_initStatement;
    StatementAST* m_statement;
    AbstractExpressionAST* m_expression;

private:
    ForStatementAST(const ForStatementAST &source);
    void operator = (const ForStatementAST &source);
};

class SwitchStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_SwitchStatement };

public:
    SwitchStatementAST();

    inline ConditionAST *condition() const { return m_condition; }
    void setCondition(ConditionAST *condition);

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

private:
    ConditionAST* m_condition;
    StatementAST* m_statement;

private:
    SwitchStatementAST(const SwitchStatementAST &source);
    void operator = (const SwitchStatementAST &source);
};

class StatementListAST: public StatementAST
{
public:
    enum { Type = NodeType_StatementList };

public:
    StatementListAST();

    inline List<StatementAST *> *statementList() const { return m_statementList; }
    void addStatement(StatementAST *statement);

private:
    List<StatementAST *> *m_statementList;

private:
    StatementListAST(const StatementListAST &source);
    void operator = (const StatementListAST &source);
};

class DeclarationStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_DeclarationStatement };

public:
    DeclarationStatementAST();

    inline DeclarationAST *declaration() const { return m_declaration; }
    void setDeclaration(DeclarationAST *declaration);

private:
    DeclarationAST* m_declaration;

private:
    DeclarationStatementAST(const DeclarationStatementAST &source);
    void operator = (const DeclarationStatementAST &source);
};

/*
    LabeledStatementAST:
        case constant-expression : statement
        default : statement (expression is 0)
*/
class LabeledStatementAST: public StatementAST
{
public:
    enum { Type = NodeType_LabeledStatement };
public:
    LabeledStatementAST();

    inline StatementAST *statement() const { return m_statement; }
    void setStatement(StatementAST *statement);

    inline AbstractExpressionAST *expression() const { return m_expression; }
    void setExpression(AbstractExpressionAST *expression);
private:
    StatementAST* m_statement;
    AbstractExpressionAST *m_expression;

private:
    LabeledStatementAST(const LabeledStatementAST &source);
    void operator = (const LabeledStatementAST &source);
};

class FunctionDefinitionAST: public DeclarationAST
{
public:
    enum { Type = NodeType_FunctionDefinition };

public:
    FunctionDefinitionAST();

    inline AST *functionSpecifier() const { return m_functionSpecifier; }
    void setFunctionSpecifier(AST *functionSpecifier);

    inline AST *storageSpecifier() const { return m_storageSpecifier; }
    void setStorageSpecifier(AST *storageSpecifier);

    inline TypeSpecifierAST *typeSpec() const { return m_typeSpec; }
    void setTypeSpec(TypeSpecifierAST *typeSpec);

    inline InitDeclaratorAST *initDeclarator() const { return m_initDeclarator; }
    void setInitDeclarator(InitDeclaratorAST *initDeclarator);

    inline StatementListAST *functionBody() const { return m_functionBody; }
    void setFunctionBody(StatementListAST *functionBody);

    inline AST *winDeclSpec() const { return m_winDeclSpec; }
    void setWinDeclSpec(AST *winDeclSpec);

private:
    AST* m_functionSpecifier;
    AST* m_storageSpecifier;
    TypeSpecifierAST* m_typeSpec;
    InitDeclaratorAST* m_initDeclarator;
    StatementListAST* m_functionBody;
    AST* m_winDeclSpec;

private:
    FunctionDefinitionAST(const FunctionDefinitionAST &source);
    void operator = (const FunctionDefinitionAST &source);
};

class TranslationUnitAST: public AST
{
public:
    enum { Type = NodeType_TranslationUnit };

public:
    TranslationUnitAST();

    void addDeclaration(DeclarationAST *ast);
    inline List<DeclarationAST *> *declarationList() const { return m_declarationList; }

private:
    List<DeclarationAST *> *m_declarationList;

private:
    TranslationUnitAST(const TranslationUnitAST &source);
    void operator = (const TranslationUnitAST &source);
};

template <class T> T* CreateNode(pool *p)
{
    T* node = new (p->allocate(sizeof(T))) T;
    node->setNodeType(T::Type);
    node->_pool = p;
    return node;
}

template <int kind> ExpressionAST<kind> *CreateExpression(pool *p)
{
    ExpressionAST<kind>* node = new (p->allocate(sizeof(ExpressionAST<kind>))) ExpressionAST<kind>;
    node->setNodeType(kind);
    node->_pool = p;
    return node;
}

/*
template <typename T>
inline List<T *> *snoc(List<T *> *e, T *d, pool *p)
{ if (!e) e = new (p->allocate(sizeof(List<T*>))) List<T *>(p); e->append(d); return e; }
*/

//Workaround for ICE on MSVC, use macro instead of template.
#define SNOC(ListType, ListValueType) \
inline ListType *snoc(ListType *e, ListValueType *d, pool *p) \
{ if (!e) e = new (p->allocate(sizeof(ListType))) ListType(p); e->append(d); return e; }

SNOC(List<AST *>, AST)
SNOC(List<ClassOrNamespaceNameAST *>, ClassOrNamespaceNameAST)
SNOC(List<BaseSpecifierAST *>, BaseSpecifierAST)
SNOC(List<DeclarationAST *>, DeclarationAST)
SNOC(List<EnumeratorAST *>, EnumeratorAST)
SNOC(List<ParameterDeclarationAST *>, ParameterDeclarationAST)
SNOC(List<InitDeclaratorAST *>, InitDeclaratorAST)
SNOC(List<TemplateParameterAST *>, TemplateParameterAST)
SNOC(List<StatementAST *>, StatementAST)

QT_END_NAMESPACE

#endif // AST_H
