1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

A half hearted attempt at completion inside a template id.

This commit is contained in:
Doug Schaefer 2005-04-20 20:26:02 +00:00
parent 87d1920e2b
commit dd0c8223c8
2 changed files with 83 additions and 48 deletions

View file

@ -33,12 +33,35 @@ public class BasicCompletionTest extends CompletionTestBase {
testVar(getGCCCompletionNode(code.toString())); testVar(getGCCCompletionNode(code.toString()));
} }
private void testFunction(ASTCompletionNode node) throws Exception { public void testFunction() throws Exception {
StringBuffer code = new StringBuffer();
code.append("void func(int x) { }");
code.append("void func2() { fu");
// C++
ASTCompletionNode node = getGPPCompletionNode(code.toString());
IASTName[] names = node.getNames(); IASTName[] names = node.getNames();
// There are three names, one as an expression, one that isn't connected, one as a declaration
assertEquals(3, names.length);
// The expression points to our functions
IBinding[] bindings = names[0].resolvePrefix();
// There should be two since they both start with fu
assertEquals(2, bindings.length);
assertEquals("func", ((IFunction)bindings[0]).getName());
assertEquals("func2", ((IFunction)bindings[1]).getName());
// The second name shouldn't be hooked up
assertNull(names[1].getTranslationUnit());
// The declaration should point to nothing since there are no types
bindings = names[2].resolvePrefix();
assertEquals(0, bindings.length);
// C
node = getGCCCompletionNode(code.toString());
names = node.getNames();
// There are two names, one as an expression, one as a declaration // There are two names, one as an expression, one as a declaration
assertEquals(2, names.length); assertEquals(2, names.length);
// The expression points to our functions // The expression points to our functions
IBinding[] bindings = sortBindings(names[0].resolvePrefix()); bindings = sortBindings(names[0].resolvePrefix());
// There should be two since they both start with fu // There should be two since they both start with fu
assertEquals(2, bindings.length); assertEquals(2, bindings.length);
assertEquals("func", ((IFunction)bindings[0]).getName()); assertEquals("func", ((IFunction)bindings[0]).getName());
@ -47,29 +70,28 @@ public class BasicCompletionTest extends CompletionTestBase {
bindings = names[1].resolvePrefix(); bindings = names[1].resolvePrefix();
assertEquals(0, bindings.length); assertEquals(0, bindings.length);
} }
public void testFunction() throws Exception {
StringBuffer code = new StringBuffer();
code.append("void func(int x) { }");
code.append("void func2() { fu");
testFunction(getGPPCompletionNode(code.toString()));
testFunction(getGCCCompletionNode(code.toString()));
}
public void testTypedef(ASTCompletionNode node) {
IASTName[] names = node.getNames();
assertEquals(1, names.length);
IBinding[] bindings = names[0].resolvePrefix();
assertEquals(1, bindings.length);
assertEquals("blah", ((ITypedef)bindings[0]).getName());
}
public void testTypedef() throws Exception { public void testTypedef() throws Exception {
StringBuffer code = new StringBuffer(); StringBuffer code = new StringBuffer();
code.append("typedef int blah;"); code.append("typedef int blah;");
code.append("bl"); code.append("bl");
testTypedef(getGPPCompletionNode(code.toString()));
testTypedef(getGCCCompletionNode(code.toString())); // C++
ASTCompletionNode node = getGPPCompletionNode(code.toString());
IASTName[] names = node.getNames();
assertEquals(2, names.length);
assertNull(names[0].getTranslationUnit());
IBinding[] bindings = names[1].resolvePrefix();
assertEquals(1, bindings.length);
assertEquals("blah", ((ITypedef)bindings[0]).getName());
// C
node = getGCCCompletionNode(code.toString());
names = node.getNames();
assertEquals(1, names.length);
bindings = names[0].resolvePrefix();
assertEquals(1, bindings.length);
assertEquals("blah", ((ITypedef)bindings[0]).getName());
} }
} }

View file

