From 4807a0348301b4bb2fd1377e7564e05182dc1dcf Mon Sep 17 00:00:00 2001 From: Alexey Pegov Date: Mon, 26 Oct 2009 20:02:46 +0300 Subject: [PATCH] xhtml conditional comment injection take 3 --- .../ide/highlighter/XmlFileHighlighter.java | 4 ++++ .../lexer/XHtmlHighlightingLexer.java | 2 +- .../src/com/intellij/lexer/XHtmlLexer.java | 2 +- xml/impl/src/com/intellij/lexer/XmlLexer.java | 7 +++++- .../html/HtmlConditionalCommentInjector.java | 23 ++++++++----------- .../impl/source/parsing/xml/XmlParsing.java | 4 +++- 6 files changed, 25 insertions(+), 17 deletions(-) diff --git a/xml/impl/src/com/intellij/ide/highlighter/XmlFileHighlighter.java b/xml/impl/src/com/intellij/ide/highlighter/XmlFileHighlighter.java index 9ee712fdf493..5f783eb89411 100644 --- a/xml/impl/src/com/intellij/ide/highlighter/XmlFileHighlighter.java +++ b/xml/impl/src/com/intellij/ide/highlighter/XmlFileHighlighter.java @@ -44,6 +44,10 @@ public class XmlFileHighlighter extends SyntaxHighlighterBase { keys1.put(XmlTokenType.XML_COMMENT_START, XmlHighlighterColors.XML_COMMENT); keys1.put(XmlTokenType.XML_COMMENT_END, XmlHighlighterColors.XML_COMMENT); keys1.put(XmlTokenType.XML_COMMENT_CHARACTERS, XmlHighlighterColors.XML_COMMENT); + keys1.put(XmlTokenType.XML_CONDITIONAL_COMMENT_END, XmlHighlighterColors.XML_COMMENT); + keys1.put(XmlTokenType.XML_CONDITIONAL_COMMENT_END_START, XmlHighlighterColors.XML_COMMENT); + keys1.put(XmlTokenType.XML_CONDITIONAL_COMMENT_START, XmlHighlighterColors.XML_COMMENT); + keys1.put(XmlTokenType.XML_CONDITIONAL_COMMENT_START_END, XmlHighlighterColors.XML_COMMENT); keys1.put(XmlTokenType.XML_START_TAG_START, XmlHighlighterColors.XML_TAG); keys1.put(XmlTokenType.XML_END_TAG_START, XmlHighlighterColors.XML_TAG); diff --git a/xml/impl/src/com/intellij/lexer/XHtmlHighlightingLexer.java b/xml/impl/src/com/intellij/lexer/XHtmlHighlightingLexer.java index 72880371f0ab..5f89e2096cb3 100644 --- a/xml/impl/src/com/intellij/lexer/XHtmlHighlightingLexer.java +++ b/xml/impl/src/com/intellij/lexer/XHtmlHighlightingLexer.java @@ -17,7 +17,7 @@ package com.intellij.lexer; public class XHtmlHighlightingLexer extends HtmlHighlightingLexer { public XHtmlHighlightingLexer() { - this(new XmlLexer()); + this(new XmlLexer(true)); } public XHtmlHighlightingLexer(Lexer baseLexer) { diff --git a/xml/impl/src/com/intellij/lexer/XHtmlLexer.java b/xml/impl/src/com/intellij/lexer/XHtmlLexer.java index 7b3ea972fc9d..4fa57f7eab50 100644 --- a/xml/impl/src/com/intellij/lexer/XHtmlLexer.java +++ b/xml/impl/src/com/intellij/lexer/XHtmlLexer.java @@ -28,7 +28,7 @@ public class XHtmlLexer extends HtmlLexer { } public XHtmlLexer() { - this(new XmlLexer()); + this(new XmlLexer(true)); } protected boolean isHtmlTagState(int state) { diff --git a/xml/impl/src/com/intellij/lexer/XmlLexer.java b/xml/impl/src/com/intellij/lexer/XmlLexer.java index 2f734078a9be..ecb1ee1d97ba 100644 --- a/xml/impl/src/com/intellij/lexer/XmlLexer.java +++ b/xml/impl/src/com/intellij/lexer/XmlLexer.java @@ -27,10 +27,15 @@ public class XmlLexer extends MergingLexerAdapter { XmlTokenType.XML_TAG_CHARACTERS, XmlTokenType.XML_ATTRIBUTE_VALUE_TOKEN, XmlTokenType.XML_PI_TARGET, + XmlTokenType.XML_COMMENT_CHARACTERS, }); public XmlLexer() { - this(new _XmlLexer(new __XmlLexer((Reader)null))); + this(false); + } + + public XmlLexer(final boolean conditionalCommentsSupport) { + this(new _XmlLexer(new __XmlLexer((Reader)null), conditionalCommentsSupport)); } public XmlLexer(Lexer baseLexer) { diff --git a/xml/impl/src/com/intellij/psi/impl/source/html/HtmlConditionalCommentInjector.java b/xml/impl/src/com/intellij/psi/impl/source/html/HtmlConditionalCommentInjector.java index c77d779186e0..91cc8c55c7ce 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/html/HtmlConditionalCommentInjector.java +++ b/xml/impl/src/com/intellij/psi/impl/source/html/HtmlConditionalCommentInjector.java @@ -16,7 +16,6 @@ package com.intellij.psi.impl.source.html; import com.intellij.lang.ASTNode; -import com.intellij.lang.html.HTMLLanguage; import com.intellij.lang.injection.MultiHostInjector; import com.intellij.lang.injection.MultiHostRegistrar; import com.intellij.openapi.util.TextRange; @@ -39,20 +38,18 @@ public class HtmlConditionalCommentInjector implements MultiHostInjector { if (host instanceof XmlComment) { final ASTNode comment = host.getNode(); if (comment != null) { - final ASTNode[] conditionalStarts = comment.getChildren(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_START_END)); - if (conditionalStarts.length > 0) { - final ASTNode[] conditionalEnds = comment.getChildren(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_END_START)); - if (conditionalEnds.length > 0) { - final ASTNode[] endOfEnd = comment.getChildren(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_END)); - if (endOfEnd.length > 0) { + final ASTNode conditionalStart = comment.findChildByType(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_START_END)); + if (conditionalStart != null) { + final ASTNode conditionalEnd = comment.findChildByType(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_END_START)); + if (conditionalEnd != null) { + final ASTNode endOfEnd = comment.findChildByType(TokenSet.create(XmlTokenType.XML_CONDITIONAL_COMMENT_END)); + if (endOfEnd != null) { final TextRange textRange = host.getTextRange(); final int startOffset = textRange.getStartOffset(); - - final ASTNode start = conditionalStarts[0]; - final ASTNode end = conditionalEnds[0]; - registrar.startInjecting(HTMLLanguage.INSTANCE).addPlace(null, null, (PsiLanguageInjectionHost)host, - new TextRange(start.getTextRange().getEndOffset() - startOffset, - end.getStartOffset() - startOffset)).doneInjecting(); + registrar.startInjecting(host.getParent().getLanguage()).addPlace(null, null, (PsiLanguageInjectionHost)host, + new TextRange( + conditionalStart.getTextRange().getEndOffset() - startOffset, + conditionalEnd.getStartOffset() - startOffset)).doneInjecting(); } } } diff --git a/xml/impl/src/com/intellij/psi/impl/source/parsing/xml/XmlParsing.java b/xml/impl/src/com/intellij/psi/impl/source/parsing/xml/XmlParsing.java index 87c86234216b..1c779b1ee412 100644 --- a/xml/impl/src/com/intellij/psi/impl/source/parsing/xml/XmlParsing.java +++ b/xml/impl/src/com/intellij/psi/impl/source/parsing/xml/XmlParsing.java @@ -321,7 +321,9 @@ public class XmlParsing { advance(); while (true) { final IElementType tt = token(); - if (tt == XML_COMMENT_CHARACTERS) { + if (tt == XML_COMMENT_CHARACTERS|| tt == XML_CONDITIONAL_COMMENT_START + || tt == XML_CONDITIONAL_COMMENT_START_END || tt == XML_CONDITIONAL_COMMENT_END_START + || tt == XML_CONDITIONAL_COMMENT_END) { advance(); continue; }