/****************************************************************************
**
** 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$
**
****************************************************************************/

#include "ast.h"
#include <QStringList>
#include <stdio.h>

QT_BEGIN_NAMESPACE

int AST::N = 0;

// ------------------------------------------------------------------------
AST::AST(int startToken, int count)
    : m_scope(0),
      m_startToken(startToken),
      m_endToken(startToken + count),
      m_parent(0),
      m_children(0)
{
    ++N;
}

void AST::setParent(AST *parent)
{
    if (m_parent)
        m_parent->removeChild(this);

    m_parent = parent;

    if (m_parent)
        m_parent->appendChild(this);
}

void AST::appendChild(AST *child)
{
    m_children = snoc(m_children, child, _pool);
}

void AST::removeChild(AST *child)
{
    fprintf(stderr, "AST::removeChild child: %p not implemented yet\n", child);
}

// ------------------------------------------------------------------------
NameAST::NameAST()
    : m_global(false), m_unqualifiedName(0), m_classOrNamespaceNameList(0)
{
}

void NameAST::setGlobal(bool b)
{
    m_global = b;
}

void NameAST::setUnqualifiedName(ClassOrNamespaceNameAST *unqualifiedName)
{
    m_unqualifiedName = unqualifiedName;
    if (m_unqualifiedName) m_unqualifiedName->setParent(this);
}

void NameAST::addClassOrNamespaceName(ClassOrNamespaceNameAST *classOrNamespaceName)
{
    if(!classOrNamespaceName)
        return;

    classOrNamespaceName->setParent(this);
    m_classOrNamespaceNameList = snoc(m_classOrNamespaceNameList, classOrNamespaceName, _pool);
}

// ------------------------------------------------------------------------
DeclarationAST::DeclarationAST()
{
}

// ------------------------------------------------------------------------
LinkageBodyAST::LinkageBodyAST()
    : m_declarationList(0)
{
}

void LinkageBodyAST::addDeclaration(DeclarationAST *ast)
{
    if(!ast)
        return;

    ast->setParent(this);
    m_declarationList = snoc(m_declarationList, ast, _pool);
}

// ------------------------------------------------------------------------
LinkageSpecificationAST::LinkageSpecificationAST()
    : m_externType(0),
      m_linkageBody(0),
      m_declaration(0)
{
}

void LinkageSpecificationAST::setExternType(AST *externType)
{
    m_externType = externType;
    if (m_externType) m_externType->setParent(this);
}

void LinkageSpecificationAST::setLinkageBody(LinkageBodyAST *linkageBody)
{
    m_linkageBody = linkageBody;
    if (m_linkageBody) m_linkageBody->setParent(this);
}

void LinkageSpecificationAST::setDeclaration(DeclarationAST *decl)
{
    m_declaration = decl;
    if (m_declaration) m_declaration->setParent(this);
}

// ------------------------------------------------------------------------
TranslationUnitAST::TranslationUnitAST()
    : m_declarationList(0)
{
    //kdDebug(9007) << "++ TranslationUnitAST::TranslationUnitAST()" << endl;
}

void TranslationUnitAST::addDeclaration(DeclarationAST *ast)
{
    if(!ast)
        return;

    ast->setParent(this);
    m_declarationList = snoc(m_declarationList, ast, _pool);
}

// ------------------------------------------------------------------------
NamespaceAST::NamespaceAST()
    : m_namespaceName(0),
      m_linkageBody(0)
{
}

void NamespaceAST::setNamespaceName(AST *namespaceName)
{
    m_namespaceName = namespaceName;
    if (m_namespaceName) m_namespaceName->setParent(this);
}

void NamespaceAST::setLinkageBody(LinkageBodyAST *linkageBody)
{
    m_linkageBody = linkageBody;
    if (m_linkageBody) m_linkageBody->setParent(this);
}


// ------------------------------------------------------------------------
NamespaceAliasAST::NamespaceAliasAST()
    : m_namespaceName(0),
      m_aliasName(0)
{
}

void NamespaceAliasAST::setNamespaceName(AST *namespaceName)
{
    m_namespaceName = namespaceName;
    if (m_namespaceName) m_namespaceName->setParent(this);
}

