/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.formatting; import com.intellij.formatting.Spacing; 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 GosuSpacingInTernaryOperator extends GosuElementTypes { // Ternary private static Spacing getSpacingBeforeQuestionInTernaryOperator(@NotNull CommonCodeStyleSettings settings) { return GosuSpaces.getSpace(settings.SPACE_BEFORE_QUEST, settings); } private static Spacing getSpacingAfterQuestionInTernaryOperator(@NotNull CommonCodeStyleSettings settings) { return GosuSpaces.getSpace(settings.SPACE_AFTER_QUEST, settings); } private static Spacing getSpacingBeforeColonInTernaryOperator(@NotNull CommonCodeStyleSettings settings) { return GosuSpaces.getSpace(settings.SPACE_BEFORE_COLON, settings); } private static Spacing getSpacingAfterColonInTernaryOperator(@NotNull CommonCodeStyleSettings settings) { return GosuSpaces.getSpace(settings.SPACE_AFTER_COLON, settings); } @Nullable public static Spacing getSpacing(PsiElement psi1, PsiElement psi2, @NotNull CommonCodeStyleSettings settings, GosuCodeStyleSettings gosuSettings) { // Condition [SPACE] ? TrueExpr : FalseExpr if (psiElement(TT_OP_question) .withParent(psiElement(ELEM_TYPE_ConditionalTernaryExpression)) .accepts(psi2)) { return getSpacingBeforeQuestionInTernaryOperator(settings); } // Condition ? [SPACE] TrueExpr : FalseExpr if (psiElement(TT_OP_question) .withParent(psiElement(ELEM_TYPE_ConditionalTernaryExpression)) .accepts(psi1)) { return getSpacingAfterQuestionInTernaryOperator(settings); } // Condition ? TrueExpr [SPACE] : FalseExpr // Must be before GosuSpacingOther if (psiElement(TT_OP_colon) .withParent(psiElement(ELEM_TYPE_ConditionalTernaryExpression)) .accepts(psi2)) { return getSpacingBeforeColonInTernaryOperator(settings); } // Condition ? TrueExpr : [SPACE] FalseExpr // Must be before GosuSpacingOther if (psiElement(TT_OP_colon) .withParent(psiElement(ELEM_TYPE_ConditionalTernaryExpression)) .accepts(psi1)) { return getSpacingAfterColonInTernaryOperator(settings); } return null; } }