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:
parent
35c98f1798
commit
84d57de16e
3 changed files with 72 additions and 9 deletions
|
@ -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$
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue