/* * Copyright 2000-2013 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.psi.formatter; import com.intellij.lang.ASTNode; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.impl.source.tree.LeafElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Abstract common {@link WhiteSpaceFormattingStrategy} implementation that doesn't replace default strategy and doesn't * adjust white space and * * @author Denis Zhdanov * @since Sep 22, 2010 10:19:07 AM */ public abstract class AbstractWhiteSpaceFormattingStrategy implements WhiteSpaceFormattingStrategy { @Override public boolean replaceDefaultStrategy() { return false; } @NotNull @Override public CharSequence adjustWhiteSpaceIfNecessary(@NotNull CharSequence whiteSpaceText, @NotNull CharSequence text, int startOffset, int endOffset, CodeStyleSettings codeStyleSettings, ASTNode nodeAfter) { // Does nothing return whiteSpaceText; } @Override public CharSequence adjustWhiteSpaceIfNecessary(@NotNull CharSequence whiteSpaceText, @NotNull PsiElement startElement, final int startOffset, final int endOffset, CodeStyleSettings codeStyleSettings) { assert startElement.getTextRange().contains(startOffset) : String.format("Element: %s, range: %s, offset: %d", startElement, startElement.getTextRange(), startOffset); // Collect target text from the PSI elements and delegate to the text-based method. StringBuilder buffer = new StringBuilder(); for (PsiElement current = startElement; current != null && current.getTextRange().getStartOffset() < endOffset; current = next(current)) { final TextRange range = current.getTextRange(); final String text = current.getText(); if (StringUtil.isEmpty(text)) { continue; } int start = startOffset > range.getStartOffset() ? startOffset - range.getStartOffset() : 0; if (start >= text.length()) { continue; } int end = endOffset < range.getEndOffset() ? text.length() - (range.getEndOffset() - endOffset) : text.length(); if (end <= start) { continue; } if (start == 0 && end == text.length()) { buffer.append(text); } else { buffer.append(text.substring(start, end)); } } return adjustWhiteSpaceIfNecessary(whiteSpaceText, buffer, 0, endOffset - startOffset, codeStyleSettings, null); } @Nullable private static PsiElement next(@NotNull final PsiElement element) { for (PsiElement anchor = element; anchor != null; anchor = anchor.getParent()) { final PsiElement result = element.getNextSibling(); if (result != null) { return result; } } return null; } @Override public boolean containsWhitespacesOnly(@NotNull ASTNode node) { return false; } @Override public boolean addWhitespace(@NotNull ASTNode treePrev, @NotNull LeafElement whiteSpaceElement) { return false; } }