diff --git a/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java index e2224311942e..b3af4cdb9d6c 100644 --- a/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java +++ b/java/java-tests/testSrc/com/intellij/java/find/impl/FindManagerTest.java @@ -608,7 +608,28 @@ public class FindManagerTest extends DaemonAnalyzerTestCase { fixture.tearDown(); } } + + public void testFindInCommentsInJsInsideHtml() { + FindModel findModel = FindManagerTestUtils.configureFindModel("@param t done"); + String text = ""; + findModel.setSearchContext(FindModel.SearchContext.IN_COMMENTS); + FindManager findManager = FindManager.getInstance(myProject); + FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "html"); + + findModel.setRegularExpressions(true); + FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "html"); + + FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "php"); + findModel.setRegularExpressions(false); + FindManagerTestUtils.runFindForwardAndBackward(findManager, findModel, text, "php"); + } + public void testFindInCommentsAndLiterals() { FindModel findModel = FindManagerTestUtils.configureFindModel("done"); diff --git a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java index e9d9bbf00ae3..e9cef49731f2 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java +++ b/platform/lang-impl/src/com/intellij/find/impl/FindManagerImpl.java @@ -28,6 +28,7 @@ import com.intellij.lang.Language; import com.intellij.lang.LanguageParserDefinitions; import com.intellij.lang.LanguageUtil; import com.intellij.lang.ParserDefinition; +import com.intellij.lexer.LayeredLexer; import com.intellij.lexer.Lexer; import com.intellij.navigation.NavigationItem; import com.intellij.notification.NotificationDisplayType; @@ -604,11 +605,19 @@ public class FindManagerImpl extends FindManager { Matcher matcher = model.isRegularExpressions() ? compileRegExp(model, "") : null; StringSearcher searcher = matcher != null ? null : new StringSearcher(model.getStringToFind(), model.isCaseSensitive(), true); - SyntaxHighlighterOverEditorHighlighter highlighterAdapter = - new SyntaxHighlighterOverEditorHighlighter(highlighter, file, myProject); - data = - new CommentsLiteralsSearchData(file, relevantLanguages, highlighterAdapter, tokensOfInterest, searcher, matcher, model.clone()); - data.highlighter.restart(text); + LayeredLexer.ourDisableLayersFlag.set(Boolean.TRUE); + + try { + SyntaxHighlighterOverEditorHighlighter highlighterAdapter = + new SyntaxHighlighterOverEditorHighlighter(highlighter, file, myProject); + data = + new CommentsLiteralsSearchData(file, relevantLanguages, highlighterAdapter, tokensOfInterest, searcher, matcher, model.clone()); + data.highlighter.restart(text); + } + finally { + LayeredLexer.ourDisableLayersFlag.set(null); + } + model.putUserData(ourCommentsLiteralsSearchDataKey, data); } diff --git a/platform/usageView/src/com/intellij/usages/impl/SyntaxHighlighterOverEditorHighlighter.java b/platform/usageView/src/com/intellij/usages/impl/SyntaxHighlighterOverEditorHighlighter.java index 89799cc6491a..7717232ba7f1 100644 --- a/platform/usageView/src/com/intellij/usages/impl/SyntaxHighlighterOverEditorHighlighter.java +++ b/platform/usageView/src/com/intellij/usages/impl/SyntaxHighlighterOverEditorHighlighter.java @@ -15,7 +15,6 @@ */ package com.intellij.usages.impl; -import com.intellij.lexer.LayeredLexer; import com.intellij.lexer.Lexer; import com.intellij.openapi.editor.colors.TextAttributesKey; import com.intellij.openapi.editor.ex.util.LayeredHighlighterIterator; @@ -43,19 +42,13 @@ public class SyntaxHighlighterOverEditorHighlighter implements SyntaxHighlighter lexer = highlighter.getHighlightingLexer(); } else { highlighter = _highlighter; - LayeredLexer.ourDisableLayersFlag.set(Boolean.TRUE); EditorHighlighter editorHighlighter = EditorHighlighterFactory.getInstance().createEditorHighlighter(project, file); - - try { - if (editorHighlighter instanceof LayeredLexerEditorHighlighter) { - lexer = new LexerEditorHighlighterLexer(editorHighlighter, false); - } - else { - lexer = highlighter.getHighlightingLexer(); - } + + if (editorHighlighter instanceof LayeredLexerEditorHighlighter) { + lexer = new LexerEditorHighlighterLexer(editorHighlighter, false); } - finally { - LayeredLexer.ourDisableLayersFlag.set(null); + else { + lexer = highlighter.getHighlightingLexer(); } } } diff --git a/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java b/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java index 04177e5e895d..080950112b0f 100644 --- a/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java +++ b/xml/xml-psi-impl/src/com/intellij/lexer/HtmlHighlightingLexer.java @@ -50,6 +50,7 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { private final Map scriptLexers = new HashMap<>(); private final Map styleLexers = new HashMap<>(); private boolean hasNoEmbeddments; + private final boolean hasNoLayers; public HtmlHighlightingLexer() { this(null); @@ -61,6 +62,7 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { protected HtmlHighlightingLexer(Lexer lexer, boolean caseInsensitive, FileType styleFileType) { super(lexer, caseInsensitive); + hasNoLayers = Boolean.TRUE.equals(LayeredLexer.ourDisableLayersFlag.get()); ourStyleFileType = styleFileType; XmlEmbeddmentHandler value = new XmlEmbeddmentHandler(); @@ -87,66 +89,71 @@ public class HtmlHighlightingLexer extends BaseHtmlLexer { } private void setEmbeddedLexer() { - Lexer newLexer = null; - if (hasSeenStyle()) { - Lexer styleLexer = styleLexers.get(styleType); - if (styleLexer == null) { - if (hasSeenTag()) { - IElementType currentStylesheetElementType = getCurrentStylesheetElementType(); - if (currentStylesheetElementType != null) { - Language language = currentStylesheetElementType.getLanguage(); - styleLexer = SyntaxHighlighterFactory.getSyntaxHighlighter(language, null, null).getHighlightingLexer(); + if (hasNoLayers) LayeredLexer.ourDisableLayersFlag.set(Boolean.TRUE); + try { + Lexer newLexer = null; + if (hasSeenStyle()) { + Lexer styleLexer = styleLexers.get(styleType); + if (styleLexer == null) { + if (hasSeenTag()) { + IElementType currentStylesheetElementType = getCurrentStylesheetElementType(); + if (currentStylesheetElementType != null) { + Language language = currentStylesheetElementType.getLanguage(); + styleLexer = SyntaxHighlighterFactory.getSyntaxHighlighter(language, null, null).getHighlightingLexer(); + } + else if (ourStyleFileType != null) { + SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null); + LOG.assertTrue(highlighter != null, ourStyleFileType); + styleLexer = highlighter.getHighlightingLexer(); + } + else { + styleLexer = null; + } + styleLexers.put(styleType, styleLexer); } - else if (ourStyleFileType != null) { - SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null); - LOG.assertTrue(highlighter != null, ourStyleFileType); - styleLexer = highlighter.getHighlightingLexer(); - } - else { - styleLexer = null; - } - styleLexers.put(styleType, styleLexer); - } - else if (hasSeenAttribute()) { - if (ourStyleFileType == null) { - styleLexer = null; - } - else { - SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null); - LOG.assertTrue(highlighter != null, ourStyleFileType); - styleLexer = highlighter.getHighlightingLexer(); + else if (hasSeenAttribute()) { + if (ourStyleFileType == null) { + styleLexer = null; + } + else { + SyntaxHighlighter highlighter = SyntaxHighlighterFactory.getSyntaxHighlighter(ourStyleFileType, null, null); + LOG.assertTrue(highlighter != null, ourStyleFileType); + styleLexer = highlighter.getHighlightingLexer(); + } } } + newLexer = styleLexer; } - newLexer = styleLexer; - } - else if (hasSeenScript()) { - Lexer scriptLexer = scriptLexers.get(scriptType); - if (scriptLexer == null) { - if (hasSeenTag()) { - HtmlScriptContentProvider provider = findScriptContentProvider(scriptType); - if (provider != null) { - scriptLexer = provider.getHighlightingLexer(); + else if (hasSeenScript()) { + Lexer scriptLexer = scriptLexers.get(scriptType); + if (scriptLexer == null) { + if (hasSeenTag()) { + HtmlScriptContentProvider provider = findScriptContentProvider(scriptType); + if (provider != null) { + scriptLexer = provider.getHighlightingLexer(); + } + else { + scriptLexer = SyntaxHighlighterFactory.getSyntaxHighlighter(PlainTextLanguage.INSTANCE, null, null).getHighlightingLexer(); + } } - else { - scriptLexer = SyntaxHighlighterFactory.getSyntaxHighlighter(PlainTextLanguage.INSTANCE, null, null).getHighlightingLexer(); + else if (hasSeenAttribute()) { + SyntaxHighlighter syntaxHighlighter = + ourInlineScriptFileType != null ? SyntaxHighlighterFactory.getSyntaxHighlighter(ourInlineScriptFileType, null, null) : null; + scriptLexer = syntaxHighlighter != null ? syntaxHighlighter.getHighlightingLexer() : null; } + scriptLexers.put(scriptType, scriptLexer); } - else if (hasSeenAttribute()) { - SyntaxHighlighter syntaxHighlighter = - ourInlineScriptFileType != null ? SyntaxHighlighterFactory.getSyntaxHighlighter(ourInlineScriptFileType, null, null) : null; - scriptLexer = syntaxHighlighter != null ? syntaxHighlighter.getHighlightingLexer() : null; - } - scriptLexers.put(scriptType, scriptLexer); + newLexer = scriptLexer; + } + else { + newLexer = createELLexer(newLexer); } - newLexer = scriptLexer; - } - else { - newLexer = createELLexer(newLexer); - } - if (newLexer != null) { - embeddedLexer = newLexer; + if (newLexer != null) { + embeddedLexer = newLexer; + } + } finally { + if (hasNoLayers) LayeredLexer.ourDisableLayersFlag.set(null); } }