From f70fc63eb68d009039d3b30bbb8025268d9323fe Mon Sep 17 00:00:00 2001 From: "alexey.afanasiev" Date: Fri, 14 Apr 2017 13:23:26 +0300 Subject: [PATCH] IDEA-170505 Strange formatting of Groovy enum with @Deprecated value --- .../auxiliary/annotations/Annotation.java | 16 ---------- .../auxiliary/modifiers/Modifiers.java | 7 ++++- .../typeDefinitions/members/EnumConstant.java | 4 +-- .../processors/GroovyIndentProcessor.java | 6 ++++ .../processors/GroovySpacingProcessor.java | 6 +++- .../lang/formatter/FormatterTest.groovy | 30 +++++++++++++++++++ .../statements/typedef/enums/enum10.test | 2 ++ .../statements/typedef/enums/enum11.test | 6 ++++ .../statements/typedef/enums/enum12.test | 2 ++ .../statements/typedef/enums/enum13.test | 2 ++ .../statements/typedef/enums/enum5.test | 2 ++ .../statements/typedef/enums/enum6.test | 2 ++ .../statements/typedef/enums/enum8.test | 4 +++ .../statements/typedef/enums/enum9.test | 2 ++ .../parsing/groovy/types/innerEnum.test | 14 +++++++++ 15 files changed, 85 insertions(+), 20 deletions(-) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/Annotation.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/Annotation.java index 3ddb9a7c32df..d9a65c89f522 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/Annotation.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/annotations/Annotation.java @@ -61,20 +61,4 @@ public class Annotation { annMarker.done(GroovyElementTypes.ANNOTATION); return true; } - - public static void parseAnnotationOptional(PsiBuilder builder, GroovyParser parser) { - PsiBuilder.Marker annOptMarker = builder.mark(); - - boolean hasAnnotations = false; - while (parse(builder, parser)) { - ParserUtils.getToken(builder, GroovyTokenTypes.mNLS); - hasAnnotations = true; - } - - if (hasAnnotations) { - annOptMarker.done(GroovyElementTypes.MODIFIERS); - } else { - annOptMarker.rollbackTo(); - } - } } diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/modifiers/Modifiers.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/modifiers/Modifiers.java index e540b5ac0990..0479294c8d01 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/modifiers/Modifiers.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/auxiliary/modifiers/Modifiers.java @@ -35,7 +35,12 @@ import org.jetbrains.plugins.groovy.lang.parser.parsing.util.ParserUtils; */ public class Modifiers { + public static boolean parse(PsiBuilder builder, GroovyParser parser) { + return parse(builder, parser, false); + } + + public static boolean parse(PsiBuilder builder, GroovyParser parser, boolean annotationsOnly) { PsiBuilder.Marker modifiersMarker = builder.mark(); boolean hasModifiers = false; @@ -44,7 +49,7 @@ public class Modifiers { final PsiBuilder.Marker modifierListItem = builder.mark(); if (hasModifiers) ParserUtils.getToken(builder, GroovyTokenTypes.mNLS); - final boolean parsed = Annotation.parse(builder, parser) || parseModifier(builder); + final boolean parsed = Annotation.parse(builder, parser) || (!annotationsOnly && parseModifier(builder)); if (parsed) { if (PathExpression.isQualificationDot(builder)) { diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/typeDefinitions/members/EnumConstant.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/typeDefinitions/members/EnumConstant.java index 5e19ee82f6a8..62ab051695ba 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/typeDefinitions/members/EnumConstant.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/typeDefinitions/members/EnumConstant.java @@ -21,7 +21,7 @@ import org.jetbrains.plugins.groovy.GroovyBundle; import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes; import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.parser.GroovyParser; -import org.jetbrains.plugins.groovy.lang.parser.parsing.auxiliary.annotations.Annotation; +import org.jetbrains.plugins.groovy.lang.parser.parsing.auxiliary.modifiers.Modifiers; import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.expressions.arguments.ArgumentList; import org.jetbrains.plugins.groovy.lang.parser.parsing.statements.typeDefinitions.TypeDefinition; import org.jetbrains.plugins.groovy.lang.parser.parsing.util.ParserUtils; @@ -35,7 +35,7 @@ public class EnumConstant { PsiBuilder.Marker ecMarker = builder.mark(); ParserUtils.getToken(builder, GroovyTokenTypes.mNLS); - Annotation.parseAnnotationOptional(builder, parser); + Modifiers.parse(builder, parser, true); if (!ParserUtils.getToken(builder, GroovyTokenTypes.mIDENT)) { ecMarker.rollbackTo(); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java index 67a30cf99952..b855ff506d6d 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovyIndentProcessor.java @@ -55,6 +55,7 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrImplements import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinitionBody; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrAnnotationMethod; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrEnumConstant; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.members.GrMethod; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement; import org.jetbrains.plugins.groovy.lang.psi.api.types.GrTypeArgumentList; @@ -228,6 +229,11 @@ public class GroovyIndentProcessor extends GroovyElementVisitor { myResult = Indent.getContinuationWithoutFirstIndent(); } + @Override + public void visitEnumConstant(@NotNull GrEnumConstant enumConstant) { + Indent.getNoneIndent(); + } + @Override public void visitDocComment(@NotNull GrDocComment comment) { if (myChildType != GroovyDocTokenTypes.mGDOC_COMMENT_START) { diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java index bd37decc15ca..c494530a1335 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/processors/GroovySpacingProcessor.java @@ -317,7 +317,11 @@ public class GroovySpacingProcessor extends GroovyElementVisitor { @Override public void visitEnumConstant(@NotNull GrEnumConstant enumConstant) { - manageSpaceBeforeCallLParenth(); + if (myType1 == GroovyElementTypes.MODIFIERS) { + createSpaceInCode(true); + } else { + manageSpaceBeforeCallLParenth(); + } } @Override diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy index f545f5a1c0c8..83cc58c9fe10 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.groovy @@ -688,6 +688,36 @@ def foooo( ''') } + void testEnumAnnotations() { + checkFormatting('''\ +enum GroovyEnum { + FOO, + @Deprecated + BAR(""), + DAR +} +''', '''\ +enum GroovyEnum { + FOO, + @Deprecated + BAR(""), + DAR +} +''') + } + + void testEnumAnnotationsSingleLine() { + checkFormatting('''\ +enum GroovyEnum { + @Deprecated BAR("") +} +''', '''\ +enum GroovyEnum { + @Deprecated BAR("") +} +''') + } + void testAlignFor() { groovySettings.ALIGN_MULTILINE_FOR = true checkFormatting('''\ diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum10.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum10.test index 789573d711d6..4e7caf757c65 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum10.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum10.test @@ -18,6 +18,8 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('CONST') PsiElement(new line)('\n ') Variable definitions diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum11.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum11.test index 86c5d1fc69e1..9d9c84d94e5c 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum11.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum11.test @@ -20,15 +20,21 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('Const1') PsiElement(new line)('\n ') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('Const2') PsiElement(,)(',') Enumeration constant PsiElement(new line)('\n ') + Modifiers + PsiElement(identifier)('Const3') PsiElement(new line)('\n ') Variable definitions diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum12.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum12.test index 3b815e198e89..127d34959284 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum12.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum12.test @@ -17,6 +17,8 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('Const') PsiElement(;)(';') PsiWhiteSpace(' ') diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum13.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum13.test index 1b12f0881842..9a8fb345b57e 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum13.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum13.test @@ -14,5 +14,7 @@ Groovy script PsiElement({)('{') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('CONST') PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum5.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum5.test index 1f2d2e8a4f97..17cc6c705649 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum5.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum5.test @@ -19,6 +19,8 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('foo') PsiWhiteSpace(' ') Arguments diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum6.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum6.test index 2ed2a2184094..d0a43174f19f 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum6.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum6.test @@ -17,6 +17,8 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('foo') PsiElement(new line)('\n') PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum8.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum8.test index ab9a1c2be4be..6826a41ce427 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum8.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum8.test @@ -18,11 +18,15 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('CONST1') PsiElement(new line)('\n ') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('CONST2') PsiElement(new line)('\n') PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum9.test b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum9.test index 16838b5dda14..b433081d23cd 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum9.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/typedef/enums/enum9.test @@ -17,6 +17,8 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('CONST1') PsiErrorElement:';', '}' or new line expected diff --git a/plugins/groovy/testdata/parsing/groovy/types/innerEnum.test b/plugins/groovy/testdata/parsing/groovy/types/innerEnum.test index bfa2b85653e5..76659bcf5fc3 100644 --- a/plugins/groovy/testdata/parsing/groovy/types/innerEnum.test +++ b/plugins/groovy/testdata/parsing/groovy/types/innerEnum.test @@ -37,30 +37,44 @@ Groovy script PsiWhiteSpace('\n ') Enumeration constants Enumeration constant + Modifiers + PsiElement(identifier)('SUNDAY') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('MONDAY') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('TUESDAY') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('WEDNESDAY') PsiElement(,)(',') Enumeration constant PsiElement(new line)('\n ') + Modifiers + PsiElement(identifier)('THURSDAY') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('FRIDAY') PsiElement(,)(',') PsiWhiteSpace(' ') Enumeration constant + Modifiers + PsiElement(identifier)('SATURDAY') PsiElement(new line)('\n ') PsiElement(})('}')