From 84d57de16e7acd2d3abc7a1f3d72f48ae8a63ea1 Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Tue, 4 Dec 2007 10:29:15 +0000 Subject: [PATCH] Fix for 211444: Syntax highlighter produces incorrect coloring on dependant template instantiation. --- .../parser/tests/ast2/DOMLocationTests.java | 17 +++++++ .../dom/parser/cpp/GNUCPPSourceParser.java | 16 +++++-- .../core/parser/token/BasicTokenDuple.java | 48 +++++++++++++++++-- 3 files changed, 72 insertions(+), 9 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java index ab322579f1b..c4455782d83 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/DOMLocationTests.java @@ -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 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$ + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index ee04fdaae76..90329f1253e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -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]; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java index 5c23e0b4af9..83e8ce99b6c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/token/BasicTokenDuple.java @@ -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();