1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Fixed 84375 - [Lengths] ICPPASTBaseSpecifier doesn't include the IASTName in its length

This commit is contained in:
John Camelon 2005-02-07 17:26:27 +00:00
parent 649f447a2d
commit f1819be172
2 changed files with 27 additions and 2 deletions

View file

@ -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

View file

@ -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);