From 669cbb203b8f25b8da1e8641a417da56e05a6ba2 Mon Sep 17 00:00:00 2001 From: Alexey Tsvetkov Date: Fri, 12 Dec 2014 20:43:31 +0300 Subject: [PATCH] Reload rendrer when application changes (for tests) --- .../messages/AnalyzerWithCompilerReport.java | 2 +- .../jet/checkers/CheckerTestUtil.java | 13 +--- .../jet/lang/diagnostics/DiagnosticSink.java | 2 +- .../rendering/DefaultErrorMessages.java | 69 ++++++++++++++++--- .../DispatchingDiagnosticRenderer.java | 3 +- .../tests/org/jetbrains/jet/JetTestUtils.java | 2 +- .../jet/types/TypeSubstitutorTest.java | 2 +- .../plugin/highlighter/IdeErrorMessages.java | 24 +++++-- .../jet/plugin/highlighter/JetPsiChecker.kt | 4 +- .../evaluate/KotlinEvaluationBuilder.kt | 2 +- .../QuickFixFactoryForTypeMismatchError.java | 2 +- .../jet/plugin/DirectiveBasedActionUtils.java | 2 +- .../AbstractInsertImportOnPasteTest.java | 2 +- .../AbstractDiagnosticMessageTest.java | 6 +- .../test/AbstractJavaToKotlinConverterTest.kt | 2 +- 15 files changed, 97 insertions(+), 40 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java index 7c0870e3d25..e653551f8af 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java @@ -90,7 +90,7 @@ public final class AnalyzerWithCompilerReport { render = ((MyDiagnostic)diagnostic).message; } else { - render = DefaultErrorMessages.RENDERER.render(diagnostic); + render = DefaultErrorMessages.render(diagnostic); } PsiFile file = diagnostic.getPsiFile(); messageCollector.report(convertSeverity(diagnostic.getSeverity()), render, diff --git a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java index ebefa65083f..69df62deb7a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/checkers/CheckerTestUtil.java @@ -611,7 +611,7 @@ public class CheckerTestUtil { @NotNull public static TextDiagnostic asTextDiagnostic(@NotNull Diagnostic diagnostic) { - DiagnosticRenderer renderer = getRenderer(diagnostic); + DiagnosticRenderer renderer = DefaultErrorMessages.getRendererForDiagnostic(diagnostic); String diagnosticName = diagnostic.getFactory().getName(); if (renderer instanceof AbstractDiagnosticWithParametersRenderer) { //noinspection unchecked @@ -627,17 +627,6 @@ public class CheckerTestUtil { return new TextDiagnostic(diagnosticName, null); } - @Nullable - private static DiagnosticRenderer getRenderer(@NotNull Diagnostic diagnostic) { - for (DiagnosticFactoryToRendererMap map : DefaultErrorMessages.MAPS) { - DiagnosticRenderer renderer = map.get(diagnostic.getFactory()); - if (renderer != null) - return renderer; - } - return null; - } - - @NotNull private final String name; @Nullable diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticSink.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticSink.java index 2a89442d0da..3408bce41df 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticSink.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/DiagnosticSink.java @@ -35,7 +35,7 @@ public interface DiagnosticSink { if (diagnostic.getSeverity() == Severity.ERROR) { PsiFile psiFile = diagnostic.getPsiFile(); List textRanges = diagnostic.getTextRanges(); - String diagnosticText = DefaultErrorMessages.RENDERER.render(diagnostic); + String diagnosticText = DefaultErrorMessages.render(diagnostic); throw new IllegalStateException(diagnostic.getFactory().getName() + ": " + diagnosticText + " " + DiagnosticUtils.atLocation(psiFile, textRanges.get(0))); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index a26f6efe6b2..cff92a6dc67 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -17,11 +17,15 @@ package org.jetbrains.jet.lang.diagnostics.rendering; import com.google.common.collect.ImmutableList; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; import kotlin.Function1; import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory; import org.jetbrains.jet.lang.diagnostics.Errors; @@ -54,9 +58,42 @@ public class DefaultErrorMessages { } private static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); - public static final List MAPS = ImmutableList.builder() - .addAll( - KotlinPackage.map( + private static List maps = null; + private static Application application = ApplicationManager.getApplication(); + private static DispatchingDiagnosticRenderer renderer = null; + + @NotNull + public static String render(@NotNull Diagnostic diagnostic) { + return getRenderer().render(diagnostic); + } + + @NotNull + private static DiagnosticRenderer getRenderer() { + boolean mapsChanged = resetMapsIfNeeded(); + + // Renderer is changed in tests only + if (renderer == null || mapsChanged) { + renderer = new DispatchingDiagnosticRenderer(maps); + } + + return renderer; + } + + private static boolean resetMapsIfNeeded() { + boolean needToResetMaps = maps == null; + Application newApp = ApplicationManager.getApplication(); + + if (application != newApp) { + assert newApp.isUnitTestMode(): "Expected application switch only in tests"; + application = newApp; + needToResetMaps = true; + } + + if (!needToResetMaps) return false; + + maps = ImmutableList.builder() + .addAll( + KotlinPackage.map( Extensions.getExtensions(Extension.EP_NAME), new Function1() { @Override @@ -64,15 +101,27 @@ public class DefaultErrorMessages { return extension.getMap(); } } - ) - ) - .add(MAP) - .build(); + ) + ) + .add(MAP) + .build(); - public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(MAPS); + return true; + } + + @TestOnly + @Nullable + public static DiagnosticRenderer getRendererForDiagnostic(@NotNull Diagnostic diagnostic) { + for (DiagnosticFactoryToRendererMap map : maps) { + DiagnosticRenderer renderer = map.get(diagnostic.getFactory()); + + if (renderer != null) return renderer; + } + + return null; + } static { - MAP.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", ELEMENT_TEXT); MAP.put(INVISIBLE_REFERENCE, "Cannot access ''{0}'': it is ''{1}'' in ''{2}''", NAME, TO_STRING, NAME); @@ -568,6 +617,8 @@ public class DefaultErrorMessages { } } } + + resetMapsIfNeeded(); } private DefaultErrorMessages() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java index 65da39fbe3c..b3118bc3e65 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DispatchingDiagnosticRenderer.java @@ -22,9 +22,10 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic; import java.util.List; public class DispatchingDiagnosticRenderer implements DiagnosticRenderer { + @NotNull private final List maps; - public DispatchingDiagnosticRenderer(List maps) { + public DispatchingDiagnosticRenderer(@NotNull List maps) { this.maps = maps; } diff --git a/compiler/tests/org/jetbrains/jet/JetTestUtils.java b/compiler/tests/org/jetbrains/jet/JetTestUtils.java index 7bfe442383b..548f85ea473 100644 --- a/compiler/tests/org/jetbrains/jet/JetTestUtils.java +++ b/compiler/tests/org/jetbrains/jet/JetTestUtils.java @@ -233,7 +233,7 @@ public class JetTestUtils { @Override public void report(@NotNull Diagnostic diagnostic) { if (diagnostic.getSeverity() == Severity.ERROR) { - throw new IllegalStateException(DefaultErrorMessages.RENDERER.render(diagnostic)); + throw new IllegalStateException(DefaultErrorMessages.render(diagnostic)); } } }; diff --git a/compiler/tests/org/jetbrains/jet/types/TypeSubstitutorTest.java b/compiler/tests/org/jetbrains/jet/types/TypeSubstitutorTest.java index b31b0cb497c..88fa41d3265 100644 --- a/compiler/tests/org/jetbrains/jet/types/TypeSubstitutorTest.java +++ b/compiler/tests/org/jetbrains/jet/types/TypeSubstitutorTest.java @@ -148,7 +148,7 @@ public class TypeSubstitutorTest extends KotlinTestWithEnvironment { new Function() { @Override public String fun(Diagnostic diagnostic) { - return DefaultErrorMessages.RENDERER.render(diagnostic); + return DefaultErrorMessages.render(diagnostic); } }, "\n")); diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java index fe00c04db9f..1710efd0514 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/IdeErrorMessages.java @@ -16,12 +16,12 @@ package org.jetbrains.jet.plugin.highlighter; -import com.intellij.util.containers.ContainerUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.jet.lang.diagnostics.Diagnostic; import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap; import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer; -import org.jetbrains.jet.lang.diagnostics.rendering.DispatchingDiagnosticRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer; import static org.jetbrains.jet.lang.diagnostics.Errors.*; @@ -38,8 +38,24 @@ import static org.jetbrains.jet.plugin.highlighter.IdeRenderers.*; * @see DefaultErrorMessages */ public class IdeErrorMessages { - public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); - public static final DiagnosticRenderer RENDERER = new DispatchingDiagnosticRenderer(ContainerUtil.concat(false, DefaultErrorMessages.MAPS, MAP)); + private static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap(); + + @NotNull + public static String render(@NotNull Diagnostic diagnostic) { + DiagnosticRenderer renderer = MAP.get(diagnostic.getFactory()); + + if (renderer != null) { + //noinspection unchecked + return renderer.render(diagnostic); + } + + return DefaultErrorMessages.render(diagnostic); + } + + @TestOnly + public static boolean hasIdeSpecificMessage(@NotNull Diagnostic diagnostic) { + return MAP.get(diagnostic.getFactory()) != null; + } static { MAP.put(TYPE_MISMATCH, "Type mismatch.
Required:{0}
Found:{1}
", diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.kt index c148f463390..de09a4b5009 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/highlighter/JetPsiChecker.kt @@ -183,7 +183,7 @@ public open class JetPsiChecker : Annotator, HighlightRangeExtension { } private fun getMessage(diagnostic: Diagnostic): String { - var message = IdeErrorMessages.RENDERER.render(diagnostic) + var message = IdeErrorMessages.render(diagnostic) if (KotlinInternalMode.enabled || ApplicationManager.getApplication().isUnitTestMode()) { val factoryName = diagnostic.getFactory().getName() if (message.startsWith("")) { @@ -200,7 +200,7 @@ public open class JetPsiChecker : Annotator, HighlightRangeExtension { } private fun getDefaultMessage(diagnostic: Diagnostic): String { - val message = DefaultErrorMessages.RENDERER.render(diagnostic) + val message = DefaultErrorMessages.render(diagnostic) if (KotlinInternalMode.enabled || ApplicationManager.getApplication().isUnitTestMode()) { return "[${diagnostic.getFactory().getName()}] $message" } diff --git a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt index f0953d771fd..7b551149ebe 100644 --- a/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt +++ b/idea/src/org/jetbrains/jet/plugin/debugger/evaluate/KotlinEvaluationBuilder.kt @@ -288,7 +288,7 @@ class KotlinEvaluator(val codeFragment: JetCodeFragment, val bindingContext = analysisResult.bindingContext bindingContext.getDiagnostics().firstOrNull { it.getSeverity() == Severity.ERROR }?.let { - throw EvaluateExceptionUtil.createEvaluateException(DefaultErrorMessages.RENDERER.render(it)) + throw EvaluateExceptionUtil.createEvaluateException(DefaultErrorMessages.render(it)) } analysisResult diff --git a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixFactoryForTypeMismatchError.java b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixFactoryForTypeMismatchError.java index 27d47e66f66..db228ccf6e7 100644 --- a/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixFactoryForTypeMismatchError.java +++ b/idea/src/org/jetbrains/jet/plugin/quickfix/QuickFixFactoryForTypeMismatchError.java @@ -83,7 +83,7 @@ public class QuickFixFactoryForTypeMismatchError extends JetIntentionActionsFact } } else { - LOG.error("Unexpected diagnostic: " + DefaultErrorMessages.RENDERER.render(diagnostic)); + LOG.error("Unexpected diagnostic: " + DefaultErrorMessages.render(diagnostic)); return Collections.emptyList(); } diff --git a/idea/tests/org/jetbrains/jet/plugin/DirectiveBasedActionUtils.java b/idea/tests/org/jetbrains/jet/plugin/DirectiveBasedActionUtils.java index 33c5aa41c6e..61100a44d7c 100644 --- a/idea/tests/org/jetbrains/jet/plugin/DirectiveBasedActionUtils.java +++ b/idea/tests/org/jetbrains/jet/plugin/DirectiveBasedActionUtils.java @@ -58,7 +58,7 @@ public class DirectiveBasedActionUtils { @Override public String apply(@Nullable Diagnostic diagnostic) { assert (diagnostic != null); - return IdeErrorMessages.RENDERER.render(diagnostic); + return IdeErrorMessages.render(diagnostic); } }); diff --git a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java index a628da812eb..60ce9c1e48e 100644 --- a/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/codeInsight/AbstractInsertImportOnPasteTest.java @@ -101,7 +101,7 @@ public abstract class AbstractInsertImportOnPasteTest extends JetLightCodeInsigh for (Diagnostic diagnostic : bindingContext.getDiagnostics()) { if (Errors.UNRESOLVED_REFERENCE_DIAGNOSTICS.contains(diagnostic.getFactory())) { List textRanges = diagnostic.getTextRanges(); - String diagnosticText = DefaultErrorMessages.RENDERER.render(diagnostic); + String diagnosticText = DefaultErrorMessages.render(diagnostic); if (diagnostic.getPsiFile() == file) { fail(diagnostic.getFactory().getName() + ": " + diagnosticText + " " + DiagnosticUtils.atLocation(file, textRanges.get(0))); diff --git a/idea/tests/org/jetbrains/jet/plugin/highlighter/AbstractDiagnosticMessageTest.java b/idea/tests/org/jetbrains/jet/plugin/highlighter/AbstractDiagnosticMessageTest.java index 7bace05ce14..7d3ccc5bc79 100644 --- a/idea/tests/org/jetbrains/jet/plugin/highlighter/AbstractDiagnosticMessageTest.java +++ b/idea/tests/org/jetbrains/jet/plugin/highlighter/AbstractDiagnosticMessageTest.java @@ -99,12 +99,12 @@ public abstract class AbstractDiagnosticMessageTest extends JetLiteFixture { for (Diagnostic diagnostic : diagnostics) { String readableDiagnosticText; String extension; - if (messageType != MessageType.TEXT && IdeErrorMessages.MAP.get(diagnostic.getFactory()) != null) { - readableDiagnosticText = formatHtml(IdeErrorMessages.RENDERER.render(diagnostic)); + if (messageType != MessageType.TEXT && IdeErrorMessages.hasIdeSpecificMessage(diagnostic)) { + readableDiagnosticText = formatHtml(IdeErrorMessages.render(diagnostic)); extension = MessageType.HTML.extension; } else { - readableDiagnosticText = DefaultErrorMessages.RENDERER.render(diagnostic); + readableDiagnosticText = DefaultErrorMessages.render(diagnostic); extension = MessageType.TEXT.extension; } String errorMessageFileName = name + index; diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt index 7081b7e0578..a08ef5c38bd 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/AbstractJavaToKotlinConverterTest.kt @@ -77,7 +77,7 @@ public abstract class AbstractJavaToKotlinConverterTest : LightCodeInsightFixtur val diagnostics = jetFile.analyzeFullyAndGetResult().bindingContext.getDiagnostics() val errors = diagnostics.filter { it.getSeverity() == Severity.ERROR } if (errors.isEmpty()) return jetFile.getText() - val header = errors.map { "// ERROR: " + DefaultErrorMessages.RENDERER.render(it).replace('\n', ' ') }.joinToString("\n", postfix = "\n") + val header = errors.map { "// ERROR: " + DefaultErrorMessages.render(it).replace('\n', ' ') }.joinToString("\n", postfix = "\n") return header + jetFile.getText() } }