From 714773fdf8a7f5e620beea789f21cfe511adb5f5 Mon Sep 17 00:00:00 2001 From: Vladimir Dolzhenko Date: Fri, 15 Oct 2021 12:33:15 +0200 Subject: [PATCH] Add DiagnosticSink.setCallbackIfNotSet and deprecate DiagnosticSink.setCallback #EA-258953 Fixed --- .../kotlin/diagnostics/DiagnosticSink.java | 13 ++++++++++++- .../kotlin/resolve/DelegatingBindingTrace.kt | 10 +++++++--- .../kotlin/resolve/diagnostics/Diagnostics.kt | 7 ++++++- .../diagnostics/DiagnosticsWithSuppression.java | 5 +++++ .../MutableDiagnosticsWithSuppression.kt | 14 +++++++------- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java index 30043b68da1..30c5edf837a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/DiagnosticSink.java @@ -59,7 +59,18 @@ public interface DiagnosticSink { void report(@NotNull Diagnostic diagnostic); - default void setCallback(@NotNull DiagnosticsCallback callback) { } + /** + * use {@link #setCallbackIfNotSet(DiagnosticsCallback)} instead + * @param callback + */ + @Deprecated + default void setCallback(@NotNull DiagnosticsCallback callback) { + setCallbackIfNotSet(callback); + } + + default boolean setCallbackIfNotSet(@NotNull DiagnosticsCallback callback) { + return false; + } default void resetCallback() { } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt index b54b1cba8e3..3041434db34 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DelegatingBindingTrace.kt @@ -157,11 +157,15 @@ open class DelegatingBindingTrace( mutableDiagnostics.report(diagnostic) } + @Volatile protected var diagnosticsCallback: DiagnosticSink.DiagnosticsCallback? = null - override fun setCallback(callback: DiagnosticSink.DiagnosticsCallback) { - diagnosticsCallback = callback - mutableDiagnostics?.setCallback(callback) + override fun setCallbackIfNotSet(callback: DiagnosticSink.DiagnosticsCallback): Boolean { + val callbackIfNotSet = mutableDiagnostics?.setCallbackIfNotSet(callback) ?: false + if (callbackIfNotSet) { + diagnosticsCallback = callback + } + return callbackIfNotSet } override fun resetCallback() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt index 04231909f5a..1668758f60d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt @@ -38,7 +38,12 @@ interface Diagnostics : GenericDiagnostics { fun noSuppression(): Diagnostics - fun setCallback(callback: DiagnosticsCallback) {} + fun setCallback(callback: DiagnosticsCallback) { + setCallbackIfNotSet(callback) + } + + fun setCallbackIfNotSet(callback: DiagnosticsCallback): Boolean = false + fun resetCallback() {} companion object { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/DiagnosticsWithSuppression.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/DiagnosticsWithSuppression.java index f759209c551..ff2d38f5ce3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/DiagnosticsWithSuppression.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/DiagnosticsWithSuppression.java @@ -79,6 +79,11 @@ public class DiagnosticsWithSuppression implements Diagnostics { } + @Override + public boolean setCallbackIfNotSet(@NotNull DiagnosticSink.DiagnosticsCallback callback) { + return false; + } + @Override public void resetCallback() { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt index 91b96df2a0f..c62aca7dfaf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt @@ -32,6 +32,7 @@ class MutableDiagnosticsWithSuppression( private val delegateDiagnostics: Diagnostics, ) : Diagnostics { private val diagnosticList = ArrayList() + @Volatile private var diagnosticsCallback: DiagnosticSink.DiagnosticsCallback? = null //NOTE: CachedValuesManager is not used because it requires Project passed to this object @@ -48,13 +49,12 @@ class MutableDiagnosticsWithSuppression( override fun forElement(psiElement: PsiElement) = readonlyView().forElement(psiElement) override fun noSuppression() = readonlyView().noSuppression() - override fun setCallback(callback: DiagnosticSink.DiagnosticsCallback) { - diagnosticsCallback?.let { - Logger.getInstance(MutableDiagnosticsWithSuppression::class.java).error("diagnostic callback has been already registered") - return - } - diagnosticsCallback = callback - delegateDiagnostics.setCallback(callback) + override fun setCallbackIfNotSet(callback: DiagnosticSink.DiagnosticsCallback): Boolean { + return if (diagnosticsCallback == null) { + diagnosticsCallback = callback + delegateDiagnostics.setCallbackIfNotSet(callback) + true + } else false } override fun resetCallback() {