diff --git a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java index 144d4b6c0b0f..40fcbed941e6 100644 --- a/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java +++ b/platform/core-api/src/com/intellij/openapi/progress/ProgressManager.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,11 +19,13 @@ import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.ThrowableComputable; +import gnu.trove.THashSet; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.Set; public abstract class ProgressManager extends ProgressIndicatorProvider { private static class ProgressManagerHolder { @@ -191,4 +193,14 @@ public abstract class ProgressManager extends ProgressIndicatorProvider { public abstract void executeProcessUnderProgress(@NotNull Runnable process, @Nullable("null means reuse current progress") ProgressIndicator progress) throws ProcessCanceledException; + + public static void assertNotCircular(@NotNull ProgressIndicator original) { + Set wrappedParents = null; + for (ProgressIndicator parent = original; parent instanceof WrappedProgressIndicator; parent = ((WrappedProgressIndicator)parent).getOriginalProgressIndicator()) { + if (wrappedParents == null) wrappedParents = new THashSet(); + if (!wrappedParents.add(parent)) { + throw new IllegalArgumentException(parent + " wraps itself"); + } + } + } } \ No newline at end of file diff --git a/platform/core-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java b/platform/core-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java index 36f1c760fea7..438e936005de 100644 --- a/platform/core-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java +++ b/platform/core-impl/src/com/intellij/openapi/progress/util/ProgressWrapper.java @@ -24,6 +24,7 @@ package com.intellij.openapi.progress.util; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.StandardProgressIndicator; import com.intellij.openapi.progress.WrappedProgressIndicator; import org.jetbrains.annotations.Contract; @@ -48,6 +49,7 @@ public class ProgressWrapper extends AbstractProgressIndicatorBase implements Wr if (nested > 50) { LOG.error("Too many wrapped indicators"); } + ProgressManager.assertNotCircular(original); } @Override diff --git a/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java b/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java index 0783c2ccfb51..ad5b4599c5bb 100644 --- a/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java +++ b/platform/platform-api/src/com/intellij/ide/util/DelegatingProgressIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ public class DelegatingProgressIndicator implements WrappedProgressIndicator, St public DelegatingProgressIndicator(@NotNull ProgressIndicator indicator) { myIndicator = indicator; + ProgressManager.assertNotCircular(indicator); } public DelegatingProgressIndicator() { diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/SmoothProgressAdapter.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/SmoothProgressAdapter.java index db710edcb550..2a27cd681a71 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/SmoothProgressAdapter.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/SmoothProgressAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2014 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,6 +18,7 @@ package com.intellij.openapi.progress.util; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.StandardProgressIndicator; import com.intellij.openapi.progress.WrappedProgressIndicator; import com.intellij.openapi.project.Project; @@ -67,6 +68,7 @@ public class SmoothProgressAdapter extends AbstractProgressIndicatorExBase imple myOriginal.setModalityProgress(this); setModalityProgress(this); } + ProgressManager.assertNotCircular(original); } @NotNull