From 0a0c7c5f63fc8d952fc9f764fc7494f78c029fb6 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Mon, 27 Aug 2012 18:42:53 +0400 Subject: [PATCH] lambda: spaces around arrow --- .../JavaLanguageCodeStyleSettingsProvider.java | 3 ++- .../java/JavaSpacePropertyProcessor.java | 8 ++++++++ .../psi/impl/source/tree/ChildRole.java | 1 + .../tree/java/PsiLambdaExpressionImpl.java | 17 +++++++++++++++++ .../formatter/java/JavaFormatterSpaceTest.java | 12 ++++++++++++ .../CodeStyleSettingsCustomizable.java | 1 + .../psi/codeStyle/CommonCodeStyleSettings.java | 2 ++ .../options/codeStyle/CodeStyleSpacesPanel.java | 1 + .../src/messages/ApplicationBundle.properties | 3 ++- 9 files changed, 46 insertions(+), 2 deletions(-) diff --git a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java index 276014d4d094..8089f6c522c3 100644 --- a/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java +++ b/java/java-impl/src/com/intellij/ide/JavaLanguageCodeStyleSettingsProvider.java @@ -188,7 +188,8 @@ public class JavaLanguageCodeStyleSettingsProvider extends LanguageCodeStyleSett "public class Foo {\n" + " int[] X = new int[]{1, 3, 5, 6, 7, 87, 1213, 2};\n" + "\n" + - " public void foo(int x, int y) {\n" + + " public void foo(int x, int y) {" + + " Runnable r = () -> {};\n" + " for (int i = 0; i < x; i++) {\n" + " y += (y ^ 0x123) << 2;\n" + " }\n" + diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java index 60c2899abe5b..c533e7580253 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/JavaSpacePropertyProcessor.java @@ -1168,6 +1168,14 @@ public class JavaSpacePropertyProcessor extends JavaElementVisitor { } + @Override + public void visitLambdaExpression(PsiLambdaExpression expression) { + if ((myRole1 == ChildRole.ARROW && (myRole2 == ChildRole.LBRACE || myRole2 == ChildRole.EXPRESSION)) || + (myRole1 == ChildRole.PARAMETER_LIST && myRole2 == ChildRole.ARROW)) { + createSpaceInCode(mySettings.SPACE_AROUND_LAMBDA_ARROW); + } + } + @Override public void visitForStatement(PsiForStatement statement) { if (myRole2 == ChildRole.LPARENTH) { createSpaceInCode(mySettings.SPACE_BEFORE_FOR_PARENTHESES); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ChildRole.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ChildRole.java index 52e39b415c07..e9dfa7cd1be4 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ChildRole.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/ChildRole.java @@ -156,6 +156,7 @@ public class ChildRole { public static final int ANNOTATION_VALUE = 249; // in NAME_VALUE_PAIR, ANNOTATION_ARRAY_INITIALIZER public static final int ANNOTATION = 250; // in MODIFIER_LIST public static final int CATCH_SECTION = 251; // in TRY_STATEMENT + public static final int ARROW = 252; // in LAMBDA STATEMENT private ChildRole() { } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLambdaExpressionImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLambdaExpressionImpl.java index 9cffbf0ac12d..9ca740903aae 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLambdaExpressionImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/PsiLambdaExpressionImpl.java @@ -15,11 +15,14 @@ */ package com.intellij.psi.impl.source.tree.java; +import com.intellij.lang.ASTNode; import com.intellij.psi.*; import com.intellij.psi.controlFlow.*; import com.intellij.psi.impl.PsiImplUtil; +import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.JavaElementType; import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -40,6 +43,20 @@ public class PsiLambdaExpressionImpl extends ExpressionPsiElement implements Psi return PsiTreeUtil.getRequiredChildOfType(this, PsiParameterList.class); } + @Override + public int getChildRole(ASTNode child) { + final IElementType elType = child.getElementType(); + if (elType == JavaTokenType.ARROW) { + return ChildRole.ARROW; + } else if (elType == JavaElementType.PARAMETER_LIST) { + return ChildRole.PARAMETER_LIST; + } else if (elType == JavaElementType.CODE_BLOCK) { + return ChildRole.LBRACE; + } else { + return ChildRole.EXPRESSION; + } + } + @Override public PsiElement getBody() { final PsiElement element = getLastChild(); diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterSpaceTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterSpaceTest.java index a5ebe1884006..fcd7d03fd0c0 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterSpaceTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterSpaceTest.java @@ -301,6 +301,18 @@ public class JavaFormatterSpaceTest extends AbstractJavaFormatterTest { "try { } catch (E1|E2 e) { }"); } + public void testSpacesInsideLambda() throws Exception { + getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true; + getSettings().SPACE_AROUND_LAMBDA_ARROW = true; + + doMethodTest("()->{}", + "() -> {}"); + + getSettings().SPACE_AROUND_LAMBDA_ARROW = false; + doMethodTest("() -> {}", + "()->{}"); + } + public void testSpacesBeforeResourceList() throws Exception { getSettings().KEEP_SIMPLE_BLOCKS_IN_ONE_LINE = true; getSettings().BRACE_STYLE = CommonCodeStyleSettings.NEXT_LINE; diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java index 17010f40097e..d7d7aaf66275 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettingsCustomizable.java @@ -32,6 +32,7 @@ public interface CodeStyleSettingsCustomizable { SPACE_AROUND_MULTIPLICATIVE_OPERATORS, SPACE_AROUND_SHIFT_OPERATORS, SPACE_AROUND_UNARY_OPERATOR, + SPACE_AROUND_LAMBDA_ARROW, SPACE_AFTER_COMMA, SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS, SPACE_BEFORE_COMMA, diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java index a57904f896e4..57c3d79cb85f 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CommonCodeStyleSettings.java @@ -517,6 +517,8 @@ public class CommonCodeStyleSettings { public boolean SPACE_AROUND_UNARY_OPERATOR = false; + public boolean SPACE_AROUND_LAMBDA_ARROW = true; + public boolean SPACE_AFTER_COMMA = true; public boolean SPACE_AFTER_COMMA_IN_TYPE_ARGUMENTS = true; public boolean SPACE_BEFORE_COMMA = false; diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleSpacesPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleSpacesPanel.java index fd1f400adb0d..347a5fa5fed0 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleSpacesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleSpacesPanel.java @@ -53,6 +53,7 @@ public class CodeStyleSpacesPanel extends OptionTreeWithPreviewPanel { initBooleanField("SPACE_AROUND_MULTIPLICATIVE_OPERATORS", ApplicationBundle.message("checkbox.spaces.multiplicative.operators"), SPACES_AROUND_OPERATORS); initBooleanField("SPACE_AROUND_SHIFT_OPERATORS", ApplicationBundle.message("checkbox.spaces.shift.operators"), SPACES_AROUND_OPERATORS); initBooleanField("SPACE_AROUND_UNARY_OPERATOR", ApplicationBundle.message("checkbox.spaces.around.unary.operator"), SPACES_AROUND_OPERATORS); + initBooleanField("SPACE_AROUND_LAMBDA_ARROW", ApplicationBundle.message("checkbox.spaces.around.lambda.arrow"), SPACES_AROUND_OPERATORS); initCustomOptions(SPACES_AROUND_OPERATORS); initBooleanField("SPACE_BEFORE_CLASS_LBRACE", ApplicationBundle.message("checkbox.spaces.class.left.brace"), SPACES_BEFORE_LEFT_BRACE); diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index aa1021ce397c..2d0ee4ea5971 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -558,4 +558,5 @@ arrangement.text.negate=Negate arrangement.action.rule.add.text=Add rule arrangement.action.rule.add.description=Add new arrangement rule arrangement.action.rule.remove.text=Remove rule -arrangement.action.rule.remove.description=Remove selected arrangement rule \ No newline at end of file +arrangement.action.rule.remove.description=Remove selected arrangement rule +checkbox.spaces.around.lambda.arrow=Lambda arrow \ No newline at end of file