From 52794aa29c359bd7968cc1715d77a3466634e55f Mon Sep 17 00:00:00 2001 From: Milivoje Legenovic Date: Tue, 3 Mar 2015 23:37:29 +0100 Subject: [PATCH] Bug 460551. C++11 Keyword 'final' not supported in code formatter Change-Id: I87db78c4b848f2a469c8a0cd53caa6c60aa3adca Signed-off-by: Milivoje Legenovic --- .../formatter/CodeFormatterVisitor.java | 16 +++++++++++ .../cdt/ui/tests/text/CodeFormatterTest.java | 27 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java index 1a8767025b7..f03dd5c0718 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java @@ -104,6 +104,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; @@ -386,6 +387,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, shouldVisitBaseSpecifiers = true; shouldVisitNamespaces = true; shouldVisitTemplateParameters = true; + shouldVisitVirtSpecifiers = true; } private final Scanner localScanner; @@ -1828,6 +1830,12 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, name.accept(this); } + ICPPASTClassVirtSpecifier virtSpecifier = node.getVirtSpecifier(); + if (virtSpecifier != null) { + scribe.space(); + virtSpecifier.accept(this); + } + // Base specifiers final List baseSpecifiers= Arrays.asList(node.getBaseSpecifiers()); if (baseSpecifiers.size() > 0) { @@ -3459,6 +3467,14 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, return PROCESS_SKIP; } + @Override + public int visit(ICPPASTClassVirtSpecifier node) { + if (node.getKind() == ICPPASTClassVirtSpecifier.SpecifierKind.Final) { + scribe.printNextToken(Token.t_final); + } + return PROCESS_SKIP; + } + private int visit(IASTReturnStatement node) { scribe.printNextToken(Token.t_return); final IASTExpression expression = node.getReturnValue(); diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java index b6cac775e7a..bdba71323b6 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java @@ -356,6 +356,33 @@ public class CodeFormatterTest extends BaseUITestCase { assertFormatterResult(); } + //class A final { + //public: + //A(); + //}; + + //class A final { + //public: + // A(); + //}; + public void testKeywordFinal_Bug460551() throws Exception { + assertFormatterResult(); + } + + //class A + //final : public B { + //public: + //A(); + //}; + + //class A final : public B { + //public: + // A(); + //}; + public void testKeywordFinalDerivedClass_Bug460551() throws Exception { + assertFormatterResult(); + } + //template class B {}; //template > class A {};