/*
* Copyright 2000-2015 JetBrains s.r.o.
*
* 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.formatting.engine;
import com.intellij.formatting.*;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
import org.jetbrains.annotations.NotNull;
public class FormatProcessorUtils {
private static int calcShift(@NotNull final IndentInside oldIndent,
@NotNull final IndentInside newIndent,
@NotNull final CommonCodeStyleSettings.IndentOptions options)
{
if (oldIndent.equals(newIndent)) return 0;
return newIndent.getSpacesCount(options) - oldIndent.getSpacesCount(options);
}
public static int replaceWhiteSpace(final FormattingModel model,
@NotNull final LeafBlockWrapper block,
int shift,
final CharSequence _newWhiteSpace,
final CommonCodeStyleSettings.IndentOptions options
) {
final WhiteSpace whiteSpace = block.getWhiteSpace();
final TextRange textRange = whiteSpace.getTextRange();
final TextRange wsRange = textRange.shiftRight(shift);
final String newWhiteSpace = _newWhiteSpace.toString();
TextRange newWhiteSpaceRange = model instanceof FormattingModelEx
? ((FormattingModelEx) model).replaceWhiteSpace(wsRange, block.getNode(), newWhiteSpace)
: model.replaceWhiteSpace(wsRange, newWhiteSpace);
shift += newWhiteSpaceRange.getLength() - textRange.getLength();
if (block.isLeaf() && whiteSpace.containsLineFeeds() && block.containsLineFeeds()) {
final TextRange currentBlockRange = block.getTextRange().shiftRight(shift);
IndentInside oldBlockIndent = whiteSpace.getInitialLastLineIndent();
IndentInside whiteSpaceIndent = IndentInside.createIndentOn(IndentInside.getLastLine(newWhiteSpace));
final int shiftInside = calcShift(oldBlockIndent, whiteSpaceIndent, options);
if (shiftInside != 0 || !oldBlockIndent.equals(whiteSpaceIndent)) {
final TextRange newBlockRange = model.shiftIndentInsideRange(block.getNode(), currentBlockRange, shiftInside);
shift += newBlockRange.getLength() - block.getLength();
}
}
return shift;
}
}