diff options
author | Hansruedi Patzen | 2018-05-29 11:21:41 +0000 |
---|---|---|
committer | Thomas Corbat | 2018-06-20 10:40:31 +0000 |
commit | bc4aa4597dc1c98b41f1ded9d2429115a4ff1268 (patch) | |
tree | 43dfb9f3e191471351e494d9ed3d2d278484f774 /core | |
parent | 4c66f7c8f3e2f839e6152f522054616b15baa45a (diff) | |
download | org.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.tar.gz org.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.tar.xz org.eclipse.cdt-bc4aa4597dc1c98b41f1ded9d2429115a4ff1268.zip |
Bug 535256: Rewrite removes attributes, key and base from C++ enum
Fix and tests.
Change-Id: I1f5519f833563378d87b3c932b754e29c3e32b06
Signed-off-by: Hansruedi Patzen <hansruedi.patzen@hsr.ch>
Signed-off-by: Thomas Corbat <tcorbat@hsr.ch>
Diffstat (limited to 'core')
10 files changed, 178 insertions, 10 deletions
diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java index 2b11860d4b7..4f036d03ace 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/rewrite/changegenerator/ReplaceTests.java @@ -55,6 +55,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition; @@ -1225,4 +1226,18 @@ public class ReplaceTests extends ChangeGeneratorTest { public void testCopyReplaceAttribute_Bug535275() throws Exception { compareCopyResult(new CopyReplaceVisitor(this, ICPPASTFunctionDeclarator.class::isInstance)); } + + //enum [[foo]] X : int [[bar]] { + //}; + public void testEnumReplacementRetainsAttributes_Bug535256_1() throws Exception { + compareCopyResult(new CopyReplaceVisitor(this, ICPPASTEnumerationSpecifier.class::isInstance)); + } + + //enum class EC { + //}; + //enum struct ES { + //}; + public void testScopedEnumReplacementRetains_Bug535256_2() throws Exception { + compareCopyResult(new CopyReplaceVisitor(this, ICPPASTEnumerationSpecifier.class::isInstance)); + } } diff --git a/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclarationTestSource.awts b/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclarationTestSource.awts index 09f789e593e..0228c738221 100644 --- a/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclarationTestSource.awts +++ b/core/org.eclipse.cdt.core.tests/resources/rewrite/ASTWriterDeclarationTestSource.awts @@ -194,3 +194,23 @@ namespace [[foo]] FOO __attribute__((__visibility__("default"))) } + +//!Attributed anonymous enum declaration +//%CPP +enum [[foo]] { }; + +//!Attributed named enum declaration +//%CPP +enum [[foo]] X{ }; + +//!Attributed anonymous enum with attributed base specifier +//%CPP +enum [[foo]] : int [[bar]] { }; + +//!Attributed scoped enum declaration with keyword struct +//%CPP +enum struct [[foo]] X{ }; + +//!Attributed scoped enum declaration with keyword class +//%CPP +enum class [[foo]] X{ }; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java index e419bdbda27..91de82621cd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTEnumerationSpecifier.java @@ -24,6 +24,15 @@ public interface ICPPASTEnumerationSpecifier extends IASTEnumerationSpecifier, I public static final ASTNodeProperty BASE_TYPE = new ASTNodeProperty( "ICPPASTEnumerationSpecifier.BASE_TYPE [ICPPASTDeclSpecifier]"); //$NON-NLS-1$ + /** + * @since 6.5 + */ + public enum ScopeStyle { + CLASS, + STRUCT, + NONE + } + @Override public ICPPASTEnumerationSpecifier copy(); @@ -35,8 +44,23 @@ public interface ICPPASTEnumerationSpecifier extends IASTEnumerationSpecifier, I /** * Not allowed on frozen AST. + * @deprecated Use setScopeToken instead + * If {@code isScoped == true} is passed, the {@code ScopeToken.CLASS} scope token is assumed. */ + @Deprecated public void setIsScoped(boolean isScoped); + + /** + * Not allowed on frozen AST. + * @since 6.5 + */ + public void setScopeStyle(ScopeStyle scopeStyle); + + /** + * @since 6.5 + */ + public ScopeStyle getScopeStyle(); + /** * An enum is scoped if it uses the enumeration head {@code enum class} or {@code enum struct}. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java index 659b040f4d9..b33183bd746 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java @@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IASTToken; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.INodeFactory; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUnaryTypeTransformation.Operator; import org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTArrayRangeDesignator; import org.eclipse.cdt.core.dom.parser.cpp.ICPPASTAttributeSpecifier; @@ -158,9 +159,17 @@ public interface ICPPNodeFactory extends INodeFactory { /** * @since 5.2 + * @deprecated Use {@code newEnumerationSpecifier(ScopeToken, IASTName, ICPPASTDeclSpecifier)} instead. + * If {@code isScoped == true} is passed {@code ScopeToken.CLASS} is assumed. */ + @Deprecated public ICPPASTEnumerationSpecifier newEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType); + /** + * @since 6.5 + */ + public ICPPASTEnumerationSpecifier newEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name, ICPPASTDeclSpecifier baseType); + public ICPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiation(IASTDeclaration declaration); @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java index 13016c30926..cec71154cee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTEnumerationSpecifier.java @@ -26,7 +26,7 @@ import org.eclipse.cdt.internal.core.dom.parser.IASTInternalEnumerationSpecifier */ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier implements IASTInternalEnumerationSpecifier, ICPPASTEnumerationSpecifier { - private boolean fIsScoped; + private ScopeStyle fScopeStyle; private boolean fIsOpaque; private IASTName fName; private ICPPASTDeclSpecifier fBaseType; @@ -40,12 +40,18 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier public CPPASTEnumerationSpecifier() { } + @Deprecated public CPPASTEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType) { - fIsScoped= isScoped; + this(isScoped ? ScopeStyle.CLASS : ScopeStyle.NONE, name, baseType); + } + + public CPPASTEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name, ICPPASTDeclSpecifier baseType) { + setScopeStyle(scopeStyle); setName(name); setBaseType(baseType); } + @Override public CPPASTEnumerationSpecifier copy() { return copy(CopyStyle.withoutLocations); @@ -53,7 +59,7 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier @Override public CPPASTEnumerationSpecifier copy(CopyStyle style) { - CPPASTEnumerationSpecifier copy = new CPPASTEnumerationSpecifier(fIsScoped, + CPPASTEnumerationSpecifier copy = new CPPASTEnumerationSpecifier(fScopeStyle, fName == null ? null : fName.copy(style), fBaseType == null ? null : fBaseType.copy(style)); copy.fIsOpaque = fIsOpaque; @@ -154,14 +160,25 @@ public class CPPASTEnumerationSpecifier extends CPPASTBaseDeclSpecifier } @Override + @Deprecated public void setIsScoped(boolean isScoped) { + setScopeStyle(isScoped ? ScopeStyle.CLASS : ScopeStyle.NONE); + } + + @Override + public void setScopeStyle(ScopeStyle scopeStyle) { assertNotFrozen(); - fIsScoped= isScoped; + fScopeStyle = scopeStyle; + } + + @Override + public ScopeStyle getScopeStyle() { + return fScopeStyle; } @Override public boolean isScoped() { - return fIsScoped; + return fScopeStyle != ScopeStyle.NONE; } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java index a95a3ebb0cb..a00303b0749 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java @@ -78,6 +78,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpressionList; @@ -381,14 +382,21 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { } @Override + @Deprecated public ICPPASTEnumerationSpecifier newEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType) { return new CPPASTEnumerationSpecifier(isScoped, name, baseType); } @Override + public ICPPASTEnumerationSpecifier newEnumerationSpecifier(ScopeStyle scopeStyle, IASTName name, + ICPPASTDeclSpecifier baseType) { + return new CPPASTEnumerationSpecifier(scopeStyle, name, baseType); + } + + @Override public ICPPASTEnumerationSpecifier newEnumerationSpecifier(IASTName name) { - return new CPPASTEnumerationSpecifier(false, name, null); + return new CPPASTEnumerationSpecifier(ScopeStyle.NONE, name, null); } @Override diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 0be1add28c3..77552c119af 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -95,6 +95,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier.ScopeStyle; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldDeclarator; @@ -3561,7 +3562,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { result= buildSimpleDeclSpec(storageClass, simpleType, options, isLong, typeofExpression, offset, endOffset); } addAttributeSpecifiers(attributes, result); - attributesEndOffset(endOffset, attributes); + endOffset = attributesEndOffset(endOffset, attributes); setRange(result, offset, endOffset); } catch (BacktrackException e) { if (returnToken != null) { @@ -3628,6 +3629,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { final int offset= consume(IToken.t_enum).getOffset(); int endOffset= 0; boolean isScoped= false; + ScopeStyle scopeStyle = ScopeStyle.NONE; IASTName name= null; ICPPASTDeclSpecifier baseType= null; List<IASTAttributeSpecifier> attributes = null; @@ -3635,7 +3637,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { try { int lt1= LT(1); if (lt1 == IToken.t_class || lt1 == IToken.t_struct) { - isScoped= true; + scopeStyle = (lt1 == IToken.t_class) ? ScopeStyle.CLASS : ScopeStyle.STRUCT; + isScoped = true; consume(); } // if __attribute__ or __declspec occurs after struct/union/class and before the identifier @@ -3676,7 +3679,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { name= getNodeFactory().newName(); } - final ICPPASTEnumerationSpecifier result= getNodeFactory().newEnumerationSpecifier(isScoped, name, baseType); + final ICPPASTEnumerationSpecifier result= getNodeFactory().newEnumerationSpecifier(scopeStyle, name, baseType); result.setIsOpaque(isOpaque); if (lt1 == IToken.tLBRACE) { endOffset= enumBody(result); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java index d6fbf974f06..6e5799667dd 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/DeclSpecWriter.java @@ -34,6 +34,7 @@ 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.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier; import org.eclipse.cdt.core.parser.GCCKeywords; @@ -225,8 +226,32 @@ public class DeclSpecWriter extends NodeWriter { private void writeEnumSpec(IASTEnumerationSpecifier enumSpec) { scribe.printStringSpace(Keywords.ENUM); - writeAttributes(enumSpec, EnumSet.of(SpaceLocation.AFTER)); + boolean isCppEnum = enumSpec instanceof ICPPASTEnumerationSpecifier; + if (isCppEnum) { + ICPPASTEnumerationSpecifier cppEnumSpec = (ICPPASTEnumerationSpecifier) enumSpec; + if (cppEnumSpec.isScoped()) { + switch (cppEnumSpec.getScopeStyle()) { + case CLASS: + scribe.printStringSpace(Keywords.CLASS); + break; + case STRUCT: + scribe.printStringSpace(Keywords.STRUCT); + break; + default: + break; + } + } + writeAttributes(cppEnumSpec, EnumSet.of(SpaceLocation.AFTER)); + } enumSpec.getName().accept(visitor); + if (isCppEnum) { + ICPPASTDeclSpecifier baseType = ((ICPPASTEnumerationSpecifier) enumSpec).getBaseType(); + if (baseType != null) { + scribe.print(SPACE_COLON_SPACE); + writeDelcSpec(baseType); + scribe.printSpace(); + } + } scribe.print('{'); scribe.printSpace(); IASTEnumerator[] enums = enumSpec.getEnumerators(); 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 4971c062091..6afe726bd4f 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 @@ -114,11 +114,13 @@ 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; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDecltypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeleteExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignatedInitializer; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDesignator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement; @@ -2059,6 +2061,19 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, name.accept(this); } + ICPPASTEnumerationSpecifier cppNode = null; + if (node instanceof ICPPASTEnumerationSpecifier) { + cppNode = (ICPPASTEnumerationSpecifier) node; + formatLeadingAttributes(cppNode); + ICPPASTDeclSpecifier baseType = cppNode.getBaseType(); + if (baseType != null) { + scribe.space(); + scribe.printNextToken(Token.tCOLON); + scribe.space(); + baseType.accept(this); + } + } + formatLeftCurlyBrace(line, preferences.brace_position_for_type_declaration); formatOpeningBrace(preferences.brace_position_for_type_declaration, preferences.insert_space_before_opening_brace_in_type_declaration); final int braceIndent= scribe.numberOfIndentations; 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 7bee37bdb97..208e7b1fefd 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 @@ -3538,4 +3538,36 @@ public class CodeFormatterTest extends BaseUITestCase { public void testAttributedNamesapces_Bug535274() throws Exception { assertFormatterResult(); } + + //enum[[foo]]{}; + + //enum [[foo]] { + //}; + public void testAttributedAnonymousEnumDeclaration_Bug535256_1() throws Exception { + assertFormatterResult(); + } + + //enum[[foo]] X{}; + + //enum [[foo]] X { + //}; + public void testAttributedNamedEnumDeclaration_Bug535256_2() throws Exception { + assertFormatterResult(); + } + + //enum[[foo]]:int [[bar]]{}; + + //enum [[foo]] : int [[bar]] { + //}; + public void testAttributedNamedEnumDeclarationWithAttributedBaseSpecifier_Bug535256_3() throws Exception { + assertFormatterResult(); + } + + //enum struct [[foo]] X{}; + + //enum struct [[foo]] X { + //}; + public void testAttributedNamedScopedEnumDeclaration_Bug535256_4() throws Exception { + assertFormatterResult(); + } } |