@ -281,7 +281,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
templateIdScopes.push(IToken.tLT); templateIdScopes.push(IToken.tLT);
while (LT(1) != IToken.tGT) { while (LT(1) != IToken.tGT && LT(1) != IToken.tEOC) {
completedArg = false; completedArg = false;
IToken mark = mark(); IToken mark = mark();
@ -308,7 +308,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
if (LT(1) == IToken.tCOMMA) { if (LT(1) == IToken.tCOMMA) {
consume(); consume();
} else if (LT(1) != IToken.tGT) { } else if (LT(1) != IToken.tGT && LT(1) != IToken.tEOC) {
failed = true; failed = true;
endOffset = LA(1).getEndOffset(); endOffset = LA(1).getEndOffset();
break; break;
@ -420,7 +420,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
try { try {
List list = templateArgumentList(); List list = templateArgumentList();
argumentList.addSegment(list); argumentList.addSegment(list);
last = consume(IToken.tGT); switch (LT(1)) {
case IToken.tGT:
case IToken.tEOC:
last = consume();
break;
default:
throw backtrack;
}
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
argumentList.addSegment(null); argumentList.addSegment(null);
backup(secondMark); backup(secondMark);
@ -924,7 +931,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
try { try {
declSpecifier = declSpecifierSeq(true, true); declSpecifier = declSpecifierSeq(true, true);
declarator = declarator(SimpleDeclarationStrategy.TRY_CONSTRUCTOR, if (LT(1) != IToken.tEOC)
declarator = declarator(SimpleDeclarationStrategy.TRY_CONSTRUCTOR,
true, forNewExpression); true, forNewExpression);
} catch (BacktrackException bt) { } catch (BacktrackException bt) {
backup(mark); backup(mark);
@ -932,27 +940,29 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
declarator) declarator)
- startingOffset); - startingOffset);
} }
if (declarator == null || declarator.getName().toString() != null) //$NON-NLS-1$ if (declarator != null) {
{ if (declarator.getName().toString() != null)
backup(mark); {
throwBacktrack(startingOffset, figureEndOffset(declSpecifier, backup(mark);
declarator) throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
- startingOffset); declarator)
- startingOffset);
}
if (declSpecifier instanceof IASTSimpleDeclSpecifier
&& ((ASTNode) declSpecifier).getLength() == 0) {
backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator)
- startingOffset);
}
if (declarator instanceof IASTArrayDeclarator && skipArrayModifiers) {
backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator)
- startingOffset);
}
} }
if (declSpecifier instanceof IASTSimpleDeclSpecifier
&& ((ASTNode) declSpecifier).getLength() == 0) {
backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator)
- startingOffset);
}
if (declarator instanceof IASTArrayDeclarator && skipArrayModifiers) {
backup(mark);
throwBacktrack(startingOffset, figureEndOffset(declSpecifier,
declarator)
- startingOffset);
}
IASTTypeId result = createTypeId(); IASTTypeId result = createTypeId();
((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset( ((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset(
declSpecifier, declarator) declSpecifier, declarator)
@ -962,10 +972,12 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
declSpecifier.setParent(result); declSpecifier.setParent(result);
declSpecifier.setPropertyInParent(IASTTypeId.DECL_SPECIFIER); declSpecifier.setPropertyInParent(IASTTypeId.DECL_SPECIFIER);
result.setAbstractDeclarator(declarator); if (declarator != null) {
declarator.setParent(result); result.setAbstractDeclarator(declarator);
declarator.setPropertyInParent(IASTTypeId.ABSTRACT_DECLARATOR); declarator.setParent(result);
declarator.setPropertyInParent(IASTTypeId.ABSTRACT_DECLARATOR);
}
return result; return result;
} }
@ -3290,6 +3302,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
break; break;
case IToken.tCOLONCOLON: case IToken.tCOLONCOLON:
case IToken.tIDENTIFIER: case IToken.tIDENTIFIER:
case IToken.tCOMPLETION:
// TODO - Kludgy way to handle constructors/destructors // TODO - Kludgy way to handle constructors/destructors
if (flags.haveEncounteredRawType()) if (flags.haveEncounteredRawType())
break declSpecifiers; break declSpecifiers;