From 4766eecb0b1363093da58990ba9309eb37cbacfd Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Fri, 30 Jan 2015 17:58:13 +0300 Subject: [PATCH] handle multi-root files and JS --- .../emmet/actions/EmmetEditPointUtil.java | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/actions/EmmetEditPointUtil.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/actions/EmmetEditPointUtil.java index 46e0c21a6450..d23114a1d243 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/actions/EmmetEditPointUtil.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/actions/EmmetEditPointUtil.java @@ -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; }