From 29fd64dc589ad4f2b51d2869c74c851abced1fae Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 6 Nov 2008 14:43:01 +0300 Subject: [PATCH] Revert: make highlighting tests closer to real life: codeInsightFixture too --- .../intellij/codeInsight/CodeInsightTestCase.java | 34 ----- .../codeInsight/daemon/AntHighlightingTest.java | 8 +- .../codeInsight/daemon/DaemonAnalyzerTestCase.java | 74 ++++++++--- .../daemon/LightDaemonAnalyzerTestCase.java | 17 +-- .../daemon/quickFix/LightQuickFixTestCase.java | 19 ++- .../daemon/impl/DaemonCodeAnalyzerImpl.java | 25 +++- .../daemon/impl/ShowIntentionsPass.java | 14 ++- .../daemon/impl/UpdateHighlightersUtil.java | 88 +++---------- .../impl/ShowIntentionActionsHandler.java | 5 +- .../daemon/impl/PostHighlightingPass.java | 2 +- .../fixtures/impl/CodeInsightTestFixtureImpl.java | 137 ++++++++++----------- .../fixtures/impl/LightIdeaTestFixtureImpl.java | 19 +-- 12 files changed, 209 insertions(+), 233 deletions(-) diff --git a/codeInsight/tests/com/intellij/codeInsight/CodeInsightTestCase.java b/codeInsight/tests/com/intellij/codeInsight/CodeInsightTestCase.java index cf3cac435f..7ebbe00e92 100644 --- a/codeInsight/tests/com/intellij/codeInsight/CodeInsightTestCase.java +++ b/codeInsight/tests/com/intellij/codeInsight/CodeInsightTestCase.java @@ -1,11 +1,9 @@ package com.intellij.codeInsight; import com.intellij.codeInsight.highlighting.HighlightUsagesHandler; -import com.intellij.codeInsight.daemon.impl.UpdateHighlightersUtil; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ex.PathManagerEx; -import com.intellij.openapi.application.Result; import com.intellij.openapi.editor.*; import com.intellij.openapi.editor.actionSystem.EditorActionHandler; import com.intellij.openapi.editor.actionSystem.EditorActionManager; @@ -22,9 +20,6 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.openapi.fileTypes.FileType; -import com.intellij.openapi.fileTypes.FileTypeManager; -import com.intellij.openapi.command.WriteCommandAction; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.PostprocessReformattingAspect; @@ -62,14 +57,7 @@ public abstract class CodeInsightTestCase extends PsiTestCase { return instance.openTextEditor(new OpenFileDescriptor(myProject, file, 0), false); } - @Override - protected void setUp() throws Exception { - super.setUp(); - UpdateHighlightersUtil.DEBUG = true; - } - protected void tearDown() throws Exception { - UpdateHighlightersUtil.DEBUG = false; FileEditorManager editorManager = FileEditorManager.getInstance(myProject); VirtualFile[] openFiles = editorManager.getOpenFiles(); for (VirtualFile openFile : openFiles) { @@ -115,28 +103,6 @@ public abstract class CodeInsightTestCase extends PsiTestCase { return configureByFile(vFile, projectFile); } - protected PsiFile configureByText(final FileType fileType, @NonNls final String text) throws Throwable { - final String extension = fileType.getDefaultExtension(); - - final File tempFile = File.createTempFile("aaa", "." + extension); - myFilesToDelete.add(tempFile); - final FileTypeManager fileTypeManager = FileTypeManager.getInstance(); - if (fileTypeManager.getFileTypeByExtension(extension) != fileType) { - new WriteCommandAction(getProject()) { - protected void run(Result result) throws Throwable { - fileTypeManager.associateExtension(fileType, extension); - } - }.execute(); - } - final VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(tempFile); - VfsUtil.saveText(vFile, text); - assert vFile != null; - - configureByExistingFile(vFile); - return myFile; - } - - protected String getTestDataPath() { return PathManagerEx.getTestDataPath(); } diff --git a/codeInsight/tests/com/intellij/codeInsight/daemon/AntHighlightingTest.java b/codeInsight/tests/com/intellij/codeInsight/daemon/AntHighlightingTest.java index 0982cd1e23..70abd2cac6 100644 --- a/codeInsight/tests/com/intellij/codeInsight/daemon/AntHighlightingTest.java +++ b/codeInsight/tests/com/intellij/codeInsight/daemon/AntHighlightingTest.java @@ -16,8 +16,8 @@ import com.intellij.idea.IdeaTestUtil; import com.intellij.lang.ant.validation.AntDuplicateTargetsInspection; import com.intellij.openapi.vfs.VirtualFile; +import java.util.Collection; import java.util.Collections; -import java.util.List; /** * @by Maxim.Mossienko @@ -95,8 +95,8 @@ public class AntHighlightingTest extends DaemonAnalyzerTestCase { } - protected List doHighlighting() { - final List infos = super.doHighlighting(); + protected Collection doHighlighting() { + final Collection infos = super.doHighlighting(); if (!myIgnoreInfos) { return infos; } @@ -106,4 +106,4 @@ public class AntHighlightingTest extends DaemonAnalyzerTestCase { protected LocalInspectionTool[] configureLocalInspectionTools() { return new LocalInspectionTool[]{new AntDuplicateTargetsInspection()}; } -} \ No newline at end of file +} diff --git a/codeInsight/tests/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java b/codeInsight/tests/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java index 7544825514..b40fa5c9d0 100644 --- a/codeInsight/tests/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java +++ b/codeInsight/tests/com/intellij/codeInsight/daemon/DaemonAnalyzerTestCase.java @@ -196,12 +196,59 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { } protected Collection highlightErrors() { - return filter(doHighlighting(), HighlightSeverity.ERROR); + Collection infos = new ArrayList(doHighlighting()); + Iterator iterator = infos.iterator(); + while (iterator.hasNext()) { + HighlightInfo info = iterator.next(); + if (info.getSeverity() != HighlightSeverity.ERROR) iterator.remove(); + } + return infos; } - protected List doHighlighting() { + protected Collection doHighlighting() { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + /* + final List result = new ArrayList(); + + if (doTestLineMarkers()) { + collectLineMarkersForFile(getFile(), getEditor(), result); + } + + result.addAll(collectHighlighInfos(getFile(), getEditor())); + // + boolean isToLaunchExternal = true; + for (HighlightInfo info : result) { + if (info.getSeverity() == HighlightSeverity.ERROR) { + isToLaunchExternal = false; + break; + } + } + + if (doTestCustomPass()) { + TextEditorHighlightingPass pass = getCustomPass(getFile(), getEditor()); + if (pass != null) { + pass.collectInformation(new MockProgressIndicator()); + pass.applyInformationToEditor(); + result.addAll(pass.getHighlights()); + } + } + + if (forceExternalValidation()) { + result.clear(); + } + + if (isToLaunchExternal && doExternalValidation() || forceExternalValidation()) { + ((DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(myProject)).getFileStatusMap().setErrorFoundFlag(getDocument(getFile()), false); + ExternalToolPass pass = new ExternalToolPass(getFile(), getEditor(), 0, getEditor().getDocument().getTextLength()); + pass.collectInformation(new MockProgressIndicator()); + pass.applyInformationToEditor(); + result.addAll(pass.getHighlights()); + } + + return result; + */ + TIntArrayList toIgnore = new TIntArrayList(); if (!doTestLineMarkers()) { toIgnore.add(Pass.UPDATE_OVERRIDEN_MARKERS); @@ -222,15 +269,6 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { return infos == null ? Collections.emptyList() : new ArrayList(infos); } - public static List filter(final List infos, HighlightSeverity minSeverity) { - ArrayList result = new ArrayList(); - for (final HighlightInfo info : infos) { - if (info.getSeverity().compareTo(minSeverity) >= 0) result.add(info); - } - return result; - } - - protected TextEditorHighlightingPass getCustomPass(final PsiFile file, final Editor editor) { return null; } @@ -262,8 +300,9 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { protected static IntentionAction findIntentionAction(final Collection infos, final String intentionActionName, final Editor editor, final PsiFile file) { - List actions = LightQuickFixTestCase.getAvailableActions(editor, file); - IntentionAction intentionAction = LightQuickFixTestCase.findActionWithText(actions, intentionActionName); + IntentionAction intentionAction = LightQuickFixTestCase.findActionWithText(LightQuickFixTestCase.getAvailableActions(editor, file), + intentionActionName + ); if (intentionAction == null) { final List availableActions = new ArrayList(); @@ -295,16 +334,15 @@ public abstract class DaemonAnalyzerTestCase extends CodeInsightTestCase { } protected PsiClass createClass(final Module module, final String text) throws IOException { - final String qname = ((PsiJavaFile)PsiFileFactory.getInstance(getProject()).createFileFromText("a.java", text)).getClasses()[0].getQualifiedName(); + final String qname = + ((PsiJavaFile)PsiFileFactory.getInstance(getProject()).createFileFromText("a.java", text)).getClasses()[0].getQualifiedName(); final VirtualFile[] files = ModuleRootManager.getInstance(module).getSourceRoots(); File dir; if (files.length > 0) { dir = VfsUtil.virtualToIoFile(files[0]); - } - else { + } else { dir = createTempDir("unitTest"); - VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(dir.getCanonicalPath().replace(File.separatorChar, '/')); - addSourceContentToRoots(module, vDir); + addSourceContentToRoots(module, LocalFileSystem.getInstance().refreshAndFindFileByPath(dir.getCanonicalPath().replace(File.separatorChar, '/'))); } File file = new File(dir, qname.replace('.', '/') + ".java"); diff --git a/codeInsight/tests/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java b/codeInsight/tests/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java index 822d804374..27afabf2a7 100644 --- a/codeInsight/tests/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java +++ b/codeInsight/tests/com/intellij/codeInsight/daemon/LightDaemonAnalyzerTestCase.java @@ -9,13 +9,9 @@ import com.intellij.openapi.fileTypes.FileTypeManager; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileFilter; -import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; -import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.testFramework.ExpectedHighlightingData; import com.intellij.testFramework.LightCodeInsightTestCase; -import com.intellij.injected.editor.EditorWindow; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -63,20 +59,13 @@ public abstract class LightDaemonAnalyzerTestCase extends LightCodeInsightTestCa } @NotNull - protected List doHighlighting() { + protected Collection doHighlighting() { PsiDocumentManager.getInstance(getProject()).commitAllDocuments(); MockProgressIndicator progress = new MockProgressIndicator(); int[] toIgnore = doFolding() ? new int[0] : new int[]{Pass.UPDATE_FOLDING}; - Editor editor = getEditor(); - PsiFile file = getFile(); - if (editor instanceof EditorWindow) { - editor = ((EditorWindow)editor).getDelegate(); - file = InjectedLanguageUtil.getTopLevelFile(file); - } - TextEditorHighlightingPassRegistrarEx registrar = TextEditorHighlightingPassRegistrarEx.getInstanceEx(getProject()); - List passes = registrar.instantiatePasses(file, editor, toIgnore); + List passes = TextEditorHighlightingPassRegistrarEx.getInstanceEx(getProject()).instantiatePasses(getFile(), getEditor(), toIgnore); for (TextEditorHighlightingPass pass : passes) { pass.collectInformation(progress); @@ -85,7 +74,7 @@ public abstract class LightDaemonAnalyzerTestCase extends LightCodeInsightTestCa pass.applyInformationToEditor(); } - List infos = DaemonCodeAnalyzerImpl.getHighlights(editor.getDocument(), getProject()); + List infos = DaemonCodeAnalyzerImpl.getHighlights(getEditor().getDocument(), getProject()); return infos == null ? Collections.emptyList() : new ArrayList(infos); } diff --git a/codeInsight/tests/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java b/codeInsight/tests/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java index 9af29289a9..26b4e6db55 100644 --- a/codeInsight/tests/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java +++ b/codeInsight/tests/com/intellij/codeInsight/daemon/quickFix/LightQuickFixTestCase.java @@ -2,6 +2,7 @@ package com.intellij.codeInsight.daemon.quickFix; import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.lang.Commenter; import com.intellij.lang.LanguageCommenters; @@ -12,10 +13,10 @@ import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; +import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; import com.intellij.util.IncorrectOperationException; -import com.intellij.testFramework.fixtures.impl.CodeInsightTestFixtureImpl; import org.intellij.lang.annotations.RegExp; import org.jetbrains.annotations.NonNls; @@ -178,7 +179,21 @@ public abstract class LightQuickFixTestCase extends LightDaemonAnalyzerTestCase } public static List getAvailableActions(final Editor editor, final PsiFile file) { - return CodeInsightTestFixtureImpl.getAvailableIntentions(editor, file); + List descriptors = QuickFixAction.getAvailableActions(editor, file, -1); + PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); + List result = new ArrayList(); + for (HighlightInfo.IntentionActionDescriptor descriptor : descriptors) { + result.add(descriptor.getAction()); + List options = descriptor.getOptions(element); + if (options != null) { + for (IntentionAction option : options) { + if (option.isAvailable(file.getProject(), editor, file)) { + result.add(option); + } + } + } + } + return result; } @NonNls protected String getBasePath() {return null;} diff --git a/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index 6fb83cfdb7..3c01a05144 100644 --- a/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -17,6 +17,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.ex.EditorMarkupModel; +import com.intellij.openapi.editor.ex.MarkupModelEx; import com.intellij.openapi.editor.markup.MarkupModel; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.extensions.Extensions; @@ -449,6 +450,24 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx } } + static void assertMarkupConsistent(MarkupModel markup, List highlightsToSet, List highlightsToRemove) { + if (LOG.isDebugEnabled()) { + if (highlightsToSet != null) { + for (HighlightInfo info : highlightsToSet) { + assert ((MarkupModelEx)markup).containsHighlighter(info.highlighter); + } + } + RangeHighlighter[] allHighlighters = markup.getAllHighlighters(); + for (RangeHighlighter highlighter : allHighlighters) { + Object tooltip = highlighter.getErrorStripeTooltip(); + if (tooltip instanceof HighlightInfo) { + HighlightInfo info = (HighlightInfo)tooltip; + assert highlightsToSet != null && highlightsToSet.contains(info) || highlightsToRemove != null && highlightsToRemove.contains(info); + } + } + } + } + private static void stripWarningsCoveredByErrors(final Project project, List highlights, MarkupModel markup) { final SeverityRegistrar severityRegistrar = SeverityRegistrar.getInstance(project); Collection errors = new ArrayList(); @@ -580,10 +599,4 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx List infos = markup.getUserData(HIGHLIGHTS_TO_REMOVE_KEY); return infos == null ? Collections.emptyList() : infos; } - - @NotNull - @TestOnly - public static List getFileLeveleHighlights(Project project,PsiFile file ) { - return UpdateHighlightersUtil.getFileLeveleHighlights(project, file); - } } diff --git a/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowIntentionsPass.java b/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowIntentionsPass.java index cfefc33e05..f4a3d736a2 100644 --- a/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowIntentionsPass.java +++ b/lang-impl/src/com/intellij/codeInsight/daemon/impl/ShowIntentionsPass.java @@ -75,7 +75,8 @@ public class ShowIntentionsPass extends TextEditorHighlightingPass { List intentionsToShow = new ArrayList(); List errorFixesToShow = new ArrayList(); List inspectionFixesToShow = new ArrayList(); - getActionsToShow(myEditor, myFile, intentionsToShow, errorFixesToShow, inspectionFixesToShow, myPassIdToShowIntentionsFor); + getActionsToShow(myEditor, myFile, intentionsToShow, errorFixesToShow, inspectionFixesToShow, + IntentionManager.getInstance().getIntentionActions(), myPassIdToShowIntentionsFor); if (myFile instanceof IntentionFilterOwner) { final IntentionFilterOwner.IntentionActionsFilter actionsFilter = ((IntentionFilterOwner)myFile).getIntentionActionsFilter(); if (actionsFilter == null) return; @@ -128,17 +129,18 @@ public class ShowIntentionsPass extends TextEditorHighlightingPass { } } - public static void getActionsToShow(final Editor editor, final PsiFile psiFile, final List intentionsToShow, - final List errorFixesToShow, - final List inspectionFixesToShow, - int passIdToShowIntentionsFor) { + public static void getActionsToShow(final Editor editor, final PsiFile psiFile, + final List intentionsToShow, + final List errorFixesToShow, + final List inspectionFixesToShow, + IntentionAction[] allIntentionActions, int passIdToShowIntentionsFor) { final PsiElement psiElement = psiFile.findElementAt(editor.getCaretModel().getOffset()); LOG.assertTrue(psiElement == null || psiElement.isValid(), psiElement); final boolean isInProject = psiFile.getManager().isInProject(psiFile); int offset = editor.getCaretModel().getOffset(); Project project = psiFile.getProject(); - for (IntentionAction action : IntentionManager.getInstance().getIntentionActions()) { + for (IntentionAction action : allIntentionActions) { if (action instanceof PsiElementBaseIntentionAction) { if (!isInProject || !((PsiElementBaseIntentionAction)action).isAvailable(project, editor, psiElement)) continue; } diff --git a/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java b/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java index 48ac5160e9..cf5db26a93 100644 --- a/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java +++ b/lang-impl/src/com/intellij/codeInsight/daemon/impl/UpdateHighlightersUtil.java @@ -12,7 +12,6 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.editor.event.DocumentEvent; import com.intellij.openapi.editor.ex.DocumentEx; import com.intellij.openapi.editor.ex.EditorEx; -import com.intellij.openapi.editor.ex.MarkupModelEx; import com.intellij.openapi.editor.ex.RangeHighlighterEx; import com.intellij.openapi.editor.highlighter.HighlighterIterator; import com.intellij.openapi.editor.markup.*; @@ -27,11 +26,9 @@ import com.intellij.openapi.util.TextRange; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; -import com.intellij.util.containers.MultiMap; import gnu.trove.THashMap; import gnu.trove.TObjectHashingStrategy; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.TestOnly; import java.awt.*; import java.util.*; @@ -39,7 +36,6 @@ import java.util.List; public class UpdateHighlightersUtil { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.UpdateHighlightersUtil"); - public static boolean DEBUG = LOG.isDebugEnabled(); private static final Key> FILE_LEVEL_HIGHLIGHTS = Key.create("FILE_LEVEL_HIGHLIGHTS"); private static final Comparator BY_START_OFFSET = new Comparator() { @@ -133,20 +129,10 @@ public class UpdateHighlightersUtil { MarkupModel markup = document.getMarkupModel(project); List oldHighlights = DaemonCodeAnalyzerImpl.getHighlights(markup); List highlightsToRemove = DaemonCodeAnalyzerImpl.getHighlightsToRemove(markup); - assertMarkupConsistent(markup, oldHighlights, highlightsToRemove); + DaemonCodeAnalyzerImpl.assertMarkupConsistent(markup, oldHighlights, highlightsToRemove); List result = new ArrayList(); - MultiMap infosToRemove = new MultiMap(){ - @Override - protected Map> createMap() { - return new THashMap>(DISTINQUISH_INVALID_MARKERS); - } - - @Override - protected Collection createCollection() { - return new ArrayList(); - } - }; + Map infosToRemove = new THashMap(DISTINQUISH_INVALID_MARKERS); boolean changed = false; if (oldHighlights != null) { @@ -156,7 +142,7 @@ public class UpdateHighlightersUtil { info.group == group && Collections.binarySearch(ranges, new TextRange(highlighter.getStartOffset(), highlighter.getEndOffset()), BY_START_OFFSET_OR_CONTAINS) >= 0; if (toRemove) { - infosToRemove.putValue(info,info); + infosToRemove.put(info,info); changed = true; } else { @@ -166,10 +152,12 @@ public class UpdateHighlightersUtil { } for (HighlightInfo info : highlightsToRemove) { - infosToRemove.putValue(info, info); - result.remove(info); - changed = true; + infosToRemove.put(info, info); } + changed |= !highlightsToRemove.isEmpty(); + + boolean removed = result.removeAll(infosToRemove.keySet()); + changed |= removed; Map ranges2markersCache = new THashMap(oldHighlights == null ? 10 : oldHighlights.size()); for (TextRange range : ranges) { @@ -207,9 +195,7 @@ public class UpdateHighlightersUtil { info.text = document.getCharsSequence().subSequence(infoStartOffset, infoEndOffset).toString(); info.group = group; - List values = (List)infosToRemove.get(info); - - HighlightInfo toRemove = values.isEmpty() ? null : values.remove(0); + HighlightInfo toRemove = infosToRemove.remove(info); RangeHighlighterEx highlighter; if (toRemove != null && toRemove.highlighter.isValid()) { highlighter = toRemove.highlighter; @@ -245,26 +231,26 @@ public class UpdateHighlightersUtil { result.add(info); } - for (Iterator it = infosToRemove.keySet().iterator(); it.hasNext();) { - HighlightInfo info = it.next(); + for (Iterator> it = infosToRemove.entrySet().iterator(); it.hasNext();) { + Map.Entry entry = it.next(); + HighlightInfo info = entry.getKey(); if (info.highlighter.isValid()) { - if (info.group != group || info.getActualStartOffset() < rangeStartOffset || info.getActualEndOffset() > rangeEndOffset) continue; - } - Collection values = infosToRemove.get(info); - for (HighlightInfo value : values) { - markup.removeHighlighter(value.highlighter); + if (info.group != group + || info.getActualStartOffset() < rangeStartOffset + || info.getActualEndOffset() > rangeEndOffset) continue; } + markup.removeHighlighter(info.highlighter); changed = true; it.remove(); } } - List listToRemove = infosToRemove.isEmpty() ? Collections.emptyList() : new ArrayList(infosToRemove.values()); + List listToRemove = infosToRemove.isEmpty() ? Collections.emptyList() : new ArrayList(infosToRemove.keySet()); if (changed) { DaemonCodeAnalyzerImpl.setHighlights(markup, project, result, listToRemove); clearWhiteSpaceOptimizationFlag(document); } - assertMarkupConsistent(markup, result, listToRemove); + DaemonCodeAnalyzerImpl.assertMarkupConsistent(markup, result, listToRemove); } private static RangeHighlighterEx createRangeHighlighter(Project project, @@ -439,46 +425,10 @@ public class UpdateHighlightersUtil { if (highlightersChanged) { DaemonCodeAnalyzerImpl.setHighlights(markup, project, result, infosToRemove); } - assertMarkupConsistent(markup, result, infosToRemove); + DaemonCodeAnalyzerImpl.assertMarkupConsistent(markup, result, infosToRemove); if (highlightersChanged || documentChangedInsideHighlighter) { disableWhiteSpaceOptimization(document); } } - - @NotNull - @TestOnly - public static List getFileLeveleHighlights(Project project, PsiFile file) { - VirtualFile vFile = file.getViewProvider().getVirtualFile(); - final FileEditorManager manager = FileEditorManager.getInstance(project); - List result = new ArrayList(); - for (FileEditor fileEditor : manager.getEditors(vFile)) { - final List infos = fileEditor.getUserData(FILE_LEVEL_HIGHLIGHTS); - if (infos == null) continue; - for (HighlightInfo info : infos) { - result.add(info); - } - } - return result; - } - - private static void assertMarkupConsistent(MarkupModel markup, List highlightsToSet, List highlightsToRemove) { - if (DEBUG) { - if (highlightsToSet != null) { - for (HighlightInfo info : highlightsToSet) { - assert ((MarkupModelEx)markup).containsHighlighter(info.highlighter); - } - } - RangeHighlighter[] allHighlighters = markup.getAllHighlighters(); - for (RangeHighlighter highlighter : allHighlighters) { - Object tooltip = highlighter.getErrorStripeTooltip(); - if (tooltip instanceof HighlightInfo) { - HighlightInfo info = (HighlightInfo)tooltip; - assert highlightsToSet != null && highlightsToSet.contains(info) - || highlightsToRemove != null && highlightsToRemove.contains(info) - ; - } - } - } - } } diff --git a/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java b/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java index 8a776aa6c4..78f4417df2 100644 --- a/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java +++ b/lang-impl/src/com/intellij/codeInsight/intention/impl/ShowIntentionActionsHandler.java @@ -8,6 +8,7 @@ import com.intellij.codeInsight.daemon.impl.LocalInspectionsPass; import com.intellij.codeInsight.daemon.impl.ShowIntentionsPass; import com.intellij.codeInsight.hint.HintManagerImpl; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInsight.intention.IntentionManager; import com.intellij.codeInsight.intention.PsiElementBaseIntentionAction; import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.codeInsight.template.impl.TemplateState; @@ -51,11 +52,13 @@ public class ShowIntentionActionsHandler implements CodeInsightActionHandler { final DaemonCodeAnalyzerImpl codeAnalyzer = (DaemonCodeAnalyzerImpl)DaemonCodeAnalyzer.getInstance(project); codeAnalyzer.autoImportReferenceAtCursor(editor, file); //let autoimport complete + final IntentionAction[] intentionActions = IntentionManager.getInstance().getIntentionActions(); + final ArrayList intentionsToShow = new ArrayList(); final ArrayList errorFixesToShow = new ArrayList(); final ArrayList inspectionFixesToShow = new ArrayList(); - ShowIntentionsPass.getActionsToShow(editor, file, intentionsToShow, errorFixesToShow, inspectionFixesToShow, -1); + ShowIntentionsPass.getActionsToShow(editor, file, intentionsToShow, errorFixesToShow, inspectionFixesToShow, intentionActions, -1); if (!codeAnalyzer.isAllAnalysisFinished(file)) { runPassesAndShowIntentions(project, editor, file, intentionsToShow); diff --git a/source/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java b/source/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java index 39f742aa61..f69c95c9df 100644 --- a/source/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java +++ b/source/com/intellij/codeInsight/daemon/impl/PostHighlightingPass.java @@ -86,7 +86,7 @@ public class PostHighlightingPass extends TextEditorHighlightingPass { myImplicitUsageProviders = Extensions.getExtensions(ImplicitUsageProvider.EP_NAME); } - PostHighlightingPass(@NotNull Project project, @NotNull PsiFile file, @NotNull Editor editor, int startOffset, int endOffset) { + public PostHighlightingPass(@NotNull Project project, @NotNull PsiFile file, @NotNull Editor editor, int startOffset, int endOffset) { this(project, file, editor, editor.getDocument(), startOffset, endOffset); } diff --git a/source/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/source/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 8bc678d12b..f5de2cd02f 100644 --- a/source/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/source/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -5,7 +5,6 @@ package com.intellij.testFramework.fixtures.impl; import com.intellij.codeHighlighting.HighlightDisplayLevel; -import com.intellij.codeHighlighting.TextEditorHighlightingPass; import com.intellij.codeInsight.CodeInsightActionHandler; import com.intellij.codeInsight.TargetElementUtilBase; import com.intellij.codeInsight.completion.CodeCompletionHandlerBase; @@ -13,11 +12,9 @@ import com.intellij.codeInsight.completion.CompletionContext; import com.intellij.codeInsight.completion.CompletionProgressIndicator; import com.intellij.codeInsight.completion.CompletionType; import com.intellij.codeInsight.daemon.HighlightDisplayKey; -import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; -import com.intellij.codeInsight.daemon.impl.HighlightInfo; -import com.intellij.codeInsight.daemon.impl.ShowIntentionsPass; -import com.intellij.codeInsight.daemon.impl.TextEditorHighlightingPassRegistrarEx; +import com.intellij.codeInsight.daemon.impl.*; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInsight.intention.IntentionManager; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupManager; import com.intellij.codeInsight.lookup.impl.LookupImpl; @@ -303,15 +300,15 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig return new WriteCommandAction>(project) { protected void run(final Result> result) throws Throwable { configureByFilesInner(filePaths); - result.setResult(getAvailableIntentions()); + result.setResult(CodeInsightTestFixtureImpl.this.getAvailableIntentions()); } }.execute().getResultObject(); } @NotNull public List getAvailableIntentions() { - doHighlighting(); - return getAvailableIntentions(myEditor, myFile); + int offset = myEditor.getCaretModel().getOffset(); + return getAvailableIntentions(myProjectFixture.getProject(), doHighlighting(), offset, myEditor, myFile); } public List filterAvailableIntentions(@NotNull final String hint) throws Throwable { @@ -527,11 +524,18 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig addGutterIconRenderer(info.getGutterIconRenderer(), info.startOffset); } - doHighlighting(); + LineMarkersPass markersPass = new LineMarkersPass(project, myFile, myEditor.getDocument(), 0, myFile.getTextLength(), true); + markersPass.doCollectInformation(new MockProgressIndicator()); + markersPass.doApplyInformationToEditor(); + + SlowLineMarkersPass slowMarkers = new SlowLineMarkersPass(project, myFile, myEditor.getDocument(), 0, myFile.getTextLength()); + slowMarkers.doCollectInformation(new MockProgressIndicator()); + slowMarkers.doApplyInformationToEditor(); for (final RangeHighlighter highlighter : myEditor.getDocument().getMarkupModel(project).getAllHighlighters()) { addGutterIconRenderer(highlighter.getGutterIconRenderer(), highlighter.getStartOffset()); } + } private void addGutterIconRenderer(final GutterIconRenderer renderer, final int offset) { @@ -932,25 +936,39 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @NotNull private Collection doHighlighting() { + final Project project = myProjectFixture.getProject(); + PsiDocumentManager.getInstance(project).commitAllDocuments(); - return - ApplicationManager.getApplication().runReadAction(new Computable>() { - public Collection compute() { - List passes = - TextEditorHighlightingPassRegistrarEx.getInstanceEx(getProject()).instantiatePasses(getFile(), getEditor(), new int[0]); - MockProgressIndicator progress = new MockProgressIndicator(); - for (TextEditorHighlightingPass pass : passes) { - pass.collectInformation(progress); - } - for (TextEditorHighlightingPass pass : passes) { - pass.applyInformationToEditor(); - } - List infos = DaemonCodeAnalyzerImpl.getHighlights(getEditor().getDocument(), getProject()); - return infos == null ? Collections.emptyList() : new ArrayList(infos); - } - }); + Document document = myEditor.getDocument(); + GeneralHighlightingPass action1 = new GeneralHighlightingPass(project, myFile, document, 0, myFile.getTextLength(), true); + action1.doCollectInformation(new MockProgressIndicator()); + Collection highlights1 = action1.getHighlights(); + + PostHighlightingPass action2 = new PostHighlightingPass(project, myFile, myEditor, 0, myFile.getTextLength()); + action2.doCollectInformation(new MockProgressIndicator()); + Collection highlights2 = action2.getHighlights(); + + Collection highlights3 = null; + if (!myAvailableTools.isEmpty()) { + LocalInspectionsPass inspectionsPass = new LocalInspectionsPass(myFile, myEditor.getDocument(), 0, myFile.getTextLength()); + inspectionsPass.doCollectInformation(new MockProgressIndicator()); + highlights3 = inspectionsPass.getHighlights(); + } + + ExternalToolPass action4 = new ExternalToolPass(myFile, myEditor, 0, myFile.getTextLength()); + action4.doCollectInformation(new MockProgressIndicator()); + Collection highlights4 = action4.getHighlights(); + + ArrayList list = new ArrayList(); + list.addAll(highlights1); + list.addAll(highlights2); + if (highlights3 != null) { + list.addAll(highlights3); + } + list.addAll(highlights4); + return list; } public String getTestDataPath() { @@ -973,60 +991,41 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig return myFile; } - public static List getAvailableIntentions(final Editor editor, final PsiFile file) { - return ApplicationManager.getApplication().runReadAction(new Computable>() { - public List compute() { - return doGetAvailableIntentions(editor, file); - } - }); - } - - private static List doGetAvailableIntentions(Editor editor, PsiFile file) { - List descriptors = new ArrayList(); - ShowIntentionsPass.getActionsToShow(editor, file, descriptors, descriptors, descriptors, -1); - - /* + public static List getAvailableIntentions(final Project project, final Collection infos, final int offset, + final Editor editor, final PsiFile file) { final List availableActions = new ArrayList(); + for (HighlightInfo info :infos) { if (info.quickFixActionRanges != null) { for (Pair pair : info.quickFixActionRanges) { - IntentionAction action = pair.first.getAction(); - if (action.isAvailable(file.getProject(), editor, file)) availableActions.add(action); - } - } - } - - intentionAction = LightQuickFixTestCase.findActionWithText( - availableActions, - intentionActionName - ); - */ - - PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); - List result = new ArrayList(); - - List infos = DaemonCodeAnalyzerImpl.getFileLeveleHighlights(file.getProject(), file); - for (HighlightInfo info : infos) { - for (Pair pair : info.quickFixActionRanges) { - HighlightInfo.IntentionActionDescriptor actionInGroup = pair.first; - if (actionInGroup.getAction().isAvailable(file.getProject(), editor, file)) { - descriptors.add(actionInGroup); + if (offset > 0 && !pair.getSecond().contains(offset)) { + continue; + } + final HighlightInfo.IntentionActionDescriptor actionDescriptor = pair.first; + final IntentionAction action = actionDescriptor.getAction(); + if (action.isAvailable(project, editor, file)) { + availableActions.add(action); + final PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); + assert element != null; + final List actions = actionDescriptor.getOptions(element); + if (actions != null) { + for (IntentionAction intentionAction : actions) { + if (intentionAction.isAvailable(project, editor, file)) { + availableActions.add(intentionAction); + } + } + } + } } } } - for (HighlightInfo.IntentionActionDescriptor descriptor : descriptors) { - result.add(descriptor.getAction()); - List options = descriptor.getOptions(element); - if (options != null) { - for (IntentionAction option : options) { - if (option.isAvailable(file.getProject(), editor, file)) { - result.add(option); - } - } + for (IntentionAction intentionAction : IntentionManager.getInstance().getIntentionActions()) { + if (intentionAction.isAvailable(project, editor, file)) { + availableActions.add(intentionAction); } } - return result; + return availableActions; } static class SelectionAndCaretMarkupLoader { diff --git a/source/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java b/source/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java index 290171e826..1c06328890 100644 --- a/source/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java +++ b/source/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java @@ -5,22 +5,23 @@ package com.intellij.testFramework.fixtures.impl; import com.intellij.codeInspection.LocalInspectionTool; -import com.intellij.openapi.actionSystem.DataConstants; -import com.intellij.openapi.actionSystem.DataProvider; -import com.intellij.openapi.fileEditor.FileEditorManager; -import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.impl.JavaSdkImpl; -import com.intellij.psi.codeStyle.CodeStyleSettings; -import com.intellij.psi.codeStyle.CodeStyleSettingsManager; +import com.intellij.openapi.actionSystem.DataProvider; +import com.intellij.openapi.actionSystem.DataConstants; +import com.intellij.openapi.fileEditor.OpenFileDescriptor; +import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.testFramework.LightIdeaTestCase; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.Nullable; +import com.intellij.psi.codeStyle.CodeStyleSettings; +import com.intellij.psi.codeStyle.CodeStyleSettingsManager; import java.util.HashMap; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.NonNls; + /** * @author mike */ @@ -29,7 +30,7 @@ class LightIdeaTestFixtureImpl extends BaseFixture implements IdeaProjectTestFix super.setUp(); LightIdeaTestCase.initApplication(new MyDataProvider()); - LightIdeaTestCase.doSetup(JavaSdkImpl.getMockJdk("java 1.4"), new LocalInspectionTool[0], new HashMap(), null); + LightIdeaTestCase.doSetup(JavaSdkImpl.getMockJdk15("50"), new LocalInspectionTool[0], new HashMap(), null); storeSettings(); } -- 2.11.4.GIT