blob: e19efe0b715809eac880245bb23f01e14ed956a5 [file] [log] [blame]
/*
* 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;
}
}