/*******************************************************************************
* Copyright (c) 2006, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Mike Kucera (IBM Corporation) - initial API and implementation
* Markus Schorn (Wind River Systems)
* Thomas Corbat (IFS)
* Anders Dahlberg (Ericsson) - bug 84144
*******************************************************************************/
package org.eclipse.cdt.internal.core.dom.parser.c;
import org.eclipse.cdt.core.dom.ast.IASTASMDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTAlignmentSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTArraySubscriptExpression;
import org.eclipse.cdt.core.dom.ast.IASTAttribute;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
import org.eclipse.cdt.core.dom.ast.IASTConditionalExpression;
import org.eclipse.cdt.core.dom.ast.IASTContinueStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement;
import org.eclipse.cdt.core.dom.ast.IASTDoStatement;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.IASTEqualsInitializer;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTExpressionList;
import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement;
import org.eclipse.cdt.core.dom.ast.IASTFieldDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFieldReference;
import org.eclipse.cdt.core.dom.ast.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTGotoStatement;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTInitializerList;
import org.eclipse.cdt.core.dom.ast.IASTLabelStatement;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTProblem;
import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTProblemExpression;
import org.eclipse.cdt.core.dom.ast.IASTProblemStatement;
import org.eclipse.cdt.core.dom.ast.IASTReturnStatement;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTStandardFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTStatement;
import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.IASTToken;
import org.eclipse.cdt.core.dom.ast.IASTTokenList;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayDesignator;
import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer;
import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
import org.eclipse.cdt.core.dom.ast.c.ICASTPointer;
import org.eclipse.cdt.core.dom.ast.c.ICASTSimpleDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression;
import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier;
import org.eclipse.cdt.core.dom.ast.c.ICNodeFactory;
import org.eclipse.cdt.core.dom.ast.gnu.IGNUASTCompoundStatementExpression;
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.internal.core.dom.parser.ASTToken;
import org.eclipse.cdt.internal.core.dom.parser.ASTTokenList;
import org.eclipse.cdt.internal.core.dom.parser.NodeFactory;
import org.eclipse.cdt.internal.core.parser.scanner.CPreprocessor;
/**
* Abstract factory implementation that creates AST nodes for C99.
* These can be overridden in subclasses to change the
* implementations of the nodes.
*/
public class CNodeFactory extends NodeFactory implements ICNodeFactory {
private static final CNodeFactory DEFAULT_INSTANCE = new CNodeFactory();
public static CNodeFactory getDefault() {
return DEFAULT_INSTANCE;
}
@Override
public IASTAlignmentSpecifier newAlignmentSpecifier(IASTExpression expression) {
return new CASTAlignmentSpecifier(expression);
}
@Override
public IASTAlignmentSpecifier newAlignmentSpecifier(IASTTypeId typeId) {
return new CASTAlignmentSpecifier(typeId);
}
@Override
public IASTArrayDeclarator newArrayDeclarator(IASTName name) {
return new CASTArrayDeclarator(name);
}
@Override
public ICASTArrayDesignator newArrayDesignator(IASTExpression exp) {
return new CASTArrayDesignator(exp);
}
@Override
public ICASTArrayModifier newArrayModifier(IASTExpression expr) {
return new CASTArrayModifier(expr);
}
@Override
public IGCCASTArrayRangeDesignator newArrayRangeDesignatorGCC(IASTExpression floor, IASTExpression ceiling) {
return new CASTArrayRangeDesignator(floor, ceiling);
}
@Override
public IASTArraySubscriptExpression newArraySubscriptExpression(IASTExpression arrayExpr, IASTExpression subscript) {
return new CASTArraySubscriptExpression(arrayExpr, subscript);
}
@Override
public IASTASMDeclaration newASMDeclaration(String assembly) {
return new CASTASMDeclaration(assembly);
}
@Override
public IASTAttribute newAttribute(char[] name, IASTToken argumentClause) {
return new CASTAttribute(name, argumentClause);
}
@Override
public IASTBinaryExpression newBinaryExpression(int op, IASTExpression expr1, IASTExpression expr2) {
return new CASTBinaryExpression(op, expr1, expr2);
}
@Override
public IASTBreakStatement newBreakStatement() {
return new CASTBreakStatement();
}
@Override
public IASTCaseStatement newCaseStatement(IASTExpression expression) {
return new CASTCaseStatement(expression);
}
/**
* @param operator
*/
@Override
public IASTCastExpression newCastExpression(int operator, IASTTypeId typeId, IASTExpression operand) {
return new CASTCastExpression(typeId, operand);
}
@Override
public ICASTCompositeTypeSpecifier newCompositeTypeSpecifier(int key, IASTName name) {
return new CASTCompositeTypeSpecifier(key, name);
}
@Override
public IASTCompoundStatement newCompoundStatement() {
return new CASTCompoundStatement();
}
@Override
public IASTConditionalExpression newConditionalExpession(IASTExpression condition, IASTExpression positive, IASTExpression negative) {
return new CASTConditionalExpression(condition, positive, negative);
}
@Override
public IASTContinueStatement newContinueStatement() {
return new CASTContinueStatement();
}
@Override
public IASTDeclarationStatement newDeclarationStatement(IASTDeclaration declaration) {
return new CASTDeclarationStatement(declaration);
}
@Override
public IASTDeclarator newDeclarator(IASTName name) {
return new CASTDeclarator(name);
}
@Override
public IASTDefaultStatement newDefaultStatement() {
return new CASTDefaultStatement();
}
@Override
@Deprecated
public ICASTDesignatedInitializer newDesignatedInitializer(IASTInitializer operandInitializer) {
CASTDesignatedInitializer result = new CASTDesignatedInitializer();
result.setOperandInitializer(operandInitializer);
return result;
}
@Override
public ICASTDesignatedInitializer newDesignatedInitializer(IASTInitializerClause clause) {
return new CASTDesignatedInitializer(clause);
}
@Override
public IASTDoStatement newDoStatement(IASTStatement body, IASTExpression condition) {
return new CASTDoStatement(body, condition);
}
@Override
public ICASTElaboratedTypeSpecifier newElaboratedTypeSpecifier(int kind, IASTName name) {
return new CASTElaboratedTypeSpecifier(kind, name);
}
@Override
public ICASTEnumerationSpecifier newEnumerationSpecifier(IASTName name) {
return new CASTEnumerationSpecifier(name);
}
@Override
public IASTEnumerator newEnumerator(IASTName name, IASTExpression value) {
return new CASTEnumerator(name, value);
}
@Override
public IASTEqualsInitializer newEqualsInitializer(IASTInitializerClause initClause) {
return new CASTEqualsInitializer(initClause);
}
@Override
public IASTExpressionList newExpressionList() {
return new CASTExpressionList();
}
@Override
public IASTExpressionStatement newExpressionStatement(IASTExpression expr) {
return new CASTExpressionStatement(expr);
}
@Override
public IASTFieldDeclarator newFieldDeclarator(IASTName name, IASTExpression bitFieldSize) {
return new CASTFieldDeclarator(name, bitFieldSize);
}
@Override
public ICASTFieldDesignator newFieldDesignator(IASTName name) {
return new CASTFieldDesignator(name);
}
@Override
public IASTFieldReference newFieldReference(IASTName name, IASTExpression owner) {
return new CASTFieldReference(name, owner);
}
@Override
public IASTForStatement newForStatement(IASTStatement init, IASTExpression condition,
IASTExpression iterationExpression, IASTStatement body) {
return new CASTForStatement(init, condition, iterationExpression, body);
}
@Override
@Deprecated
public IASTFunctionCallExpression newFunctionCallExpression(IASTExpression idExpr, IASTExpression argList) {
CASTFunctionCallExpression result = new CASTFunctionCallExpression(idExpr, null);
if (argList == null) {
result.setArguments(null);
} else if (argList instanceof IASTExpressionList) {
result.setArguments(((IASTExpressionList) argList).getExpressions());
} else {
result.setArguments(new IASTExpression[] {argList});
}
return result;
}
@Override
public IASTFunctionCallExpression newFunctionCallExpression(IASTExpression idExpr, IASTInitializerClause[] arguments) {
return new CASTFunctionCallExpression(idExpr, arguments);
}
@Override
public IASTStandardFunctionDeclarator newFunctionDeclarator(IASTName name) {
return new CASTFunctionDeclarator(name);
}
@Override
public IASTFunctionDefinition newFunctionDefinition(IASTDeclSpecifier declSpecifier,
IASTFunctionDeclarator declarator, IASTStatement bodyStatement) {
return new CASTFunctionDefinition(declSpecifier, declarator, bodyStatement);
}
@Override
public IGNUASTCompoundStatementExpression newGNUCompoundStatementExpression(IASTCompoundStatement compoundStatement) {
return new CASTCompoundStatementExpression(compoundStatement);
}
@Override
public IASTGotoStatement newGotoStatement(IASTName name) {
return new CASTGotoStatement(name);
}
@Override
public IASTStatement newGotoStatement(IASTExpression expression) {
return new GNUCASTGotoStatement(expression);
}
@Override
public IASTIdExpression newIdExpression(IASTName name) {
return new CASTIdExpression(name);
}
@Override
public IASTIfStatement newIfStatement(IASTExpression expr, IASTStatement thenStat, IASTStatement elseClause) {
return new CASTIfStatement(expr, thenStat, elseClause);
}
@Override
@Deprecated
public org.eclipse.cdt.core.dom.ast.IASTInitializerExpression newInitializerExpression(IASTExpression expression) {
return new CASTInitializerExpression(expression);
}
@Override
public IASTInitializerList newInitializerList() {
return new CASTInitializerList();
}
@Override
public ICASTKnRFunctionDeclarator newKnRFunctionDeclarator(IASTName[] parameterNames, IASTDeclaration[] parameterDeclarations) {
return new CASTKnRFunctionDeclarator(parameterNames, parameterDeclarations);
}
@Override
public IASTLabelStatement newLabelStatement(IASTName name, IASTStatement nestedStatement) {
return new CASTLabelStatement(name, nestedStatement);
}
@Override
public IASTLiteralExpression newLiteralExpression(int kind, String rep) {
return new CASTLiteralExpression(kind, rep.toCharArray());
}
@Override
public IASTName newName() {
return new CASTName();
}
@Override
public IASTName newName(char[] name) {
return new CASTName(name);
}
@Override
public IASTName newName(String name) {
return newName(name.toCharArray());
}
@Override
public IASTNullStatement newNullStatement() {
return new CASTNullStatement();
}
@Override
public IASTParameterDeclaration newParameterDeclaration(IASTDeclSpecifier declSpec, IASTDeclarator declarator) {
return new CASTParameterDeclaration(declSpec, declarator);
}
@Override
public ICASTPointer newPointer() {
return new CASTPointer();
}
@Override
public IASTProblem newProblem(int id, char[] arg, boolean error) {
return new CASTProblem(id, arg, error);
}
@Override
public IASTProblemDeclaration newProblemDeclaration(IASTProblem problem) {
return new CASTProblemDeclaration(problem);
}
@Override
public IASTProblemExpression newProblemExpression(IASTProblem problem) {
return new CASTProblemExpression(problem);
}
@Override
public IASTProblemStatement newProblemStatement(IASTProblem problem) {
return new CASTProblemStatement(problem);
}
@Override
public IASTReturnStatement newReturnStatement(IASTExpression retValue) {
return new CASTReturnStatement(retValue);
}
@Override
public IASTSimpleDeclaration newSimpleDeclaration(IASTDeclSpecifier declSpecifier) {
return new CASTSimpleDeclaration(declSpecifier);
}
@Override
public ICASTSimpleDeclSpecifier newSimpleDeclSpecifier() {
return new CASTSimpleDeclSpecifier();
}
@Override
@Deprecated
public org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTSimpleDeclSpecifier newSimpleDeclSpecifierGCC(IASTExpression typeofExpression) {
return new GCCASTSimpleDeclSpecifier(typeofExpression);
}
@Override
public IASTSwitchStatement newSwitchStatement(IASTExpression controller, IASTStatement body) {
return new CASTSwitchStatement(controller, body);
}
@Override
public IASTToken newToken(int tokenType, char[] tokenImage) {
return new ASTToken(tokenType, tokenImage);
}
@Override
public IASTTokenList newTokenList() {
return new ASTTokenList();
}
@Override
public IASTTranslationUnit newTranslationUnit(IScanner scanner) {
CASTTranslationUnit tu = new CASTTranslationUnit();
if (scanner != null) {
tu.setLocationResolver(scanner.getLocationResolver());
if (scanner instanceof CPreprocessor) {
tu.setIsForContentAssist(((CPreprocessor) scanner).isContentAssistMode());
}
}
tu.setASTNodeFactory(this);
return tu;
}
@Override
public ICASTTypedefNameSpecifier newTypedefNameSpecifier(IASTName name) {
return new CASTTypedefNameSpecifier(name);
}
@Override
public IASTTypeId newTypeId(IASTDeclSpecifier declSpecifier, IASTDeclarator declarator) {
return new CASTTypeId(declSpecifier, declarator);
}
@Override
public IASTTypeIdExpression newTypeIdExpression(int operator, IASTTypeId typeId) {
return new CASTTypeIdExpression(operator, typeId);
}
@Override
public ICASTTypeIdInitializerExpression newTypeIdInitializerExpression(IASTTypeId typeId, IASTInitializer initializer) {
return new CASTTypeIdInitializerExpression(typeId, initializer);
}
@Override
public IASTUnaryExpression newUnaryExpression(int operator, IASTExpression operand) {
return new CASTUnaryExpression(operator, operand);
}
@Override
public IASTWhileStatement newWhileStatement(IASTExpression condition, IASTStatement body) {
return new CASTWhileStatement(condition, body);
}
}