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.IASTIfStatement;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
import org.eclipse.cdt.core.dom.ast.IASTInitializer;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTInitializerExpression;
|
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.IASTNode;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTNullStatement;
|
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.ICPPASTNamedTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
|
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.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.core.parser.ParserLanguage;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
|
||||||
import org.eclipse.cdt.internal.core.parser.ParserException;
|
import org.eclipse.cdt.internal.core.parser.ParserException;
|
||||||
|
@ -735,4 +738,18 @@ public class DOMLocationTests extends AST2BaseTest {
|
||||||
assertEquals("return integer;", compound.getStatements()[1].getRawSignature());
|
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.dom.parser.IASTAmbiguousStatement;
|
||||||
import org.eclipse.cdt.internal.core.parser.SimpleDeclarationStrategy;
|
import org.eclipse.cdt.internal.core.parser.SimpleDeclarationStrategy;
|
||||||
import org.eclipse.cdt.internal.core.parser.TemplateParameterManager;
|
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.OperatorTokenDuple;
|
||||||
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
|
import org.eclipse.cdt.internal.core.parser.token.TokenFactory;
|
||||||
|
|
||||||
|
@ -2582,10 +2583,17 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
ICPPASTTemplateId result = new CPPASTTemplateId();
|
ICPPASTTemplateId result = new CPPASTTemplateId();
|
||||||
((ASTNode) result).setOffsetAndLength(duple.getStartOffset(), duple
|
((ASTNode) result).setOffsetAndLength(duple.getStartOffset(), duple
|
||||||
.getEndOffset() - duple.getStartOffset());
|
.getEndOffset() - duple.getStartOffset());
|
||||||
char[] image = duple.extractNameFromTemplateId();
|
CPPASTName templateIdName= null;
|
||||||
CPPASTName templateIdName = (CPPASTName) createName();
|
if (duple instanceof BasicTokenDuple) {
|
||||||
templateIdName.setOffsetAndLength(duple.getStartOffset(), image.length);
|
ITokenDuple nameDuple= ((BasicTokenDuple)duple).getTemplateIdNameTokenDuple();
|
||||||
templateIdName.setName(image);
|
templateIdName= (CPPASTName) createName(nameDuple);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
templateIdName= (CPPASTName) createName();
|
||||||
|
char[] image = duple.extractNameFromTemplateId();
|
||||||
|
templateIdName.setOffsetAndLength(duple.getStartOffset(), image.length);
|
||||||
|
templateIdName.setName(image);
|
||||||
|
}
|
||||||
result.setTemplateName(templateIdName);
|
result.setTemplateName(templateIdName);
|
||||||
if (duple.getTemplateIdArgLists() != null) {
|
if (duple.getTemplateIdArgLists() != null) {
|
||||||
List args = duple.getTemplateIdArgLists()[0];
|
List args = duple.getTemplateIdArgLists()[0];
|
||||||
|
|
|
@ -234,7 +234,7 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
if( prev != null && prev.getType() != IToken.tCOLONCOLON &&
|
if( prev != null && prev.getType() != IToken.tCOLONCOLON &&
|
||||||
prev.getType() != IToken.tIDENTIFIER &&
|
prev.getType() != IToken.tIDENTIFIER &&
|
||||||
prev.getType() != IToken.tLT &&
|
prev.getType() != IToken.tLT &&
|
||||||
prev.getType() != IToken.tCOMPL &&
|
prev.getType() != IToken.tBITCOMPLEMENT &&
|
||||||
iter.getType() != IToken.tGT &&
|
iter.getType() != IToken.tGT &&
|
||||||
prev.getType() != IToken.tLBRACKET &&
|
prev.getType() != IToken.tLBRACKET &&
|
||||||
iter.getType() != IToken.tRBRACKET &&
|
iter.getType() != IToken.tRBRACKET &&
|
||||||
|
@ -267,7 +267,7 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
prev.getType() != IToken.tCOLONCOLON &&
|
prev.getType() != IToken.tCOLONCOLON &&
|
||||||
prev.getType() != IToken.tIDENTIFIER &&
|
prev.getType() != IToken.tIDENTIFIER &&
|
||||||
prev.getType() != IToken.tLT &&
|
prev.getType() != IToken.tLT &&
|
||||||
prev.getType() != IToken.tCOMPL &&
|
prev.getType() != IToken.tBITCOMPLEMENT &&
|
||||||
iter.getType() != IToken.tGT &&
|
iter.getType() != IToken.tGT &&
|
||||||
prev.getType() != IToken.tLBRACKET &&
|
prev.getType() != IToken.tLBRACKET &&
|
||||||
iter.getType() != IToken.tRBRACKET &&
|
iter.getType() != IToken.tRBRACKET &&
|
||||||
|
@ -397,7 +397,7 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
}
|
}
|
||||||
switch( iter.getType() )
|
switch( iter.getType() )
|
||||||
{
|
{
|
||||||
case IToken.tCOMPL:
|
case IToken.tBITCOMPLEMENT:
|
||||||
case IToken.tIDENTIFIER:
|
case IToken.tIDENTIFIER:
|
||||||
case IToken.tCOLONCOLON:
|
case IToken.tCOLONCOLON:
|
||||||
case IToken.t_operator:
|
case IToken.t_operator:
|
||||||
|
@ -422,6 +422,44 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
return false;
|
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(){
|
public char[] extractNameFromTemplateId(){
|
||||||
ITokenDuple nameDuple = getLastSegment();
|
ITokenDuple nameDuple = getLastSegment();
|
||||||
|
|
||||||
|
@ -451,7 +489,7 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
//appending of spaces needs to be the same as in toString()
|
//appending of spaces needs to be the same as in toString()
|
||||||
|
|
||||||
//destructors
|
//destructors
|
||||||
if( i.getType() == IToken.tCOMPL ){
|
if( i.getType() == IToken.tBITCOMPLEMENT ){
|
||||||
i = i.getNext();
|
i = i.getNext();
|
||||||
tempArray = i.getCharImage();
|
tempArray = i.getCharImage();
|
||||||
CharArrayUtils.overWrite( nameBuffer, idx, tempArray );
|
CharArrayUtils.overWrite( nameBuffer, idx, tempArray );
|
||||||
|
@ -517,7 +555,7 @@ public class BasicTokenDuple implements ITokenDuple {
|
||||||
i = i.getNext();
|
i = i.getNext();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if( i.getType() == IToken.tCOMPL )
|
if( i.getType() == IToken.tBITCOMPLEMENT )
|
||||||
{
|
{
|
||||||
compl = true;
|
compl = true;
|
||||||
i = i.getNext();
|
i = i.getNext();
|
||||||
|
|
Loading…
Add table
Reference in a new issue