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() {