Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java')
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java84
1 files changed, 71 insertions, 13 deletions
diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java
index b9922fa0141..a7ca0726c84 100644
--- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java
+++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2009 IBM Corporation and others.
+ * Copyright (c) 2006, 2010 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
@@ -28,11 +28,14 @@ import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier;
+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.IASTForStatement;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
+import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
@@ -48,6 +51,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
+import org.eclipse.cdt.core.dom.ast.IBasicType.Kind;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAmbiguousTemplateArgument;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
@@ -97,6 +101,7 @@ import org.eclipse.cdt.core.dom.lrparser.action.ParserUtil;
import org.eclipse.cdt.core.dom.lrparser.action.ScopedStack;
import org.eclipse.cdt.core.dom.lrparser.action.TokenMap;
import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym;
+import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
@@ -104,6 +109,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousDeclarator;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTConstructorInitializer;
import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator;
/**
@@ -296,9 +302,17 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeExpressionSimpleTypeConstructor() {
IASTExpression expression = (IASTExpression) astStack.pop();
IToken token = (IToken) astStack.pop();
-
- int type = asICPPASTSimpleTypeConstructorExpressionType(token);
- ICPPASTSimpleTypeConstructorExpression typeConstructor = nodeFactory.newSimpleTypeConstructorExpression(type, expression);
+ ////CDT_70_FIX_FROM_50-#3
+ //int type = asICPPASTSimpleTypeConstructorExpressionType(token);
+ ICPPASTConstructorInitializer init=null;
+ if(expression!=null){
+ init = new CPPASTConstructorInitializer();
+ init.setExpression(expression);
+
+ ((ASTNode)init).setOffsetAndLength(((ASTNode)expression).getOffset(),((ASTNode)expression).getLength());
+ }
+ ICPPASTDeclSpecifier declspec = transformIntoSimpleTypeSpecifier(token);
+ ICPPASTSimpleTypeConstructorExpression typeConstructor = nodeFactory.newSimpleTypeConstructorExpression(declspec, init);
setOffsetAndLength(typeConstructor);
astStack.push(typeConstructor);
@@ -327,6 +341,35 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
}
}
+ private ICPPASTDeclSpecifier transformIntoSimpleTypeSpecifier(IToken token){
+ ICPPASTSimpleDeclSpecifier declspec= nodeFactory.newSimpleDeclSpecifier();
+ switch(baseKind(token)) {
+ case TK_char : declspec.setType(Kind.eChar); break;
+ case TK_wchar_t : declspec.setType(Kind.eWChar); break;
+ case TK_bool : declspec.setType(Kind.eBoolean);break;
+ case TK_short : declspec.setShort(true); break;
+ case TK_int : declspec.setType(Kind.eInt); break;
+ case TK_long : declspec.setLong(true); break;
+ case TK_signed : declspec.setSigned(true); break;
+ case TK_unsigned : declspec.setUnsigned(true); break;
+ case TK_float : declspec.setType(Kind.eFloat); break;
+ case TK_double : declspec.setType(Kind.eDouble); break;
+ case TK_void : declspec.setType(Kind.eVoid); break;
+
+ default:
+ assert false : "type parsed wrong"; //$NON-NLS-1$
+ declspec.setType(Kind.eUnspecified);
+ break;
+ }
+ ((ASTNode) declspec).setOffset(token.getStartOffset());
+ int ruleLength = token.getEndOffset() - token.getStartOffset();
+ ((ASTNode) declspec).setLength(ruleLength < 0 ? 0 : ruleLength);
+
+ return declspec;
+
+
+ }
+
/**
* postfix_expression
@@ -362,8 +405,9 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
IASTExpression expr = (IASTExpression) astStack.pop();
IASTDeclarator declarator = (IASTDeclarator) astStack.pop();
IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop();
-
- IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr);
+ //CDT_70_FIX_FROM_50-#2
+ //IASTInitializerExpression initializer = nodeFactory.newInitializerExpression(expr);
+ IASTEqualsInitializer initializer = nodeFactory.newEqualsInitializer(expr);
ParserUtil.setOffsetAndLength(initializer, offset(expr), length(expr));
declarator.setInitializer(initializer);
@@ -1029,7 +1073,8 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
case TK_signed: n.setSigned(true); return;
case TK_unsigned: n.setUnsigned(true); return;
- case TK_long: n.setLong(true); return;
+ //if it is a longlong, donot set long, CDT_70_FIX_FROM_50-#8
+ case TK_long: if(!n.isLongLong()) n.setLong(true); return;
case TK_short: n.setShort(true); return;
}
}
@@ -1474,8 +1519,16 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* ::= '(' expression_list ')'
*/
public void consumeInitializerConstructor() {
- IASTExpression expression = (IASTExpression) astStack.pop();
- ICPPASTConstructorInitializer initializer = nodeFactory.newConstructorInitializer(expression);
+ //CDT_70_FIX_FROM_50-#5
+ Object o = astStack.pop();
+ IASTInitializerClause[] initClauseList =null;
+ if(o instanceof IASTExpressionList){
+ initClauseList = ((IASTExpressionList) o).getExpressions();
+ }else if(o instanceof IASTInitializerClause){
+ initClauseList = new IASTInitializerClause[]{(IASTInitializerClause)o};
+ }
+
+ ICPPASTConstructorInitializer initializer = nodeFactory.newConstructorInitializer(initClauseList);
setOffsetAndLength(initializer);
astStack.push(initializer);
}
@@ -1566,8 +1619,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
List<Object> handlers = isTryBlockDeclarator ? astStack.closeScope() : Collections.emptyList();
IASTCompoundStatement body = (IASTCompoundStatement) astStack.pop();
List<Object> initializers = astStack.closeScope();
- IASTFunctionDeclarator declarator = (IASTFunctionDeclarator) astStack.pop();
- IASTDeclSpecifier declSpec = (IASTDeclSpecifier) astStack.pop(); // may be null
+ Object o = astStack.pop();
+ IASTFunctionDeclarator declarator = (IASTFunctionDeclarator) o;
+ Object o2 = astStack.pop();
+ IASTDeclSpecifier declSpec = (IASTDeclSpecifier) o2; // may be null
if(declSpec == null) { // can happen if implicit int is used
declSpec = nodeFactory.newSimpleDeclSpecifier();
@@ -1620,12 +1675,15 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
*/
public void consumeMemberDeclaratorWithInitializer() {
- IASTInitializerExpression initializer = (IASTInitializerExpression) astStack.pop();
+
+ //CDT_70_FIX_FROM_50-#2
+ //IASTInitializerExpression initializer = (IASTInitializerExpression) astStack.pop();
+ IASTEqualsInitializer initializer = (IASTEqualsInitializer) astStack.pop();
IASTDeclarator declarator = (IASTDeclarator) astStack.peek();
setOffsetAndLength(declarator);
if(declarator instanceof ICPPASTFunctionDeclarator) {
- IASTExpression expr = initializer.getExpression();
+ IASTExpression expr = (IASTExpression)initializer.getInitializerClause();
if(expr instanceof IASTLiteralExpression && "0".equals(expr.toString())) { //$NON-NLS-1$
((ICPPASTFunctionDeclarator)declarator).setPureVirtual(true);
return;

Back to the top