void NamespaceAliasAST::setAliasName(NameAST *name)
{
    m_aliasName = name;
    if (m_aliasName) m_aliasName->setParent(this);
}

// ------------------------------------------------------------------------
UsingAST::UsingAST()
    : m_typeName(0),
      m_name(0)
{
}

void UsingAST::setTypeName(AST *typeName)
{
    m_typeName = typeName;
    if (m_typeName) m_typeName->setParent(this);
}

void UsingAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

// ------------------------------------------------------------------------
UsingDirectiveAST::UsingDirectiveAST()
    : m_name(0)
{
}

void UsingDirectiveAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

TypedefAST::TypedefAST()
    : m_typeSpec(0),
      m_initDeclaratorList(0)
{
}

void TypeSpecifierAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

void TypedefAST::setTypeSpec(TypeSpecifierAST *typeSpec)
{
    m_typeSpec = typeSpec;
    if (m_typeSpec) m_typeSpec->setParent(this);
}

void TypedefAST::setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList)
{
    m_initDeclaratorList = initDeclaratorList;
    if (m_initDeclaratorList) m_initDeclaratorList->setParent(this);
}

// ------------------------------------------------------------------------
TemplateArgumentListAST::TemplateArgumentListAST()
    : m_argumentList(0)
{
}

void TemplateArgumentListAST::addArgument(AST *arg)
{
    if(!arg)
        return;

    arg->setParent(this);
    m_argumentList = snoc(m_argumentList, arg, _pool);
}

// ------------------------------------------------------------------------
TemplateDeclarationAST::TemplateDeclarationAST()
    : m_exported(0),
      m_templateParameterList(0),
      m_declaration(0)
{
}

void TemplateDeclarationAST::setExported(AST *exported)
{
    m_exported = exported;
    if (m_exported) m_exported->setParent(this);
}

void TemplateDeclarationAST::setTemplateParameterList(TemplateParameterListAST *templateParameterList)
{
    m_templateParameterList = templateParameterList;
    if (m_templateParameterList) m_templateParameterList->setParent(this);
}

void TemplateDeclarationAST::setDeclaration(DeclarationAST *declaration)
{
    m_declaration = declaration;
    if (m_declaration) m_declaration->setParent(this);
}

// ------------------------------------------------------------------------
ClassOrNamespaceNameAST::ClassOrNamespaceNameAST()
    : m_name(0), m_templateArgumentList(0)
{
}

