/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.formatting;
import com.intellij.formatting.Spacing;
import com.intellij.patterns.PsiElementPattern;
import com.intellij.psi.PsiElement;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import com.intellij.psi.tree.TokenSet;
import gw.plugin.ij.lang.GosuTokenSets;
import gw.plugin.ij.lang.psi.impl.expressions.GosuTypeLiteralImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static com.intellij.patterns.PlatformPatterns.psiElement;
public class GosuSpacingAround {
// Around
private static Spacing getSpacingAroundAssignmentOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_ASSIGNMENT_OPERATORS, settings);
}
private static Spacing getSpacingAroundLogicalOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_LOGICAL_OPERATORS, settings);
}
private static Spacing getSpacingAroundEqualityOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_EQUALITY_OPERATORS, settings);
}
private static Spacing getSpacingAroundRelationalOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_RELATIONAL_OPERATORS, settings);
}
private static Spacing getSpacingAroundBitwiseOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_BITWISE_OPERATORS, settings);
}
private static Spacing getSpacingAroundAdditiveOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_ADDITIVE_OPERATORS, settings);
}
private static Spacing getSpacingAroundMultiplicativeOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS, settings);
}
private static Spacing getSpacingAroundShiftOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_SHIFT_OPERATORS, settings);
}
private static Spacing getSpacingAroundUnaryOperators(@NotNull CommonCodeStyleSettings settings) {
return GosuSpaces.getSpace(settings.SPACE_AROUND_UNARY_OPERATOR, settings);
}
private static Spacing getSpacingAroundIntervalOperators(@NotNull CommonCodeStyleSettings settings, @NotNull GosuCodeStyleSettings gosuSettings) {
return GosuSpaces.getSpace(gosuSettings.SPACE_AROUND_INTERVAL_OPERATORS, settings);
}
private static boolean checkBoth(PsiElement psi1, PsiElement psi2, TokenSet set) {
final PsiElementPattern element = psiElement().withElementType(set);
return element.accepts(psi1) || element.accepts(psi2);
}
@Nullable
public static Spacing getSpacing(PsiElement psi1, PsiElement psi2, @NotNull CommonCodeStyleSettings settings, @NotNull GosuCodeStyleSettings gosuSettings) {
if (checkBoth(psi1, psi2, GosuTokenSets.ASSIGNMENT_OPS)) {
return getSpacingAroundAssignmentOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.LOGICAL_OPS)) {
return getSpacingAroundLogicalOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.EQUALITY_OPS)) {
return getSpacingAroundEqualityOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.RELATIONAL_OPS) &&
!(psi1 instanceof GosuTypeLiteralImpl) &&
!(psi2 instanceof GosuTypeLiteralImpl)) {
return getSpacingAroundRelationalOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.BITWISE_OPS)) {
return getSpacingAroundBitwiseOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.ADDITIVE_OPS)) {
return getSpacingAroundAdditiveOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.MULTIPLICATIVE_OPS)) {
return getSpacingAroundMultiplicativeOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.SHIFT_OPS)) {
return getSpacingAroundShiftOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.UNARY_OPS)) {
return getSpacingAroundUnaryOperators(settings);
}
if (checkBoth(psi1, psi2, GosuTokenSets.INTERVAL_OPS)) {
return getSpacingAroundIntervalOperators(settings, gosuSettings);
}
return null;
}
}