diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java index 02f91cbd8d2..19e592c1682 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DiagnosticsWithSuppression.java @@ -17,6 +17,8 @@ package org.jetbrains.jet.lang.resolve; import com.google.common.collect.ImmutableSet; +import com.intellij.openapi.application.Application; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; @@ -58,8 +60,36 @@ public class DiagnosticsWithSuppression implements Diagnostics { private static final Logger LOG = Logger.getInstance(DiagnosticsWithSuppression.class); - private static final SuppressStringProvider[] ADDITIONAL_SUPPRESS_STRING_PROVIDERS = Extensions.getExtensions(SuppressStringProvider.EP_NAME); - private static final DiagnosticSuppressor[] DIAGNOSTIC_SUPPRESSORS = Extensions.getExtensions(DiagnosticSuppressor.EP_NAME); + private static Application app = null; + private static SuppressStringProvider[] ADDITIONAL_SUPPRESS_STRING_PROVIDERS = null; + private static DiagnosticSuppressor[] DIAGNOSTIC_SUPPRESSORS = null; + + static { + resetExtensionsIfNeed(); + } + + private static SuppressStringProvider[] getAdditionalSuppressStringProviders() { + resetExtensionsIfNeed(); + return ADDITIONAL_SUPPRESS_STRING_PROVIDERS; + } + + private static DiagnosticSuppressor[] getDiagnosticSuppressors() { + resetExtensionsIfNeed(); + return DIAGNOSTIC_SUPPRESSORS; + } + + // We need to update extensions in tests because they may be different for different tests. + private static void resetExtensionsIfNeed() { + if (app != null && !app.isUnitTestMode()) return; + + Application newApp = ApplicationManager.getApplication(); + if (app == newApp) return; + + app = newApp; + + ADDITIONAL_SUPPRESS_STRING_PROVIDERS = Extensions.getExtensions(SuppressStringProvider.EP_NAME); + DIAGNOSTIC_SUPPRESSORS = Extensions.getExtensions(DiagnosticSuppressor.EP_NAME); + } private final BindingContext context; private final Collection diagnostics; @@ -112,7 +142,7 @@ public class DiagnosticsWithSuppression implements Diagnostics { private boolean isSuppressed(@NotNull Diagnostic diagnostic) { PsiElement element = diagnostic.getPsiElement(); - for (DiagnosticSuppressor suppressor : DIAGNOSTIC_SUPPRESSORS) { + for (DiagnosticSuppressor suppressor : getDiagnosticSuppressors()) { if (suppressor.isSuppressed(diagnostic)) return true; } @@ -198,7 +228,7 @@ public class DiagnosticsWithSuppression implements Diagnostics { AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry); if (annotationDescriptor == null) continue; - for (SuppressStringProvider suppressStringProvider : ADDITIONAL_SUPPRESS_STRING_PROVIDERS) { + for (SuppressStringProvider suppressStringProvider : getAdditionalSuppressStringProviders()) { builder.addAll(suppressStringProvider.get(annotationDescriptor)); }