1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

Bug 518628 Function declarator location misses virtual specifiers

- Change parser to include virtual specifier in function declarator
location
- Change DeclaratorWriter to write all virtual specifiers in their
initial order

Change-Id: Iff381394b834146c1b63877bc9eb84517d31e078
(cherry picked from commit 65eda42b16)
This commit is contained in:
Thomas Corbat 2017-06-22 13:20:47 +02:00
parent 34a3a01259
commit a834796fa8
4 changed files with 93 additions and 19 deletions

View file

@ -13,6 +13,8 @@ package org.eclipse.cdt.core.parser.tests.ast2;
import junit.framework.TestSuite;
import java.util.Arrays;
import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.IASTCastExpression;
import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
@ -673,5 +675,27 @@ public class DOMLocationTests extends AST2TestBase {
assertEquals("test", templateIdName.getRawSignature()); //$NON-NLS-1$
}
// struct Base {
// virtual void func1();
// virtual void func2();
// virtual void func3();
// virtual void func4();
// };
// struct Sub : Base {
// void func1() final;
// void func2() override;
// void func3() final override;
// void func4() override final;
// };
public void testFunctionDeclaratorLocationContainsVirtualSpecifiers_Bug518628() throws Exception {
String testCode = getAboveComment();
BindingAssertionHelper assertionHelper = getAssertionHelper(ParserLanguage.CPP);
String[] funcDeclaratorSignatures = new String[]{"func1() final", "func2() override", "func3() final override", "func4() override final"};
Arrays.stream(funcDeclaratorSignatures).forEach(signature -> {
IASTNode func1Declarator = assertionHelper.assertNode(signature, ICPPASTFunctionDeclarator.class);
assertFileLocation(func1Declarator, testCode, signature);
});
}
}

View file

@ -979,4 +979,43 @@ public class ReplaceTests extends ChangeGeneratorTest {
}
});
}
//struct B {
// virtual void func1();
// virtual void func2();
// virtual void func3();
// virtual void func4();
//};
//struct S : B{
// void func1() final;
// void func2() override;
// void func3() override final;
// void func4() final override;
//};
//struct B {
// virtual void func1();
// virtual void func2();
// virtual void func3();
// virtual void func4();
//};
//struct S : B{
// void func1() final;
// void func2() override;
// void func3() override final;
// void func4() final override;
//};
public void testReplaceFunctionDeclaratorWithVirtualSpecifier_Bug518628() throws Exception {
compareResult(new ASTVisitor() {
{
shouldVisitDeclarators = true;
}
@Override
public int visit(IASTDeclarator declarator) {
addModification(null, ModificationKind.REPLACE, declarator, declarator.copy());
return PROCESS_SKIP;
}
});
}
}

View file

@ -143,6 +143,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUnaryExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier.SpecifierKind;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisibilityLabel;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNodeFactory;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation;
@ -3862,21 +3863,23 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
while (true) {
IToken token = LAcatchEOF(1);
ContextSensitiveTokenType contextSensitiveType = getContextSensitiveType(token);
if (contextSensitiveType == null) {
break;
}
consume();
SpecifierKind specifierKind;
if (contextSensitiveType == ContextSensitiveTokenType.OVERRIDE) {
consume();
ICPPASTVirtSpecifier spec = getNodeFactory().newVirtSpecifier(
ICPPASTVirtSpecifier.SpecifierKind.Override);
setRange(spec, token.getOffset(), token.getOffset() + token.getLength());
typeRelevantDtor.addVirtSpecifier(spec);
specifierKind = ICPPASTVirtSpecifier.SpecifierKind.Override;
} else if (contextSensitiveType == ContextSensitiveTokenType.FINAL) {
consume();
ICPPASTVirtSpecifier spec = getNodeFactory().newVirtSpecifier(
ICPPASTVirtSpecifier.SpecifierKind.Final);
setRange(spec, token.getOffset(), token.getOffset() + token.getLength());
typeRelevantDtor.addVirtSpecifier(spec);
specifierKind = ICPPASTVirtSpecifier.SpecifierKind.Final;
} else {
break;
}
ICPPASTVirtSpecifier spec = getNodeFactory().newVirtSpecifier(specifierKind);
int endOffset = token.getOffset() + token.getLength();
setRange(spec, token.getOffset(), endOffset);
typeRelevantDtor.addVirtSpecifier(spec);
adjustEndOffset(typeRelevantDtor, endOffset);
}
}

View file

@ -35,6 +35,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator.RefQualifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVirtSpecifier.SpecifierKind;
import org.eclipse.cdt.core.dom.ast.gnu.c.ICASTKnRFunctionDeclarator;
import org.eclipse.cdt.core.parser.Keywords;
import org.eclipse.cdt.internal.core.dom.rewrite.commenthandler.NodeCommentMap;
@ -161,14 +163,7 @@ public class DeclaratorWriter extends NodeWriter {
scribe.printSpace();
scribe.print(Keywords.MUTABLE);
}
if (funcDec.isOverride()) {
scribe.printSpace();
scribe.print(Keywords.cOVERRIDE);
}
if (funcDec.isFinal()) {
scribe.printSpace();
scribe.print(Keywords.cFINAL);
}
writeVirtualSpecifiers(funcDec);
if (funcDec.isPureVirtual()) {
scribe.print(PURE_VIRTUAL);
}
@ -182,6 +177,19 @@ public class DeclaratorWriter extends NodeWriter {
}
}
public void writeVirtualSpecifiers(ICPPASTFunctionDeclarator funcDec) {
for (ICPPASTVirtSpecifier virtSpecifier : funcDec.getVirtSpecifiers()) {
scribe.printSpace();
SpecifierKind specifierKind = virtSpecifier.getKind();
if (specifierKind == SpecifierKind.Override) {
scribe.print(Keywords.cOVERRIDE);
}
if (specifierKind == SpecifierKind.Final) {
scribe.print(Keywords.cFINAL);
}
}
}
protected void writeExceptionSpecification(ICPPASTFunctionDeclarator funcDec, IASTTypeId[] exceptions,
ICPPASTExpression noexceptExpression) {
if (exceptions != ICPPASTFunctionDeclarator.NO_EXCEPTION_SPECIFICATION) {