package com.jetbrains.lang.dart.ide.editor; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.impl.PsiBasedStripTrailingSpacesFilter; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; import com.intellij.psi.tree.IElementType; import com.jetbrains.lang.dart.DartLanguage; import com.jetbrains.lang.dart.psi.DartRecursiveVisitor; import com.jetbrains.lang.dart.psi.DartStringLiteralExpression; import org.jetbrains.annotations.NotNull; import static com.jetbrains.lang.dart.DartTokenTypes.RAW_TRIPLE_QUOTED_STRING; import static com.jetbrains.lang.dart.DartTokenTypes.REGULAR_STRING_PART; public class DartStripTrailingSpacesFilterFactory extends PsiBasedStripTrailingSpacesFilter.Factory { @NotNull @Override protected PsiBasedStripTrailingSpacesFilter createFilter(@NotNull final Document document) { return new DartStripTrailingSpacesFilter(document); } @Override protected boolean isApplicableTo(@NotNull final Language language) { return language == DartLanguage.INSTANCE; } private static class DartStripTrailingSpacesFilter extends PsiBasedStripTrailingSpacesFilter { protected DartStripTrailingSpacesFilter(@NotNull final Document document) { super(document); } @Override protected void process(@NotNull final PsiFile psiFile) { PsiElementVisitor visitor = new DartRecursiveVisitor() { @Override public void visitStringLiteralExpression(@NotNull DartStringLiteralExpression literalExpression) { super.visitStringLiteralExpression(literalExpression); for (ASTNode child = literalExpression.getNode().getFirstChildNode(); child != null; child = child.getTreeNext()) { final IElementType type = child.getElementType(); if (type == RAW_TRIPLE_QUOTED_STRING || type == REGULAR_STRING_PART) { // keep trailing spaces in multiline string literals disableRange(child.getTextRange(), false); } } } }; psiFile.accept(visitor); } } }