From 215d87e7ae3c6ee18aa166e86c927045040d1367 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Wed, 7 May 2008 09:13:03 +0000 Subject: [PATCH] Fixes endless loop of content assist within c-initializer clause, bug 230389. --- .../core/dom/parser/c/GNUCSourceParser.java | 18 +++++++++--------- .../text/contentassist2/CompletionTests.java | 15 +++++++++++++++ .../contentassist2/CompletionTests_PlainC.java | 11 +++++++++++ 3 files changed, 35 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index b98e4566222..d0e75884560 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -184,7 +184,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { } for (;;) { - int checkHashcode = LA(1).hashCode(); + final IToken startToken= LA(1); // required at least one initializer list // get designator list List newDesignators = designatorList(); @@ -208,18 +208,18 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { desigInitializer.setOperandInitializer(initializer); result.addInitializer(desigInitializer); } - // can end with just a '}' - if (LT(1) == IToken.tRBRACE) - break; - // can end with ", }" + // can end with ", }" or "}" if (LT(1) == IToken.tCOMMA) consume(); if (LT(1) == IToken.tRBRACE) break; - if (checkHashcode == LA(1).hashCode()) { - IToken l2 = LA(1); - throwBacktrack(startingOffset, l2.getEndOffset() - - startingOffset); + + final IToken nextToken= LA(1); + if (nextToken.getType() == IToken.tEOC) { + return result; + } + if (nextToken == startToken) { + throwBacktrack(startingOffset, nextToken.getEndOffset() - startingOffset); return null; } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java index bf42f1af855..6995fe158b5 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests.java @@ -203,6 +203,10 @@ public class CompletionTests extends AbstractContentAssistTest { assertContentAssistResults(offset, expected, true, compareType); } + protected void assertCompletionResults(String[] expected) throws Exception { + assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_REP_STRINGS); + } + //void gfunc() {C1 v; v.m/*cursor*/ public void _testLocalVariable() throws Exception { // fails because of additional m1private(void) @@ -1132,4 +1136,15 @@ public class CompletionTests extends AbstractContentAssistTest { final String[] expected= {"blocal"}; assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_REP_STRINGS); } + + // enum {enum0, enum1, enum2}; + // typedef struct { + // int byte1; + // int byte2; + // } MYSTRUCT_TYPE; + // static const MYSTRUCT_TYPE myArrayOfStructs[] = {{enum/*cursor*/ + public void testCompletionInInitializerList_Bug230389() throws Exception { + final String[] expected= {"enum0", "enum1", "enum2"}; + assertCompletionResults(expected); + } } diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java index ab86da478de..f4166f0aa7e 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/contentassist2/CompletionTests_PlainC.java @@ -928,4 +928,15 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest { final String[] expected= {"pIShell"}; assertCompletionResults(expected); } + + // enum {enum0, enum1, enum2}; + // typedef struct { + // int byte1; + // int byte2; + // } MYSTRUCT_TYPE; + // static const MYSTRUCT_TYPE myArrayOfStructs[] = {{enum/*cursor*/ + public void testCompletionInInitializerList_Bug230389() throws Exception { + final String[] expected= {"enum0", "enum1", "enum2"}; + assertCompletionResults(expected); + } }