void ClassOrNamespaceNameAST::setName(AST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

void ClassOrNamespaceNameAST::setTemplateArgumentList(TemplateArgumentListAST *templateArgumentList)
{
    m_templateArgumentList = templateArgumentList;
    if (m_templateArgumentList) m_templateArgumentList->setParent(this);
}

// ------------------------------------------------------------------------
TypeSpecifierAST::TypeSpecifierAST()
    : m_name(0), m_cvQualify(0), m_cv2Qualify(0)

{
}

void TypeSpecifierAST::setCvQualify(AST *cvQualify)
{
    m_cvQualify = cvQualify;
    if (m_cvQualify) m_cvQualify->setParent(this);
}

void TypeSpecifierAST::setCv2Qualify(AST *cv2Qualify)
{
    m_cv2Qualify = cv2Qualify;
    if (m_cv2Qualify) m_cv2Qualify->setParent(this);
}

// ------------------------------------------------------------------------
ClassSpecifierAST::ClassSpecifierAST()
    : m_winDeclSpec(0),
      m_classKey(0),
      m_baseClause(0),
      m_declarationList(0)
{
}

void ClassSpecifierAST::setClassKey(AST *classKey)
{
    m_classKey = classKey;
    if (m_classKey) m_classKey->setParent(this);
}

void ClassSpecifierAST::addDeclaration(DeclarationAST *declaration)
{
    if(!declaration)
        return;

    declaration->setParent(this);
    m_declarationList = snoc(m_declarationList, declaration, _pool);
}

void ClassSpecifierAST::setBaseClause(BaseClauseAST *baseClause)
{
    m_baseClause = baseClause;
    if (m_baseClause) m_baseClause->setParent(this);
}

// ------------------------------------------------------------------------
EnumSpecifierAST::EnumSpecifierAST()
    : m_enumeratorList(0)
{
}

void EnumSpecifierAST::addEnumerator(EnumeratorAST *enumerator)
{
    if(!enumerator)
        return;

    enumerator->setParent(this);
    m_enumeratorList = snoc(m_enumeratorList, enumerator, _pool);
}


// ------------------------------------------------------------------------
ElaboratedTypeSpecifierAST::ElaboratedTypeSpecifierAST()
    : m_kind(0)
{
}

void ElaboratedTypeSpecifierAST::setKind(AST *kind)
{
    m_kind = kind;
    if (m_kind) m_kind->setParent(this);
}

// ------------------------------------------------------------------------
EnumeratorAST::EnumeratorAST()
    : m_id(0),
      m_expression(0)
{
}

void EnumeratorAST::setId(AST *id)
{
    m_id = id;
    if (m_id) m_id->setParent(this);
}

void EnumeratorAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

// ------------------------------------------------------------------------
BaseClauseAST::BaseClauseAST()
    : m_baseSpecifierList(0)
{
}

void BaseClauseAST::addBaseSpecifier(BaseSpecifierAST *baseSpecifier)
{
    if(!baseSpecifier)
        return;

    baseSpecifier->setParent(this);
    m_baseSpecifierList = snoc(m_baseSpecifierList, baseSpecifier, _pool);
}

// ------------------------------------------------------------------------
BaseSpecifierAST::BaseSpecifierAST()
    : m_isVirtual(0), m_access(0), m_name(0)

{
}

void BaseSpecifierAST::setIsVirtual(AST *isVirtual)
{
    m_isVirtual = isVirtual;
    if (m_isVirtual) m_isVirtual->setParent(this);
}

void BaseSpecifierAST::setAccess(AST *access)
{
    m_access = access;
    if (m_access) m_access->setParent(this);
}

void BaseSpecifierAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

// ------------------------------------------------------------------------
SimpleDeclarationAST::SimpleDeclarationAST()
    : m_functionSpecifier(0),
      m_storageSpecifier(0),
      m_typeSpec(0),
      m_initDeclaratorList(0),
      m_winDeclSpec(0)
{
}

void SimpleDeclarationAST::setFunctionSpecifier(AST *functionSpecifier)
{
    m_functionSpecifier = functionSpecifier;
    if (m_functionSpecifier) m_functionSpecifier->setParent(this);
}

void SimpleDeclarationAST::setStorageSpecifier(AST *storageSpecifier)
{
    m_storageSpecifier = storageSpecifier;
    if (m_storageSpecifier) m_storageSpecifier->setParent(this);
}

void SimpleDeclarationAST::setTypeSpec(TypeSpecifierAST *typeSpec)
{
    m_typeSpec = typeSpec;
    if (m_typeSpec) m_typeSpec->setParent(this);
}

void SimpleDeclarationAST::setInitDeclaratorList(InitDeclaratorListAST *initDeclaratorList)
{
    m_initDeclaratorList = initDeclaratorList;
    if (m_initDeclaratorList) m_initDeclaratorList->setParent(this);
}

void SimpleDeclarationAST::setWinDeclSpec(AST *winDeclSpec)
{
    m_winDeclSpec = winDeclSpec;
    if (m_winDeclSpec) m_winDeclSpec->setParent(this);
}

// ------------------------------------------------------------------------
InitDeclaratorListAST::InitDeclaratorListAST()
    : m_initDeclaratorList(0)
{
}

void InitDeclaratorListAST::addInitDeclarator(InitDeclaratorAST *decl)
{
    if(!decl)
        return;

    decl->setParent(this);
    m_initDeclaratorList = snoc(m_initDeclaratorList, decl, _pool);
}

// ------------------------------------------------------------------------
DeclaratorAST::DeclaratorAST()
    : m_ptrOpList(0),
      m_subDeclarator(0),
      m_declaratorId(0),
      m_bitfieldInitialization(0),
      m_arrayDimensionList(0),
      m_parameterDeclarationClause(0),
      m_constant(0),
      m_exceptionSpecification(0)
{
}

void DeclaratorAST::setSubDeclarator(DeclaratorAST *subDeclarator)
{
    m_subDeclarator = subDeclarator;
    if (m_subDeclarator) m_subDeclarator->setParent(this);
}

void DeclaratorAST::setDeclaratorId(NameAST *declaratorId)
{
    m_declaratorId = declaratorId;
    if (m_declaratorId) m_declaratorId->setParent(this);
}

void DeclaratorAST::setBitfieldInitialization(AST *bitfieldInitialization)
{
    m_bitfieldInitialization = bitfieldInitialization;
    if (m_bitfieldInitialization) m_bitfieldInitialization->setParent(this);
}

void DeclaratorAST::addArrayDimension(AST *arrayDimension)
{
    if(!arrayDimension)
        return;

    arrayDimension->setParent(this);
    m_arrayDimensionList = snoc(m_arrayDimensionList, arrayDimension, _pool);
}

void DeclaratorAST::setParameterDeclarationClause(ParameterDeclarationClauseAST *parameterDeclarationClause)
{
    m_parameterDeclarationClause = parameterDeclarationClause;
    if (m_parameterDeclarationClause) m_parameterDeclarationClause->setParent(this);
}

void DeclaratorAST::setConstant(AST *constant)
{
    m_constant = constant;
    if (m_constant) m_constant->setParent(this);
}

void DeclaratorAST::setExceptionSpecification(AST *exceptionSpecification)
{
    m_exceptionSpecification = exceptionSpecification;
    if (m_exceptionSpecification) m_exceptionSpecification->setParent(this);
}

void DeclaratorAST::addPtrOp(AST *ptrOp)
{
    if(!ptrOp)
        return;

    ptrOp->setParent(this);
    m_ptrOpList = snoc(m_ptrOpList, ptrOp, _pool);
}

// --------------------------------------------------------------------------
InitDeclaratorAST::InitDeclaratorAST()
    : m_declarator(0),
      m_initializer(0)
{
}

void InitDeclaratorAST::setDeclarator(DeclaratorAST *declarator)
{
    m_declarator = declarator;
    if (m_declarator) m_declarator->setParent(this);
}

void InitDeclaratorAST::setInitializer(AST *initializer)
{
    m_initializer = initializer;
    if (m_initializer) m_initializer->setParent(this);
}

// --------------------------------------------------------------------------
FunctionDefinitionAST::FunctionDefinitionAST()
    : m_functionSpecifier(0),
      m_storageSpecifier(0),
      m_typeSpec(0),
      m_initDeclarator(0),
      m_functionBody(0),
      m_winDeclSpec(0)
{
}

void FunctionDefinitionAST::setFunctionSpecifier(AST *functionSpecifier)
{
    m_functionSpecifier = functionSpecifier;
    if (m_functionSpecifier) m_functionSpecifier->setParent(this);
}

void FunctionDefinitionAST::setStorageSpecifier(AST *storageSpecifier)
{
    m_storageSpecifier = storageSpecifier;
    if (m_storageSpecifier) m_storageSpecifier->setParent(this);
}

void FunctionDefinitionAST::setTypeSpec(TypeSpecifierAST *typeSpec)
{
    m_typeSpec = typeSpec;
    if (m_typeSpec) m_typeSpec->setParent(this);
}

void FunctionDefinitionAST::setInitDeclarator(InitDeclaratorAST *initDeclarator)
{
    m_initDeclarator = initDeclarator;
    if (m_initDeclarator) m_initDeclarator->setParent(this);
}

void FunctionDefinitionAST::setFunctionBody(StatementListAST *functionBody)
{
    m_functionBody = functionBody;
    if (m_functionBody) m_functionBody->setParent(this);
}

void FunctionDefinitionAST::setWinDeclSpec(AST *winDeclSpec)
{
    m_winDeclSpec = winDeclSpec;
    if (m_winDeclSpec) m_winDeclSpec->setParent(this);
}

// --------------------------------------------------------------------------
StatementListAST::StatementListAST()
    : m_statementList(0)
{
}

void StatementListAST::addStatement(StatementAST *statement)
{
    if(!statement)
        return;

    statement->setParent(this);
    m_statementList = snoc(m_statementList, statement, _pool);
}

// --------------------------------------------------------------------------
IfStatementAST::IfStatementAST()
    : m_condition(0),
      m_statement(0),
      m_elseStatement(0)
{
}

void IfStatementAST::setCondition(ConditionAST *condition)
{
    m_condition = condition;
    if (m_condition) m_condition->setParent(this);
}

void IfStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

void IfStatementAST::setElseStatement(StatementAST *elseStatement)
{
    m_elseStatement = elseStatement;
    if (m_elseStatement) m_elseStatement->setParent(this);
}

// --------------------------------------------------------------------------
WhileStatementAST::WhileStatementAST()
    : m_condition(0),
      m_statement(0)
{
}

void WhileStatementAST::setCondition(ConditionAST *condition)
{
    m_condition = condition;
    if (m_condition) m_condition->setParent(this);
}

void WhileStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

// --------------------------------------------------------------------------
DoStatementAST::DoStatementAST()
    : m_condition(0),
      m_statement(0)
{
}

void DoStatementAST::setCondition(ConditionAST *condition)
{
    m_condition = condition;
    if (m_condition) m_condition->setParent(this);
}

void DoStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

// --------------------------------------------------------------------------
ForStatementAST::ForStatementAST()
    : m_condition(0),
      m_initStatement(0),
      m_statement(0),
      m_expression(0)
{
}

void ForStatementAST::setCondition(ConditionAST *condition)
{
    m_condition = condition;
    if (m_condition) m_condition->setParent(this);
}

void ForStatementAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

void ForStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

void ForStatementAST::setInitStatement(StatementAST *initStatement)
{
    m_initStatement = initStatement;
    if (m_initStatement) m_initStatement->setParent(this);
}

// --------------------------------------------------------------------------
SwitchStatementAST::SwitchStatementAST()
    : m_condition(0),
      m_statement(0)
{
}

void SwitchStatementAST::setCondition(ConditionAST *condition)
{
    m_condition = condition;
    if (m_condition) m_condition->setParent(this);
}

void SwitchStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

// --------------------------------------------------------------------------
DeclarationStatementAST::DeclarationStatementAST()
    : m_declaration(0)
{
}

void DeclarationStatementAST::setDeclaration(DeclarationAST *declaration)
{
    m_declaration = declaration;
    if (m_declaration) m_declaration->setParent(this);
}

// --------------------------------------------------------------------------
LabeledStatementAST::LabeledStatementAST()
    : m_statement(0), m_expression(0)
{
}

void LabeledStatementAST::setStatement(StatementAST *statement)
{
    m_statement = statement;
    if (m_statement) m_statement->setParent(this);
}

void LabeledStatementAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

// --------------------------------------------------------------------------
ExpressionStatementAST::ExpressionStatementAST()
    : m_expression(0)
{
}

void ExpressionStatementAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}


// --------------------------------------------------------------------------
ParameterDeclarationAST::ParameterDeclarationAST()
    : m_typeSpec(0),
      m_declarator(0),
      m_expression(0)
{
}

void ParameterDeclarationAST::setTypeSpec(TypeSpecifierAST *typeSpec)
{
    m_typeSpec = typeSpec;
    if (m_typeSpec) m_typeSpec->setParent(this);
}

void ParameterDeclarationAST::setDeclarator(DeclaratorAST *declarator)
{
    m_declarator = declarator;
    if (m_declarator) m_declarator->setParent(this);
}

void ParameterDeclarationAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

// --------------------------------------------------------------------------
ParameterDeclarationListAST::ParameterDeclarationListAST()
    : m_parameterList(0)
{
}

void ParameterDeclarationListAST::addParameter(ParameterDeclarationAST *parameter)
{
    if(!parameter)
        return;

    parameter->setParent(this);
    m_parameterList = snoc(m_parameterList, parameter, _pool);
}

// --------------------------------------------------------------------------
ParameterDeclarationClauseAST::ParameterDeclarationClauseAST()
    : m_parameterDeclarationList(0),
      m_ellipsis(0)
{
}

void ParameterDeclarationClauseAST::setParameterDeclarationList(ParameterDeclarationListAST *parameterDeclarationList)
{
    m_parameterDeclarationList = parameterDeclarationList;
    if (m_parameterDeclarationList) m_parameterDeclarationList->setParent(this);
}

