WEB-8537 EJS: HTML tag is not closed if placed before EJS tag

This commit is contained in:
Fedor Korotkov
2013-07-19 19:11:27 +04:00
parent fdd1ad88d5
commit d966f79585
@@ -31,6 +31,7 @@ import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.html.HtmlTag;
import com.intellij.psi.impl.source.xml.XmlTokenImpl;
import com.intellij.psi.templateLanguages.TemplateLanguageFileViewProvider;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.xml.*;
@@ -46,8 +47,7 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate {
public Result beforeCharTyped(final char c, final Project project, final Editor editor, final PsiFile editedFile, final FileType fileType) {
final WebEditorOptions webEditorOptions = WebEditorOptions.getInstance();
if (c == '>' && webEditorOptions != null && webEditorOptions.isAutomaticallyInsertClosingTag()
&& (editedFile.getLanguage() instanceof XMLLanguage || editedFile.getViewProvider().getBaseLanguage() instanceof XMLLanguage)) {
if (c == '>' && webEditorOptions != null && webEditorOptions.isAutomaticallyInsertClosingTag() && fileContainsXmlLanguage(editedFile)) {
PsiDocumentManager.getInstance(project).commitAllDocuments();
PsiFile file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
@@ -58,7 +58,12 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate {
if (offset < editor.getDocument().getTextLength()) {
elementAtCaret = element = provider.findElementAt(offset, XMLLanguage.class);
if (element == null && offset > 0) {
// seems like a template language
// <xml_code><caret><outer_element>
elementAtCaret = element = provider.findElementAt(offset - 1, XMLLanguage.class);
}
if (!(element instanceof PsiWhiteSpace)) {
boolean nonAcceptableDelimiter = true;
@@ -256,4 +261,16 @@ public class XmlGtTypedHandler extends TypedHandlerDelegate {
}
return Result.CONTINUE;
}
private static boolean fileContainsXmlLanguage(PsiFile editedFile) {
if (editedFile.getLanguage() instanceof XMLLanguage) {
return true;
}
final FileViewProvider provider = editedFile.getViewProvider();
if (provider.getBaseLanguage() instanceof XMLLanguage) {
return true;
}
return provider instanceof TemplateLanguageFileViewProvider &&
((TemplateLanguageFileViewProvider)provider).getTemplateDataLanguage() instanceof XMLLanguage;
}
}