From 0fb0966c65be16459bb44a827d07869812f0bf5e Mon Sep 17 00:00:00 2001 From: Mike Kucera Date: Mon, 2 Jun 2008 23:45:01 +0000 Subject: [PATCH] Bug 235244, scope problem with C99 --- .../lrparser/action/BuildASTParserAction.java | 25 ++++++++----------- .../action/c99/C99BuildASTParserAction.java | 5 ++++ .../action/cpp/CPPBuildASTParserAction.java | 6 +++-- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java index fd6ffd9a280..945ff7ceb32 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java @@ -122,6 +122,12 @@ public abstract class BuildASTParserAction { protected abstract boolean isCompletionToken(IToken token); + /** + * Returns true if the token is an identifier. + */ + protected abstract boolean isIdentifierToken(IToken token); + + /** * Get the parser that will recognize expressions. */ @@ -474,19 +480,6 @@ public abstract class BuildASTParserAction { if(TRACE_ACTIONS) DebugUtil.printMethodTrace(); IASTDeclaration decl = (IASTDeclaration) astStack.pop(); - - // handle special case during content assist - List tokens = parser.getRuleTokens(); - if(tokens.size() == 2 && isCompletionToken(tokens.get(0))) { - IASTName name = createName(tokens.get(0)); - IASTIdExpression idExpression = nodeFactory.newIdExpression(name); - setOffsetAndLength(idExpression, offset(name), length(name)); - IASTExpressionStatement statement = nodeFactory.newExpressionStatement(idExpression); - setOffsetAndLength(statement, offset(name), length(name)); - astStack.push(statement); - return; - } - IASTDeclarationStatement declarationStatement = nodeFactory.newDeclarationStatement(decl); setOffsetAndLength(declarationStatement); @@ -505,9 +498,14 @@ public abstract class BuildASTParserAction { } } + + List tokens = parser.getRuleTokens(); + IASTNode result; if(expressionStatement == null) result = declarationStatement; + else if(tokens.size() == 2 && (isCompletionToken(tokens.get(0)) || isIdentifierToken(tokens.get(0)))) // identifier followed by semicolon + result = expressionStatement; else if(isImplicitInt(decl)) result = expressionStatement; else { @@ -555,7 +553,6 @@ public abstract class BuildASTParserAction { IASTDeclSpecifier declSpec = ((IASTSimpleDeclaration)declaration).getDeclSpecifier(); if(declSpec instanceof IASTSimpleDeclSpecifier && ((IASTSimpleDeclSpecifier)declSpec).getType() == IASTSimpleDeclSpecifier.t_unspecified) { - return true; } } diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java index fb6ccc87552..6d5589cefaa 100644 --- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java +++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/c99/C99BuildASTParserAction.java @@ -104,6 +104,11 @@ public class C99BuildASTParserAction extends BuildASTParserAction { return baseKind(token) == TK_Completion; } + @Override + protected boolean isIdentifierToken(IToken token) { + return baseKind(token) == TK_identifier; + } + @Override protected IParser getExpressionParser() { return new C99ExpressionParser(parser.getOrderedTerminalSymbols()); 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 1e71bb37fe5..bd985d63041 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 @@ -42,7 +42,6 @@ import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.IASTPointer; import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTProblemDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTProblemExpression; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTStatement; @@ -101,7 +100,6 @@ import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPParsersym; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPSizeofExpressionParser; import org.eclipse.cdt.internal.core.dom.lrparser.cpp.CPPTemplateTypeParameterParser; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTQualifiedName; import org.eclipse.cdt.internal.core.dom.parser.cpp.OverloadableOperator; @@ -142,6 +140,10 @@ public class CPPBuildASTParserAction extends BuildASTParserAction { return baseKind(token) == TK_Completion; } + @Override + protected boolean isIdentifierToken(IToken token) { + return baseKind(token) == TK_identifier; + } @Override