void ParameterDeclarationClauseAST::setEllipsis(AST *ellipsis)
{
    m_ellipsis = ellipsis;
    if (m_ellipsis) m_ellipsis->setParent(this);
}

// --------------------------------------------------------------------------
AccessDeclarationAST::AccessDeclarationAST()
    : m_accessList(0)
{
}

void AccessDeclarationAST::addAccess(AST *access)
{
    if(!access)
        return;

    access->setParent(this);
    m_accessList = snoc(m_accessList, access, _pool);
}

// --------------------------------------------------------------------------
TypeParameterAST::TypeParameterAST()
    : m_kind(0), m_templateParameterList(0),
      m_name(0), m_typeId(0)

{
}

void TypeParameterAST::setKind(AST *kind)
{
    m_kind = kind;
}

void TypeParameterAST::setTemplateParameterList(TemplateParameterListAST *templateParameterList)
{
    m_templateParameterList = templateParameterList;
    if (m_templateParameterList) m_templateParameterList->setParent(this);
}

void TypeParameterAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name) m_name->setParent(this);
}

void TypeParameterAST::setTypeId(AST *typeId)
{
    m_typeId = typeId;
    if (m_typeId) m_typeId->setParent(this);
}

// --------------------------------------------------------------------------
TemplateParameterAST::TemplateParameterAST()
    : m_typeParameter(0),
      m_typeValueParameter(0)
{
}

