/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.formatting; import com.intellij.formatting.Spacing; import com.intellij.patterns.ElementPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import gw.plugin.ij.lang.parser.GosuElementTypes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static com.intellij.patterns.PlatformPatterns.psiElement; public class GosuSpacingInBlocks extends GosuElementTypes { private static Spacing getSpacingAfterLambda(@NotNull CommonCodeStyleSettings settings, @NotNull GosuCodeStyleSettings gosuSettings) { return GosuSpaces.getSpace(gosuSettings.SPACE_AFTER_LAMBDA, settings); } private static Spacing getSpacingAroundArrow(@NotNull CommonCodeStyleSettings settings, @NotNull GosuCodeStyleSettings gosuSettings) { return GosuSpaces.getSpace(gosuSettings.SPACE_AROUND_ARROW, settings); } @Nullable public static Spacing getSpacing(PsiElement psi1, PsiElement psi2, @NotNull CommonCodeStyleSettings settings, @NotNull GosuCodeStyleSettings gosuSettings) { // \ [SPACE] x -> x + 1 if (psiElement(TT_OP_escape) .withParent(psiElement(ELEM_TYPE_BlockExpression)) .accepts(psi1)) { return getSpacingAfterLambda(settings, gosuSettings); } // \ x [SPACE] -> [SPACE] x + 1 final ElementPattern<PsiElement> pattern = psiElement(TT_OP_assign_closure).withParent(psiElement(ELEM_TYPE_BlockExpression)); if (pattern.accepts(psi2) || pattern.accepts(psi1)) { return getSpacingAroundArrow(settings, gosuSettings); } return null; } }