mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-23 16:23:52 +02:00
Fixes endless loop of content assist within c-initializer clause, bug 230389.
This commit is contained in:
parent
b8817c486c
commit
215d87e7ae
3 changed files with 35 additions and 9 deletions
|
@ -184,7 +184,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
int checkHashcode = LA(1).hashCode();
|
final IToken startToken= LA(1);
|
||||||
// required at least one initializer list
|
// required at least one initializer list
|
||||||
// get designator list
|
// get designator list
|
||||||
List<IASTNode> newDesignators = designatorList();
|
List<IASTNode> newDesignators = designatorList();
|
||||||
|
@ -208,18 +208,18 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
desigInitializer.setOperandInitializer(initializer);
|
desigInitializer.setOperandInitializer(initializer);
|
||||||
result.addInitializer(desigInitializer);
|
result.addInitializer(desigInitializer);
|
||||||
}
|
}
|
||||||
// can end with just a '}'
|
// can end with ", }" or "}"
|
||||||
if (LT(1) == IToken.tRBRACE)
|
|
||||||
break;
|
|
||||||
// can end with ", }"
|
|
||||||
if (LT(1) == IToken.tCOMMA)
|
if (LT(1) == IToken.tCOMMA)
|
||||||
consume();
|
consume();
|
||||||
if (LT(1) == IToken.tRBRACE)
|
if (LT(1) == IToken.tRBRACE)
|
||||||
break;
|
break;
|
||||||
if (checkHashcode == LA(1).hashCode()) {
|
|
||||||
IToken l2 = LA(1);
|
final IToken nextToken= LA(1);
|
||||||
throwBacktrack(startingOffset, l2.getEndOffset()
|
if (nextToken.getType() == IToken.tEOC) {
|
||||||
- startingOffset);
|
return result;
|
||||||
|
}
|
||||||
|
if (nextToken == startToken) {
|
||||||
|
throwBacktrack(startingOffset, nextToken.getEndOffset() - startingOffset);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,10 @@ public class CompletionTests extends AbstractContentAssistTest {
|
||||||
assertContentAssistResults(offset, expected, true, compareType);
|
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*/
|
//void gfunc() {C1 v; v.m/*cursor*/
|
||||||
public void _testLocalVariable() throws Exception {
|
public void _testLocalVariable() throws Exception {
|
||||||
// fails because of additional m1private(void)
|
// fails because of additional m1private(void)
|
||||||
|
@ -1132,4 +1136,15 @@ public class CompletionTests extends AbstractContentAssistTest {
|
||||||
final String[] expected= {"blocal"};
|
final String[] expected= {"blocal"};
|
||||||
assertCompletionResults(fCursorOffset, expected, AbstractContentAssistTest.COMPARE_REP_STRINGS);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -928,4 +928,15 @@ public class CompletionTests_PlainC extends AbstractContentAssistTest {
|
||||||
final String[] expected= {"pIShell"};
|
final String[] expected= {"pIShell"};
|
||||||
assertCompletionResults(expected);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue