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.java35
1 files changed, 20 insertions, 15 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 bcec644a3b3..e81b0827bc4 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
@@ -88,11 +88,11 @@ import org.eclipse.cdt.core.dom.lrparser.util.DebugUtil;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTFunctionDeclarator;
/**
- * Semantic actions that build the AST during the parse. These are the actions
- * that are specific to the C++ parser.
+ * Semantic actions that build the AST during the parse.
+ * These are the actions that are specific to the C++ parser, the superclass
+ * contains actions that can be shared with the C99 parser.
*
* @author Mike Kucera
- *
*/
public class CPPBuildASTParserAction extends BuildASTParserAction {
@@ -633,6 +633,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeNestedNameSpecifierEmpty() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
+ // can't use Collections.EMPTY_LIST because we need a list thats mutable
astStack.push(new LinkedList<IASTName>());
if(TRACE_AST_STACK) System.out.println(astStack);
@@ -676,7 +677,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeQualifiedId(boolean hasTemplateKeyword) {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
- ICPPASTQualifiedName qualifiedName = subRuleQualifiedName(hasTemplateKeyword);
+ IASTName qualifiedName = subRuleQualifiedName(hasTemplateKeyword);
astStack.push(qualifiedName);
if(TRACE_AST_STACK) System.out.println(astStack);
@@ -688,7 +689,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* Creates a qualified name from a list of names (that must be in reverse order).
* Does not set the offset and length.
*/
- private ICPPASTQualifiedName createQualifiedName(LinkedList<IASTName> nestedNames, boolean hasDColon) {
+ private ICPPASTQualifiedName createQualifiedName(LinkedList<IASTName> nestedNames, boolean startsWithColonColon) {
ICPPASTQualifiedName qualifiedName = nodeFactory.newCPPQualifiedName();
int startOffset = offset(nestedNames.getLast());
@@ -698,8 +699,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
for(IASTName name : reverseIterable(nestedNames))
qualifiedName.addName(name);
- qualifiedName.setFullyQualified(hasDColon);
-
+ qualifiedName.setFullyQualified(startsWithColonColon);
return qualifiedName;
}
@@ -713,17 +713,22 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
* Does not place the resulting node on the stack, returns it instead.
*/
@SuppressWarnings("unchecked")
- private ICPPASTQualifiedName subRuleQualifiedName(boolean hasOptionalKeyword) {
- IASTName subName = (IASTName) astStack.pop();
+ private IASTName subRuleQualifiedName(boolean hasOptionalKeyword) {
+ IASTName lastName = (IASTName) astStack.pop();
if(hasOptionalKeyword) // this is usually a template keyword and can be ignored
astStack.pop();
LinkedList<IASTName> nestedNames = (LinkedList<IASTName>) astStack.pop();
- boolean hasDColon = astStack.pop() == PLACE_HOLDER;
+ boolean startsWithColonColon = astStack.pop() == PLACE_HOLDER;
+
+ if(nestedNames.isEmpty() && !startsWithColonColon) { // then its not a qualified name
+ return lastName;
+ }
+
+ nestedNames.addFirst(lastName); // the list of names is in reverse order
- nestedNames.addFirst(subName);
- return createQualifiedName(nestedNames, hasDColon);
+ return createQualifiedName(nestedNames, startsWithColonColon);
}
@@ -784,7 +789,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeNamespaceAliasDefinition() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
- ICPPASTQualifiedName qualifiedName = subRuleQualifiedName(false);
+ IASTName qualifiedName = subRuleQualifiedName(false);
IASTName alias = createName(parser.getRuleTokens().get(1));
ICPPASTNamespaceAlias namespaceAlias = nodeFactory.newNamespaceAlias(alias, qualifiedName);
@@ -803,7 +808,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeUsingDeclaration() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
- ICPPASTQualifiedName qualifiedName = subRuleQualifiedName(false);
+ IASTName qualifiedName = subRuleQualifiedName(false);
boolean hasTypenameKeyword = astStack.pop() == PLACE_HOLDER;
ICPPASTUsingDeclaration usingDeclaration = nodeFactory.newUsingDeclaration(qualifiedName);
@@ -823,7 +828,7 @@ public class CPPBuildASTParserAction extends BuildASTParserAction {
public void consumeUsingDirective() {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
- ICPPASTQualifiedName qualifiedName = subRuleQualifiedName(false);
+ IASTName qualifiedName = subRuleQualifiedName(false);
ICPPASTUsingDirective usingDirective = nodeFactory.newUsingDirective(qualifiedName);
setOffsetAndLength(usingDirective);

Back to the top