diff options
author | Vivian Kong | 2012-08-28 15:13:45 +0000 |
---|---|---|
committer | Vivian Kong | 2012-08-28 15:13:45 +0000 |
commit | 91aee26b6f0e3b718f3bc04d23136a19c13df308 (patch) | |
tree | a84a6e50d5acff0286745d3c79e3ad0651e5e551 | |
parent | 0a490147493083578778788083aa18e4dc92a445 (diff) | |
download | org.eclipse.cdt-91aee26b6f0e3b718f3bc04d23136a19c13df308.tar.gz org.eclipse.cdt-91aee26b6f0e3b718f3bc04d23136a19c13df308.tar.xz org.eclipse.cdt-91aee26b6f0e3b718f3bc04d23136a19c13df308.zip |
Bug 388243 - [LR parser] ICPPASTConstructorInitializer offsets did not
include parentheses
-rw-r--r-- | lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/cpp/CPPBuildASTParserAction.java | 45 |
1 files changed, 35 insertions, 10 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 45bbde2c65e..1b01bcb4d8b 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 @@ -17,13 +17,13 @@ import static org.eclipse.cdt.core.dom.lrparser.action.ParserUtil.offset; import static org.eclipse.cdt.core.parser.util.CollectionUtils.findFirstAndRemove; import static org.eclipse.cdt.core.parser.util.CollectionUtils.reverseIterable; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_ColonColon; -import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_SemiColon; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_Completion; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_EndOfCompletion; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_LeftBracket; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_LeftParen; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_RightBracket; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_RightParen; +import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_SemiColon; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_auto; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_bool; import static org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym.TK_char; @@ -80,7 +80,6 @@ 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.IASTForStatement; -import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; @@ -218,12 +217,17 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { public void consumeNewInitializer() { + IASTExpression expr; if(astStack.peek() == null) { // if there is an empty set of parens astStack.pop(); - IASTExpression initializer = nodeFactory.newExpressionList(); - setOffsetAndLength(initializer); - astStack.push(initializer); + expr = nodeFactory.newExpressionList(); + setOffsetAndLength(expr); + } else { + expr = (IASTExpression) astStack.pop(); // may be null } + ICPPASTConstructorInitializer initializer = nodeFactory.newConstructorInitializer(expr); + setOffsetAndLength(initializer); + astStack.push(initializer); } @@ -235,13 +239,13 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { * | dcolon_opt 'new' new_placement_opt '(' type_id ')' <openscope-ast> new_array_expressions_op new_initializer_opt */ public void consumeExpressionNew(boolean isNewTypeId) { - IASTExpression initializer = (IASTExpression) astStack.pop(); // may be null + ICPPASTConstructorInitializer initializer = (ICPPASTConstructorInitializer) astStack.pop(); // may be null List<Object> arrayExpressions = astStack.closeScope(); IASTTypeId typeId = (IASTTypeId) astStack.pop(); IASTExpression placement = (IASTExpression) astStack.pop(); // may be null boolean hasDoubleColon = astStack.pop() != null; - ICPPASTNewExpression newExpression = nodeFactory.newNewExpression(placement, initializer, typeId); + ICPPASTNewExpression newExpression = nodeFactory.newNewExpression(new IASTExpression[] {placement}, initializer, typeId); newExpression.setIsGlobal(hasDoubleColon); newExpression.setIsNewTypeId(isNewTypeId); setOffsetAndLength(newExpression); @@ -1681,9 +1685,30 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { * ::= mem_initializer_id '(' expression_list_opt ')' */ public void consumeConstructorChainInitializer() { - IASTExpression expr = (IASTExpression) astStack.pop(); - IASTName name = (IASTName) astStack.pop(); - ICPPASTConstructorChainInitializer initializer = nodeFactory.newConstructorChainInitializer(name, expr); + Object o = astStack.pop(); + IASTName name = (IASTName) astStack.pop(); + IASTInitializerClause[] initClauseList =null; + if(o instanceof IASTExpressionList){ + initClauseList = ((IASTExpressionList) o).getExpressions(); + }else if(o instanceof IASTInitializerClause){ + initClauseList = new IASTInitializerClause[]{(IASTInitializerClause)o}; + } + ICPPASTConstructorInitializer init = nodeFactory.newConstructorInitializer(initClauseList); + int rule_start_offset = stream.getLeftIToken().getStartOffset(); + int initClauseList_offset = ParserUtil.offset(initClauseList[0]); + List<IToken> ruleTokens = stream.getRuleTokens(); + int start_offset = -1; + + for (int i = initClauseList_offset, n = rule_start_offset; i >= n; i--){ + if(tokenMap.mapKind(ruleTokens.get(i).getKind()) == TK_LeftParen) { + start_offset = ruleTokens.get(i).getStartOffset(); + break; + } + } + int ruleLength = stream.getRightIToken().getEndOffset() - start_offset; + ParserUtil.setOffsetAndLength(init, start_offset, ruleLength < 0 ? 0 : ruleLength); + + ICPPASTConstructorChainInitializer initializer = nodeFactory.newConstructorChainInitializer(name, init); setOffsetAndLength(initializer); astStack.push(initializer); } |