handle multi-root files and JS

This commit is contained in:
Dennis Ushakov
2015-01-30 18:14:23 +03:00
parent 0b9dafe724
commit 4766eecb0b
@@ -19,14 +19,14 @@ import com.intellij.lang.Language;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil;
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.XmlText;
import com.intellij.psi.xml.XmlTokenType;
import com.intellij.util.ObjectUtils;
/**
* @author Dennis.Ushakov
@@ -44,27 +44,36 @@ public class EmmetEditPointUtil {
private static void moveToNextPoint(Editor editor, PsiFile file, int offset, int inc) {
final Document doc = editor.getDocument();
final TemplateLanguageFileViewProvider provider = ObjectUtils.tryCast(file.getViewProvider(), TemplateLanguageFileViewProvider.class);
final Language additionalLanguage = provider != null ? provider.getTemplateDataLanguage() : null;
PsiDocumentManager.getInstance(file.getProject()).commitDocument(doc);
for (int i = offset + inc; i < doc.getTextLength() && i >= 0; i += inc) {
PsiElement current = InjectedLanguageUtil.findElementAtNoCommit(file, i);
if (current == null) continue;
if (current.getParent() instanceof XmlText) {
final int line = doc.getLineNumber(i);
final int lineStart = doc.getLineStartOffset(line);
final int lineEnd = doc.getLineEndOffset(line);
if (lineEnd == offset) continue;
final CharSequence text = doc.getCharsSequence().subSequence(lineStart, lineEnd);
if (StringUtil.isEmptyOrSpaces(text) && moveCaret(editor, current, lineEnd)) {
return;
}
} else if (isEmptyEditPoint(current) && moveCaret(editor, current, current.getTextRange().getStartOffset())) {
return;
if (checkAndMove(editor, doc, i, current)) return;
if (additionalLanguage != null) {
current = provider.findElementAt(i, additionalLanguage);
if (checkAndMove(editor, doc, i, current)) return;
}
}
}
private static boolean checkAndMove(Editor editor, Document doc, int offset, PsiElement current) {
if (current == null) return false;
if (current.getParent() instanceof XmlText) {
final int line = doc.getLineNumber(offset);
final int lineStart = doc.getLineStartOffset(line);
final int lineEnd = doc.getLineEndOffset(line);
final CharSequence text = doc.getCharsSequence().subSequence(lineStart, lineEnd);
if (StringUtil.isEmptyOrSpaces(text) && moveCaret(editor, current, lineEnd)) {
return true;
}
} else if (isEmptyEditPoint(current) && moveCaret(editor, current, current.getTextRange().getStartOffset())) {
return true;
}
return false;
}
private static boolean moveCaret(Editor editor, PsiElement current, int offset) {
editor = InjectedLanguageUtil.getInjectedEditorForInjectedFile(editor, current.getContainingFile());
final CaretModel caretModel = editor.getCaretModel();
@@ -95,7 +104,7 @@ public class EmmetEditPointUtil {
static boolean isApplicableFile(PsiFile file) {
if (file == null) return false;
for (Language language : file.getViewProvider().getLanguages()) {
if (language.isKindOf(XMLLanguage.INSTANCE)) return true;
if (language.isKindOf(XMLLanguage.INSTANCE) || "JavaScript".equals(language.getID())) return true;
}
return false;
}