void TemplateParameterAST::setTypeParameter(TypeParameterAST *typeParameter)
{
    m_typeParameter = typeParameter;
    if (m_typeParameter) m_typeParameter->setParent(this);
}

void TemplateParameterAST::setTypeValueParameter(ParameterDeclarationAST *typeValueParameter)
{
    m_typeValueParameter = typeValueParameter;
    if (m_typeValueParameter) m_typeValueParameter->setParent(this);
}

// --------------------------------------------------------------------------
TemplateParameterListAST::TemplateParameterListAST()
    : m_templateParameterList(0)
{
}

void TemplateParameterListAST::addTemplateParameter(TemplateParameterAST *templateParameter)
{
    if(!templateParameter)
        return;

    templateParameter->setParent(this);
    m_templateParameterList = snoc(m_templateParameterList, templateParameter, _pool);
}

// --------------------------------------------------------------------------
ConditionAST::ConditionAST()
    : m_typeSpec(0),
      m_declarator(0),
      m_expression(0)
{
}

void ConditionAST::setTypeSpec(TypeSpecifierAST *typeSpec)
{
    m_typeSpec = typeSpec;
    if (m_typeSpec) m_typeSpec->setParent(this);
}

void ConditionAST::setDeclarator(DeclaratorAST *declarator)
{
    m_declarator = declarator;
    if (m_declarator) m_declarator->setParent(this);
}

void ConditionAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

void ClassSpecifierAST::setWinDeclSpec(AST *winDeclSpec)
{
    m_winDeclSpec = winDeclSpec;
    if (m_winDeclSpec) m_winDeclSpec->setParent(this);
}

// --------------------------------------------------------------------------
ReturnStatementAST::ReturnStatementAST()
    : m_expression(0)
{
}

void ReturnStatementAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression) m_expression->setParent(this);
}

// --------------------------------------------------------------------------
BinaryExpressionAST::BinaryExpressionAST()
    : m_op(0), m_left(0), m_right(0)
{
}

void BinaryExpressionAST::setOp(AST *op)
{
    m_op = op;
    if (m_op)
        m_op->setParent(this);
}

void BinaryExpressionAST::setLeftExpression(AbstractExpressionAST *left)
{
    m_left = left;
    if (m_left)
        m_left->setParent(this);
}

void BinaryExpressionAST::setRightExpression(AbstractExpressionAST *right)
{
    m_right = right;
    if (m_right)
        m_right->setParent(this);
}

