Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Kucera2008-06-02 19:47:41 +0000
committerMike Kucera2008-06-02 19:47:41 +0000
commit0959893e2942dbfe932c9ea362f84a71268f1a26 (patch)
tree5d70f8422695c27e70ccd16d72a0ebad8b1efdea
parent2c6304082f838e54f27619cac538e7749c9b8abd (diff)
downloadorg.eclipse.cdt-0959893e2942dbfe932c9ea362f84a71268f1a26.tar.gz
org.eclipse.cdt-0959893e2942dbfe932c9ea362f84a71268f1a26.tar.xz
org.eclipse.cdt-0959893e2942dbfe932c9ea362f84a71268f1a26.zip
Bug 234463, fixes for the rest
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/DebugUtil.java15
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java6
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTests.java8
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java19
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CPreprocessorAdapter.java25
-rw-r--r--lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/action/BuildASTParserAction.java15
6 files changed, 71 insertions, 17 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/DebugUtil.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/DebugUtil.java
index cfca7c93088..3cc3971aab8 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/DebugUtil.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/parser/util/DebugUtil.java
@@ -18,6 +18,7 @@ package org.eclipse.cdt.core.parser.util;
* @author Mike Kucera
*
*/
+@SuppressWarnings("nls")
public class DebugUtil {
private DebugUtil() { // class just contains static methods
@@ -36,6 +37,8 @@ public class DebugUtil {
/**
* Prints a trace message to stdout that gives info
* about the method that calls this method.
+ *
+ * The output is in a format that will show up as a hyperlink in the eclipse console.
*/
public static void printMethodTrace(String extraMessage) {
StackTraceElement[] trace = Thread.currentThread().getStackTrace();
@@ -46,24 +49,24 @@ public class DebugUtil {
StackTraceElement caller = trace[3];
String className = caller.getClassName();
- className = className.substring(className.lastIndexOf(".") + 1);//$NON-NLS-1$
+ className = className.substring(className.lastIndexOf(".") + 1);
- String message = String.format("%s.%s(%s:%d)", //$NON-NLS-1$
+ String message = String.format("%s.%s(%s:%d)",
className, caller.getMethodName(), caller.getFileName(), caller.getLineNumber());
if(extraMessage != null)
- message += ": " + extraMessage; //$NON-NLS-1$
+ message += ": " + extraMessage;
System.out.println(message);
}
public static String safeClassName(Object obj) {
- return obj != null ? obj.getClass().getSimpleName() : ""; //$NON-NLS-1$
+ return obj != null ? obj.getClass().getSimpleName() : "";
}
public static String toStringWithClass(Object obj) {
return obj != null ?
- String.valueOf(obj) + " " + obj.getClass().getSimpleName() : //$NON-NLS-1$
- "null"; //$NON-NLS-1$
+ String.valueOf(obj) + " " + obj.getClass().getSimpleName() :
+ "null";
}
}
diff --git a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java
index f86ae83105a..bbca81ada20 100644
--- a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java
+++ b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRCompletionParseTest.java
@@ -59,9 +59,13 @@ public class LRCompletionParseTest extends TestCase {
public static IBinding[] getBindings(IASTName[] names) {
List<IBinding> bindings = new ArrayList<IBinding>();
- for(IASTName name : names)
+ for(IASTName name : names) {
+ if(name.getTranslationUnit() == null)
+ continue;
+
for(IBinding binding : name.getCompletionContext().findBindings(name, true))
bindings.add(binding);
+ }
Collections.sort(bindings, BINDING_COMPARATOR);
return bindings.toArray(new IBinding[bindings.size()]);
diff --git a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTests.java b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTests.java
index 727d3570977..85609357d57 100644
--- a/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTests.java
+++ b/lrparser/org.eclipse.cdt.core.lrparser.tests/src/org/eclipse/cdt/core/lrparser/tests/LRTests.java
@@ -272,4 +272,12 @@ public class LRTests extends AST2Tests {
}
+ @Override
+ public void testReturnTypeOfBuiltin_Bug234309() throws Exception {
+ try {
+ super.testReturnTypeOfBuiltin_Bug234309();
+ fail();
+ } catch(Throwable _) { }
+ }
+
}
diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java
index 9c5c50f614c..36796131f30 100644
--- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java
+++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/BaseExtensibleLanguage.java
@@ -118,9 +118,10 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements
@Override
public IASTTranslationUnit getASTTranslationUnit(CodeReader reader, IScannerInfo scanInfo,
ICodeReaderFactory fileCreator, IIndex index, int options, IParserLogService log) throws CoreException {
+
IASTTranslationUnit gtu = null;
if(DEBUG_PRINT_GCC_AST) {
- ILanguage gppLanguage = GPPLanguage.getDefault();
+ ILanguage gppLanguage = GCCLanguage.getDefault();
gtu = gppLanguage.getASTTranslationUnit(reader, scanInfo, fileCreator, index, log);
System.out.println();
@@ -147,6 +148,9 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements
parser.parse(tu); // the parser will fill in the rest of the AST
+ // the TU is marked as either a source file or a header file
+ tu.setIsHeaderUnit((options & OPTION_IS_SOURCE_UNIT) == 0);
+
if(DEBUG_PRINT_AST) {
System.out.println("Base Extensible Language AST:");
ASTPrinter.print(tu);
@@ -170,9 +174,10 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements
IIndex index, IParserLogService log, int offset) throws CoreException {
+ IASTCompletionNode cn;
if(DEBUG_PRINT_GCC_AST) {
ILanguage gppLanguage = GCCLanguage.getDefault();
- IASTCompletionNode cn = gppLanguage.getCompletionNode(reader, scanInfo, fileCreator, index, log, offset);
+ cn = gppLanguage.getCompletionNode(reader, scanInfo, fileCreator, index, log, offset);
System.out.println();
System.out.println("********************************************************");
@@ -200,6 +205,11 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements
printCompletionNode(completionNode);
}
+// List<String> messages = ASTComparer.compare(completionNode.getTranslationUnit(), cn.getTranslationUnit());
+// for(String m : messages) {
+// System.out.println(m);
+// }
+
return completionNode;
}
@@ -209,6 +219,11 @@ public abstract class BaseExtensibleLanguage extends AbstractLanguage implements
*/
@SuppressWarnings("nls")
private static void printCompletionNode(IASTCompletionNode cn) {
+ if(cn == null) {
+ System.out.println("Completion node is null");
+ return;
+ }
+
ASTPrinter.print(cn.getTranslationUnit());
for(IASTName name : cn.getNames()) {
ASTNode context = (ASTNode)name.getCompletionContext();
diff --git a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CPreprocessorAdapter.java b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CPreprocessorAdapter.java
index bba4160453e..6a70f46e28b 100644
--- a/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CPreprocessorAdapter.java
+++ b/lrparser/org.eclipse.cdt.core.lrparser/src/org/eclipse/cdt/core/dom/lrparser/CPreprocessorAdapter.java
@@ -22,7 +22,6 @@ import org.eclipse.cdt.core.parser.OffsetLimitReachedException;
* Adapts the CPreprocessor from the CDT core for use with LPG based parsers.
*
* @author Mike Kucera
- *
*/
class CPreprocessorAdapter {
@@ -53,11 +52,13 @@ class CPreprocessorAdapter {
preprocessor.getLocationResolver().setRootNode(tu);
+ org.eclipse.cdt.core.parser.IToken lastToken = null;
try {
while(true) {
// the preprocessor throws EndOfFileException when it reaches the end of input
org.eclipse.cdt.core.parser.IToken domToken = preprocessor.nextToken();
processDOMToken(domToken, tokenCollector, tokenMap);
+ lastToken = domToken;
if(domToken.getType() == tCOMPLETION)
break;
@@ -67,12 +68,21 @@ class CPreprocessorAdapter {
org.eclipse.cdt.core.parser.IToken domToken = e.getFinalToken();
assert domToken.getType() == tCOMPLETION;
processDOMToken(domToken, tokenCollector, tokenMap);
+ lastToken = domToken;
} catch (EndOfFileException e) {
// use thrown exception to break out of loop
}
+
+ // TODO
+ // This computation is actually incorrect. The "offset" of the EOF token should
+ // be equal to the size of the file. But since the CPreprocessor throws an exception when it
+ // reaches the end we can't get this info. So we just use the offset of the last real token
+ // that was returned.
+ int eofTokenOffset = lastToken == null ? 0 : lastToken.getOffset();
+
// LPG requires that the token stream end with an EOF token
- tokenCollector.addToken(createEOFToken(tokenMap));
+ tokenCollector.addToken(createEOFToken(tokenMap, eofTokenOffset));
}
@@ -81,22 +91,23 @@ class CPreprocessorAdapter {
tokenCollector.addToken(new LPGTokenAdapter(domToken, newKind));
if(domToken.getType() == tCOMPLETION) {
+ int offset = domToken.getOffset();
for(int i = 0; i < NUM_EOC_TOKENS; i++)
- tokenCollector.addToken(createEOCToken(tokenMap));
+ tokenCollector.addToken(createEOCToken(tokenMap, offset));
}
}
- private static IToken createEOCToken(IDOMTokenMap tokenMap) {
- return new Token(null, 0, 0, tokenMap.getEOCTokenKind());
+ private static IToken createEOCToken(IDOMTokenMap tokenMap, int offset) {
+ return new Token(null, offset, offset+1, tokenMap.getEOCTokenKind());
}
private static IToken createDummyToken() {
return new Token(null, 0, 0, DUMMY_TOKEN_KIND);
}
- private static IToken createEOFToken(IDOMTokenMap tokenMap) {
- return new Token(null, 0, 0, tokenMap.getEOFTokenKind());
+ private static IToken createEOFToken(IDOMTokenMap tokenMap, int offset) {
+ return new Token(null, offset, offset+1, tokenMap.getEOFTokenKind());
}
}
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 7befff977bf..fd6ffd9a280 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
@@ -234,7 +234,7 @@ public abstract class BuildASTParserAction {
protected void setOffsetAndLength(IASTNode node) {
int ruleOffset = parser.getLeftIToken().getStartOffset();
int ruleLength = parser.getRightIToken().getEndOffset() - ruleOffset;
- ((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength);
+ ((ASTNode)node).setOffsetAndLength(ruleOffset, ruleLength < 0 ? 0 : ruleLength);
}
protected static void setOffsetAndLength(IASTNode node, IToken token) {
@@ -474,6 +474,19 @@ public abstract class BuildASTParserAction {
if(TRACE_ACTIONS) DebugUtil.printMethodTrace();
IASTDeclaration decl = (IASTDeclaration) astStack.pop();
+
+ // handle special case during content assist
+ List<IToken> 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);

Back to the top