From d966f795853dd41f865f478fdce9e082390797d6 Mon Sep 17 00:00:00 2001 From: Fedor Korotkov Date: Fri, 19 Jul 2013 18:53:32 +0400 Subject: [PATCH] WEB-8537 EJS: HTML tag is not closed if placed before EJS tag --- .../editorActions/XmlGtTypedHandler.java | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java index b3bf0c26de73..5aaf62b784d2 100644 --- a/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java +++ b/xml/impl/src/com/intellij/codeInsight/editorActions/XmlGtTypedHandler.java @@ -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 + // + 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; + } } \ No newline at end of file