mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-19 06:55:23 +02:00
Fixed 84375 - [Lengths] ICPPASTBaseSpecifier doesn't include the IASTName in its length
This commit is contained in:
parent
649f447a2d
commit
f1819be172
2 changed files with 27 additions and 2 deletions
|
@ -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.IASTTranslationUnit;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
import org.eclipse.cdt.core.dom.ast.IASTTypeId;
|
||||||
import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression;
|
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.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
|
||||||
import org.eclipse.cdt.core.parser.ParserLanguage;
|
import org.eclipse.cdt.core.parser.ParserLanguage;
|
||||||
import org.eclipse.cdt.internal.core.parser.ParserException;
|
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$
|
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 {
|
public void testElaboratedTypeSpecifier() throws ParserException {
|
||||||
String code = "/* blah */ struct A anA; /* blah */"; //$NON-NLS-1$
|
String code = "/* blah */ struct A anA; /* blah */"; //$NON-NLS-1$
|
||||||
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
for (ParserLanguage p = ParserLanguage.C; p != null; p = (p == ParserLanguage.C) ? ParserLanguage.CPP
|
||||||
|
|
|
@ -4027,7 +4027,10 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
switch (LT(1)) {
|
switch (LT(1)) {
|
||||||
case IToken.t_virtual:
|
case IToken.t_virtual:
|
||||||
if (firstToken == null)
|
if (firstToken == null)
|
||||||
|
{
|
||||||
firstToken = consume(IToken.t_virtual);
|
firstToken = consume(IToken.t_virtual);
|
||||||
|
last = firstToken;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
last = consume(IToken.t_virtual);
|
last = consume(IToken.t_virtual);
|
||||||
isVirtual = true;
|
isVirtual = true;
|
||||||
|
@ -4035,21 +4038,30 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
case IToken.t_public:
|
case IToken.t_public:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_public;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_public;
|
||||||
if (firstToken == null)
|
if (firstToken == null)
|
||||||
|
{
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
|
last = firstToken;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
case IToken.t_protected:
|
case IToken.t_protected:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_protected;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_protected;
|
||||||
if (firstToken == null)
|
if (firstToken == null)
|
||||||
|
{
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
|
last = firstToken;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
case IToken.t_private:
|
case IToken.t_private:
|
||||||
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_private;
|
visibility = ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier.v_private;
|
||||||
if (firstToken == null)
|
if (firstToken == null)
|
||||||
|
{
|
||||||
firstToken = consume();
|
firstToken = consume();
|
||||||
|
last = firstToken;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
last = consume();
|
last = consume();
|
||||||
break;
|
break;
|
||||||
|
@ -4058,6 +4070,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
//to get templates right we need to use the class as the scope
|
//to get templates right we need to use the class as the scope
|
||||||
ITokenDuple d = name();
|
ITokenDuple d = name();
|
||||||
name = createName(d);
|
name = createName(d);
|
||||||
|
if( firstToken == null )
|
||||||
|
firstToken = d.getFirstToken();
|
||||||
last = d.getLastToken();
|
last = d.getLastToken();
|
||||||
break;
|
break;
|
||||||
case IToken.tCOMMA:
|
case IToken.tCOMMA:
|
||||||
|
@ -4094,7 +4108,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
||||||
if (firstToken != null)
|
if (firstToken != null)
|
||||||
((ASTNode) baseSpec)
|
((ASTNode) baseSpec)
|
||||||
.setOffsetAndLength(firstToken.getOffset(), last
|
.setOffsetAndLength(firstToken.getOffset(), last
|
||||||
.getOffset()
|
.getEndOffset()
|
||||||
- firstToken.getOffset());
|
- firstToken.getOffset());
|
||||||
baseSpec.setVirtual(isVirtual);
|
baseSpec.setVirtual(isVirtual);
|
||||||
baseSpec.setVisibility(visibility);
|
baseSpec.setVisibility(visibility);
|
||||||
|
|
Loading…
Add table
Reference in a new issue