From f1819be172b404b097271e65480107abeda61edd Mon Sep 17 00:00:00 2001 From: John Camelon Date: Mon, 7 Feb 2005 17:26:27 +0000 Subject: [PATCH] Fixed 84375 - [Lengths] ICPPASTBaseSpecifier doesn't include the IASTName in its length --- .../core/parser/tests/ast2/DOMLocationTests.java | 13 ++++++++++++- .../core/dom/parser/cpp/GNUCPPSourceParser.java | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 2 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 353eae4eb6a..faf14a021a9 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 @@ -34,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.parser.ParserLanguage; import org.eclipse.cdt.internal.core.parser.ParserException; @@ -185,7 +186,17 @@ public class DOMLocationTests extends AST2BaseTest { assertSoleLocation( namedTypeSpec, code.indexOf( "\nA") + 1, 1 ); //$NON-NLS-1$ } - + public void testBug84375() throws Exception { + String code = "class D { public: int x; };\nclass C : public virtual D {};"; //$NON-NLS-1$ + IASTTranslationUnit tu = parse( code, ParserLanguage.CPP ); + IASTSimpleDeclaration d2 = (IASTSimpleDeclaration) tu.getDeclarations()[1]; + ICPPASTCompositeTypeSpecifier classSpec = (ICPPASTCompositeTypeSpecifier) d2.getDeclSpecifier(); + ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier [] bases = classSpec.getBaseSpecifiers(); + assertSoleLocation( bases[0], code.indexOf( "public virtual D"), "public virtual D".length() ); //$NON-NLS-1$ //$NON-NLS-2$ + + + } + public void testElaboratedTypeSpecifier() throws ParserException { String code = "/* blah */ struct A anA; /* blah */"; //$NON-NLS-1$ for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP 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 22ceca85e1b..febc206beea 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 @@ -4027,7 +4027,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (LT(1)) { case IToken.t_virtual: if (firstToken == null) + { firstToken = consume(IToken.t_virtual); + last = firstToken; + } else last = consume(IToken.t_virtual); isVirtual = true; @@ -4035,21 +4038,30 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { case IToken.t_public: visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_public; if (firstToken == null) + { firstToken = consume(); + last = firstToken; + } else last = consume(); break; case IToken.t_protected: visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_protected; if (firstToken == null) + { firstToken = consume(); + last = firstToken; + } else last = consume(); break; case IToken.t_private: visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_private; if (firstToken == null) + { firstToken = consume(); + last = firstToken; + } else last = consume(); break; @@ -4058,6 +4070,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { //to get templates right we need to use the class as the scope ITokenDuple d = name(); name = createName(d); + if( firstToken == null ) + firstToken = d.getFirstToken(); last = d.getLastToken(); break; case IToken.tCOMMA: @@ -4094,7 +4108,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { if (firstToken != null) ((ASTNode) baseSpec) .setOffsetAndLength(firstToken.getOffset(), last - .getOffset() + .getEndOffset() - firstToken.getOffset()); baseSpec.setVirtual(isVirtual); baseSpec.setVisibility(visibility);