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

Fix for 211444: Syntax highlighter produces incorrect coloring on dependant template instantiation.

This commit is contained in:
Anton Leherbauer 2007-12-04 10:29:15 +00:00
parent 35c98f1798
commit 84d57de16e
3 changed files with 72 additions and 9 deletions

View file

@ -33,6 +33,7 @@ import org.eclipse.cdt.core.dom.ast.IASTIdExpression;
import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
@ -60,6 +61,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.parser.ParserException;
@ -735,4 +738,18 @@ public class DOMLocationTests extends AST2BaseTest {
assertEquals("return integer;", compound.getStatements()[1].getRawSignature());
}
public void testTemplateIdNameLocation_Bug211444() throws Exception {
IASTTranslationUnit tu = parse( "Foo::template test<T> bar;", ParserLanguage.CPP ); //$NON-NLS-1$
CPPNameCollector col = new CPPNameCollector();
tu.accept( col );
ICPPASTQualifiedName qn = (ICPPASTQualifiedName) col.getName(0);
IASTName[] ns = qn.getNames();
assertTrue(ns[1] instanceof ICPPASTTemplateId);
ICPPASTTemplateId templateId= (ICPPASTTemplateId) ns[1];
IASTName templateIdName= templateId.getTemplateName();
assertEquals("test", templateIdName.getRawSignature()); //$NON-NLS-1$
}
}

View file

@ -151,6 +151,7 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousExpression;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement;
import org.eclipse.cdt.internal.core.parser.SimpleDeclarationStrategy;
import org.eclipse.cdt.internal.core.parser.TemplateParameterManager;
import org.eclipse.cdt.internal.core.parser.token.BasicTokenDuple;
import org.eclipse.cdt.internal.core.parser.token.OperatorTokenDuple;
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
@ -2582,10 +2583,17 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
ICPPASTTemplateId result = new CPPASTTemplateId();
((ASTNode) result).setOffsetAndLength(duple.getStartOffset(), duple
.getEndOffset() - duple.getStartOffset());
char[] image = duple.extractNameFromTemplateId();
CPPASTName templateIdName = (CPPASTName) createName();
templateIdName.setOffsetAndLength(duple.getStartOffset(), image.length);
templateIdName.setName(image);
CPPASTName templateIdName= null;
if (duple instanceof BasicTokenDuple) {
ITokenDuple nameDuple= ((BasicTokenDuple)duple).getTemplateIdNameTokenDuple();
templateIdName= (CPPASTName) createName(nameDuple);
}
else {
templateIdName= (CPPASTName) createName();
char[] image = duple.extractNameFromTemplateId();
templateIdName.setOffsetAndLength(duple.getStartOffset(), image.length);
templateIdName.setName(image);
}
result.setTemplateName(templateIdName);
if (duple.getTemplateIdArgLists() != null) {
List args = duple.getTemplateIdArgLists()[0];

View file

@ -234,7 +234,7 @@ public class BasicTokenDuple implements ITokenDuple {
if( prev != null && prev.getType() != IToken.tCOLONCOLON &&
prev.getType() != IToken.tIDENTIFIER &&
prev.getType() != IToken.tLT &&
prev.getType() != IToken.tCOMPL &&
prev.getType() != IToken.tBITCOMPLEMENT &&
iter.getType() != IToken.tGT &&
prev.getType() != IToken.tLBRACKET &&
iter.getType() != IToken.tRBRACKET &&
@ -267,7 +267,7 @@ public class BasicTokenDuple implements ITokenDuple {
prev.getType() != IToken.tCOLONCOLON &&
prev.getType() != IToken.tIDENTIFIER &&
prev.getType() != IToken.tLT &&
prev.getType() != IToken.tCOMPL &&
prev.getType() != IToken.tBITCOMPLEMENT &&
iter.getType() != IToken.tGT &&
prev.getType() != IToken.tLBRACKET &&
iter.getType() != IToken.tRBRACKET &&
@ -397,7 +397,7 @@ public class BasicTokenDuple implements ITokenDuple {
}
switch( iter.getType() )
{
case IToken.tCOMPL:
case IToken.tBITCOMPLEMENT:
case IToken.tIDENTIFIER:
case IToken.tCOLONCOLON:
case IToken.t_operator:
@ -422,6 +422,44 @@ public class BasicTokenDuple implements ITokenDuple {
return false;
}
public ITokenDuple getTemplateIdNameTokenDuple() {
ITokenDuple nameDuple = getLastSegment();
List [] argLists = getTemplateIdArgLists();
if( argLists == null || argLists[ argLists.length - 1 ] == null )
return nameDuple;
IToken i = nameDuple.getFirstToken();
IToken last = nameDuple.getLastToken();
if( i.getType() == IToken.t_template )
i = i.getNext();
if( i == last )
return TokenFactory.createTokenDuple(i, i);
IToken first= i;
//destructors
if( i.getType() == IToken.tBITCOMPLEMENT ){
i = i.getNext();
}
//operators
else if( i.getType() == IToken.t_operator ){
i = i.getNext();
IToken temp = null;
while( i != last ){
temp = i.getNext();
if( temp.getType() != IToken.tLT )
i = temp;
else
break;
}
}
return TokenFactory.createTokenDuple(first, i);
}
public char[] extractNameFromTemplateId(){
ITokenDuple nameDuple = getLastSegment();
@ -451,7 +489,7 @@ public class BasicTokenDuple implements ITokenDuple {
//appending of spaces needs to be the same as in toString()
//destructors
if( i.getType() == IToken.tCOMPL ){
if( i.getType() == IToken.tBITCOMPLEMENT ){
i = i.getNext();
tempArray = i.getCharImage();
CharArrayUtils.overWrite( nameBuffer, idx, tempArray );
@ -517,7 +555,7 @@ public class BasicTokenDuple implements ITokenDuple {
i = i.getNext();
continue;
}
if( i.getType() == IToken.tCOMPL )
if( i.getType() == IToken.tBITCOMPLEMENT )
{
compl = true;
i = i.getNext();