/* * Copyright 2014 The authors * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.intellij.lang.ognl.formatting; import com.intellij.formatting.FormattingModel; import com.intellij.formatting.FormattingModelBuilder; import com.intellij.formatting.FormattingModelProvider; import com.intellij.formatting.SpacingBuilder; import com.intellij.lang.ASTNode; import com.intellij.lang.ognl.OgnlLanguage; import com.intellij.lang.ognl.psi.OgnlTokenGroups; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import org.jetbrains.annotations.NotNull; import static com.intellij.lang.ognl.OgnlTypes.*; /** * Provides basic (whitespace only) formatting for OGNL using (Java) default settings. * * @author Yann Cébron */ public class OgnlFormattingModelBuilder implements FormattingModelBuilder { @NotNull @Override public FormattingModel createModel(final PsiElement element, final CodeStyleSettings settings) { final SpacingBuilder spacingBuilder = createSpacingBuilder(settings); final PsiFile containingFile = element.getContainingFile(); final OgnlBlock ognlBlock = new OgnlBlock(element.getNode(), spacingBuilder); return FormattingModelProvider.createFormattingModelForPsiFile(containingFile, ognlBlock, settings); } @Override public TextRange getRangeAffectingIndent(final PsiFile file, final int offset, final ASTNode elementAtOffset) { return null; } private static SpacingBuilder createSpacingBuilder(final CodeStyleSettings settings) { return new SpacingBuilder(settings, OgnlLanguage.INSTANCE) .after(COMMA).spaceIf(settings.SPACE_AFTER_COMMA) .before(COMMA).spaceIf(settings.SPACE_BEFORE_COMMA) .after(QUESTION).spaceIf(settings.SPACE_AFTER_QUEST) .before(QUESTION).spaceIf(settings.SPACE_BEFORE_QUEST) .after(COLON).spaceIf(settings.SPACE_AFTER_COLON) .before(COLON).spaceIf(settings.SPACE_BEFORE_COLON) .withinPair(LPARENTH, RPARENTH).spaceIf(settings.SPACE_WITHIN_PARENTHESES) .withinPair(LBRACE, RBRACE).spaceIf(settings.SPACE_WITHIN_BRACES) .withinPair(LBRACKET, RBRACKET).spaceIf(settings.SPACE_WITHIN_BRACKETS) .aroundInside(OgnlTokenGroups.ADDITION_OPS, BINARY_EXPRESSION).spaceIf(settings.SPACE_AROUND_ADDITIVE_OPERATORS) .aroundInside(OgnlTokenGroups.MULTIPLICATION_OPS, BINARY_EXPRESSION).spaceIf(settings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS) .around(OgnlTokenGroups.UNARY_OPS).spaceIf(settings.SPACE_AROUND_UNARY_OPERATOR) .around(OgnlTokenGroups.EQUALITY_OPS).spaceIf(settings.SPACE_AROUND_EQUALITY_OPERATORS) .around(OgnlTokenGroups.RELATIONAL_OPS).spaceIf(settings.SPACE_AROUND_RELATIONAL_OPERATORS) .around(OgnlTokenGroups.LOGICAL_OPS).spaceIf(settings.SPACE_AROUND_LOGICAL_OPERATORS) .around(OgnlTokenGroups.SHIFT_OPS).spaceIf(settings.SPACE_AROUND_SHIFT_OPERATORS) .around(OgnlTokenGroups.BITWISE_OPS).spaceIf(settings.SPACE_AROUND_BITWISE_OPERATORS); } }