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:
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.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
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue