mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
handle multi-root files and JS
This commit is contained in:
+27
-18
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user