diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/NonSourceInspectionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/NonSourceInspectionTest.groovy index 4782d4ab8bb8..8faefef3272a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/NonSourceInspectionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/NonSourceInspectionTest.groovy @@ -24,21 +24,25 @@ import com.intellij.psi.PsiMethod import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase import groovy.transform.CompileStatic +import org.intellij.lang.annotations.Language @CompileStatic class NonSourceInspectionTest extends JavaCodeInsightFixtureTestCase { - void "test inspection outside source root"() { PsiTestUtil.removeAllRoots(module, ModuleRootManager.getInstance(module).sdk) PsiTestUtil.addSourceRoot(module, myFixture.tempDirFixture.findOrCreateDir("src")) - - myFixture.addFileToProject("src/foo/GenericQuery.java", """ + + @Language("JAVA") + def generic = """ package foo; public interface GenericQuery { public T execute(); } -""") - def file = myFixture.addFileToProject("SomeClass.java", """ +""" + myFixture.addFileToProject("src/foo/GenericQuery.java", generic) + + @Language("JAVA") + def some = """ import foo.GenericQuery; import java.util.Collection; @@ -50,7 +54,8 @@ class SomeClass { } -""") +""" + def file = myFixture.addFileToProject("SomeClass.java", some) def wrapper = new LocalInspectionToolWrapper(new UncheckedWarningLocalInspection()) def context = InspectionManager.getInstance(project).createNewGlobalContext() @@ -61,14 +66,17 @@ class SomeClass { PsiTestUtil.removeAllRoots(module, ModuleRootManager.getInstance(module).sdk) PsiTestUtil.addSourceRoot(module, myFixture.tempDirFixture.findOrCreateDir("src")) - myFixture.addFileToProject("src/Foo.java", """ + @Language("JAVA") + def foo = """ class Foo { public Foo(T x) { } } -""") +""" + myFixture.addFileToProject("src/Foo.java", foo) - myFixture.configureByText("Foo.java", """ + @Language("JAVA") + def foo2 = """ class Foo { public Foo(T x) { } @@ -79,10 +87,10 @@ class Bar extends Foo { super("a"); } } -""") +""" + myFixture.configureByText("Foo.java", foo2) assert myFixture.file.physical assert assertInstanceOf(myFixture.elementAtCaret, PsiMethod).name == 'Foo' } - } diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java index 2ab2e55b0f7d..1706a5e9f23d 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/impl/HighlightInfo.java @@ -50,6 +50,7 @@ import java.util.function.BiFunction; import static com.intellij.openapi.util.NlsContexts.DetailedDescription; import static com.intellij.openapi.util.NlsContexts.Tooltip; +@ApiStatus.NonExtendable public class HighlightInfo implements Segment { private static final Logger LOG = Logger.getInstance(HighlightInfo.class); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt index 325f2f1293bd..b8255c13d393 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipActionProvider.kt @@ -25,7 +25,6 @@ class DaemonTooltipActionProvider : TooltipActionProvider { val intention = extractMostPriorityFixFromHighlightInfo(info, editor, psiFile) ?: return null return wrapIntentionToTooltipAction(intention, info, editor) } - } /** @@ -33,8 +32,7 @@ class DaemonTooltipActionProvider : TooltipActionProvider { * @param myFixText is a text to show in tooltip * @param myActionText is a text to search for in intentions' actions */ -class DaemonTooltipAction(@NlsActions.ActionText private val myFixText: String, @NlsContexts.Command private val myActionText: String, private val myActualOffset: Int) : TooltipAction { - +private class DaemonTooltipAction(@NlsActions.ActionText private val myFixText: String, @NlsContexts.Command private val myActionText: String, private val myActualOffset: Int) : TooltipAction { override fun getText(): String { return myFixText } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java index 57e02e40e0a4..971bd531793c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipRendererProvider.java @@ -10,6 +10,7 @@ import com.intellij.openapi.editor.ex.TooltipAction; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NlsContexts; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -61,7 +62,7 @@ public class DaemonTooltipRendererProvider implements ErrorStripTooltipRendererP ContainerUtil.quickSort(infos, (o1, o2) -> { int i = SeverityRegistrar.getSeverityRegistrar(myProject).compare(o2.getSeverity(), o1.getSeverity()); if (i != 0) return i; - return o1.getToolTip().compareTo(o2.getToolTip()); + return StringUtil.compare(o1.getToolTip(), o2.getToolTip(), false); }); HighlightInfoComposite composite = HighlightInfoComposite.create(infos); String toolTip = composite.getToolTip(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt index 76764f39186b..87fcb6196305 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonTooltipWithActionRenderer.kt @@ -154,17 +154,14 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String val topInset = 5 val bottomInset = (if (highlightActions) 4 else 10) - buttons.add(createActionLabel(tooltipAction.text, runFixAction, hintHint.textBackground), - gridBag.next().insets(topInset, 10, bottomInset, 4)) - buttons.add(createKeymapHint(shortcutRunActionText), - gridBag.next().insets(topInset, 4, bottomInset, 12)) + buttons.add(createActionLabel(tooltipAction.text, hintHint.textBackground, runFixAction), gridBag.next().insets(topInset, 10, bottomInset, 4)) + buttons.add(createKeymapHint(shortcutRunActionText), gridBag.next().insets(topInset, 4, bottomInset, 12)) - val showAllFixes = { _: InputEvent? -> + val actionLabel = createActionLabel(DaemonBundle.message("daemon.tooltip.more.actions.link.label"), hintHint.textBackground) { hint.hide() tooltipAction.showAllActions(editor) } - - buttons.add(createActionLabel(DaemonBundle.message("daemon.tooltip.more.actions.link.label"), showAllFixes, hintHint.textBackground), + buttons.add(actionLabel, gridBag.next().insets(topInset, 12, bottomInset, 4)) buttons.add(createKeymapHint(shortcutShowAllActionsText), gridBag.next().fillCellHorizontally().insets(topInset, 4, bottomInset, 20)) @@ -173,7 +170,6 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String override fun actionPerformed(e: AnActionEvent) { runFixAction(e.inputEvent) } - init { registerCustomShortcutSet(runActionCustomShortcutSet, editor.contentComponent) } @@ -181,9 +177,9 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String actions.add(object : AnAction() { override fun actionPerformed(e: AnActionEvent) { - showAllFixes(e.inputEvent) + hint.hide() + tooltipAction.showAllActions(editor) } - init { registerCustomShortcutSet(getActiveKeymapShortcuts(IdeActions.ACTION_SHOW_INTENTION_ACTIONS), editor.contentComponent) } @@ -191,7 +187,6 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String val buttonsConstraints = GridBagConstraints(0, 1, 2, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, JBUI.insetsTop(0), 0, 0) - grid.add(wrapper, buttonsConstraints) } @@ -270,7 +265,7 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String return super.canAutoHideOn(event) } - private fun isOwnAction(action: AnAction?) = action is ShowDocAction || action is ShowActionsAction || action is SettingsActionGroup + private fun isOwnAction(action: AnAction?): Boolean = action is ShowDocAction || action is ShowActionsAction || action is SettingsActionGroup private class SettingsActionGroup(actions: List) : DefaultActionGroup(actions), HintManagerImpl.ActionToIgnore, DumbAware { init { @@ -307,9 +302,8 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String return wrapper } - private inner class ShowActionsAction( - val reloader: TooltipReloader, val isEnabled: Boolean - ) : ToggleAction(DaemonBundle.message("daemon.tooltip.show.quick.fixes.action.text")), + private inner class ShowActionsAction(val reloader: TooltipReloader, val isEnabled: Boolean) + : ToggleAction(DaemonBundle.message("daemon.tooltip.show.quick.fixes.action.text")), HintManagerImpl.ActionToIgnore { override fun isSelected(e: AnActionEvent): Boolean { @@ -360,8 +354,7 @@ internal class DaemonTooltipWithActionRenderer(@NlsContexts.Tooltip text: String } - -fun createActionLabel(@NlsContexts.LinkLabel text: String, action: (InputEvent?) -> Unit, background: Color): HyperlinkLabel { +private fun createActionLabel(@NlsContexts.LinkLabel text: String, background: Color, action: (InputEvent?) -> Unit): HyperlinkLabel { val label = object : HyperlinkLabel(text, background) { override fun getTextOffset(): Int { return 0