// --------------------------------------------------------------------------
ConditionalExpressionAST::ConditionalExpressionAST()
    : m_condition(0), m_left(0), m_right(0)
{
}

void ConditionalExpressionAST::setCondition(AbstractExpressionAST *condition)
{
    m_condition = condition;
    if (m_condition)
        m_condition->setParent(this);
}

void ConditionalExpressionAST::setLeftExpression(AbstractExpressionAST *left)
{
    m_left = left;
    if (m_left)
        m_left->setParent(this);
}

void ConditionalExpressionAST::setRightExpression(AbstractExpressionAST *right)
{
    m_right = right;
    if (m_right)
        m_right->setParent(this);
}

// --------------------------------------------------------------------------
CppCastExpressionAST::CppCastExpressionAST()
    : m_castOp(0), m_typeId(0), m_expression(0)
{
}

void CppCastExpressionAST::setCastOp(AST *castOp)
{
    m_castOp = castOp;
    if (m_castOp)
        m_castOp->setParent(this);
}

void CppCastExpressionAST::setTypeId(AST *typeId)
{
    m_typeId = typeId;
    if (m_typeId)
        m_typeId->setParent(this);
}

void CppCastExpressionAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression)
        m_expression->setParent(this);
}

// --------------------------------------------------------------------------
SubscriptingAST::SubscriptingAST()
    : m_expression(0), m_subscript(0)
{
}

void SubscriptingAST::setSubscript(AbstractExpressionAST *subscript)
{
    m_subscript = subscript;
    if (m_subscript)
        m_subscript->setParent(this);
}

void SubscriptingAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression)
        m_expression->setParent(this);
}

// --------------------------------------------------------------------------
FunctionCallAST::FunctionCallAST()
    : m_expression(0), m_arguments(0)
{
}

void FunctionCallAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression)
        m_expression->setParent(this);
}

void FunctionCallAST::setArguments(AbstractExpressionAST *arguments)
{
    m_arguments = arguments;
    if (m_arguments)
        m_arguments->setParent(this);
}

// --------------------------------------------------------------------------
ExplicitTypeConversionAST::ExplicitTypeConversionAST()
{
}

// --------------------------------------------------------------------------
PseudoDestructorCallAST::PseudoDestructorCallAST()
{
}

// --------------------------------------------------------------------------
ClassMemberAccessAST::ClassMemberAccessAST()
    : m_op(0), m_expression(0), m_templ(0), m_name(0)
{
}

void ClassMemberAccessAST::setOp(AST *op)
{
    m_op = op;
    if (m_op)
        m_op->setParent(this);
}

void ClassMemberAccessAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression)
        m_expression->setParent(this);
}

void ClassMemberAccessAST::setName(NameAST *name)
{
    m_name = name;
    if (m_name)
        m_name->setParent(this);
}

// --------------------------------------------------------------------------
IncrDecrAST::IncrDecrAST()
    : m_op(0), m_expression(0)
{
}

void IncrDecrAST::setOp(AST *op)
{
    m_op = op;
    if (m_op)
        m_op->setParent(this);
}

void IncrDecrAST::setExpression(AbstractExpressionAST *expression)
{
    m_expression = expression;
    if (m_expression)
        m_expression->setParent(this);
}

// --------------------------------------------------------------------------
TypeIdentificationAST::TypeIdentificationAST()
{
}

// --------------------------------------------------------------------------
TypeIdAST::TypeIdAST()
    : m_typeSpecifier(0), m_declarator(0)
{
}

void TypeIdAST::setTypeSpecifier(TypeSpecifierAST *typeSpecifier)
{
    m_typeSpecifier = typeSpecifier;
    if (m_typeSpecifier)
        m_typeSpecifier->setParent(this);
}

void TypeIdAST::setDeclarator(DeclaratorAST *declarator)
{
    m_declarator = declarator;
    if (m_declarator)
        m_declarator->setParent(this);
}

// --------------------------------------------------------------------------
AbstractExpressionAST::AbstractExpressionAST()
{
    m_symbol = 0;
}

QT_END_NAMESPACE
