/* * Copyright 2000-2010 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; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.UnfairTextRange; import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.ChangedRangesInfo; import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class FormatTextRanges implements FormattingRangesInfo { private final List<TextRange> myInsertedRanges; private final FormatRangesStorage myStorage = new FormatRangesStorage(); public FormatTextRanges() { myInsertedRanges = null; } public FormatTextRanges(TextRange range, boolean processHeadingWhitespace) { myInsertedRanges = null; add(range, processHeadingWhitespace); } public FormatTextRanges(@NotNull ChangedRangesInfo changedRangesInfo) { changedRangesInfo.allChangedRanges.forEach((range) -> add(range, true)); myInsertedRanges = changedRangesInfo.insertedRanges; } public void add(TextRange range, boolean processHeadingWhitespace) { myStorage.add(range, processHeadingWhitespace); } @Override public boolean isWhitespaceReadOnly(final @NotNull TextRange range) { return myStorage.isWhiteSpaceReadOnly(range); } @Override public boolean isReadOnly(@NotNull TextRange range) { return myStorage.isReadOnly(range); } @Override public boolean isOnInsertedLine(int offset) { if (myInsertedRanges == null) return false; Optional<TextRange> enclosingRange = myInsertedRanges.stream() .filter((range) -> range.contains(offset)) .findAny(); return enclosingRange.isPresent(); } public List<FormatTextRange> getRanges() { return myStorage.getRanges(); } public FormatTextRanges ensureNonEmpty() { FormatTextRanges result = new FormatTextRanges(); for (FormatTextRange range : myStorage.getRanges()) { if (range.isProcessHeadingWhitespace()) { result.add(range.getNonEmptyTextRange(), true); } else { result.add(range.getTextRange(), false); } } return result; } public boolean isEmpty() { return myStorage.isEmpty(); } public boolean isFullReformat(PsiFile file) { List<FormatTextRange> ranges = myStorage.getRanges(); return ranges.size() == 1 && file.getTextRange().equals(ranges.get(0).getTextRange()); } public List<TextRange> getTextRanges() { return myStorage .getRanges() .stream() .map(FormatTextRange::getTextRange) .collect(Collectors.toList()); } public List<TextRange> getExtendedFormattingRanges() { return myStorage .getRanges() .stream() .map((range) -> { TextRange textRange = range.getTextRange(); return new UnfairTextRange(textRange.getStartOffset() - 500, textRange.getEndOffset() + 500); }) .collect(Collectors.toList()); } }