diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java index 9caea65a48b2..555cf2d628f4 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java @@ -7,6 +7,7 @@ import com.intellij.compiler.impl.javaCompiler.eclipse.EclipseCompiler; import com.intellij.compiler.impl.javaCompiler.javac.JavacCompiler; import com.intellij.compiler.server.BuildManager; import com.intellij.compiler.server.CompilerConfigurationUtils; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.compiler.JavaCompilerBundle; @@ -135,12 +136,12 @@ public final class CompilerConfigurationImpl extends CompilerConfiguration imple } BackendCompiler.EP_NAME.getPoint(project).addChangeListener(() -> { myRegisteredCompilers = collectCompilers(); - }, project); + }, JavaPluginDisposable.getInstance(project)); } private static @NotNull ExcludedEntriesConfiguration createExcludedEntriesConfiguration(@NotNull Project project) { final ExcludedEntriesConfiguration cfg = new ExcludedEntriesConfiguration(project.getMessageBus().syncPublisher(ExcludedEntriesListener.TOPIC)); - Disposer.register(project, cfg); + Disposer.register(JavaPluginDisposable.getInstance(project), cfg); project.getMessageBus().connect().subscribe(ExcludedEntriesListener.TOPIC, new ExcludedEntriesListener() { @Override public void onEntryAdded(@NotNull ExcludeEntryDescription description) { diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java index 5b1fc25b23a2..1680f3579b27 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerManagerImpl.java @@ -7,6 +7,7 @@ import com.intellij.compiler.server.BuildManager; import com.intellij.execution.process.ProcessIOExecutorService; import com.intellij.execution.wsl.WSLDistribution; import com.intellij.ide.IdleTracker; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.*; @@ -85,7 +86,7 @@ public class CompilerManagerImpl extends CompilerManager { myEventPublisher = project.getMessageBus().syncPublisher(CompilerTopics.COMPILATION_STATUS); // predefined compilers for (ProjectExtensionPointName ep : Arrays.asList(COMPILABLE_TYPE_EP, BackendCompiler.EP_NAME)) { - ep.addChangeListener(project, () -> {myCachedCompilableTypes = null;}, project); + ep.addChangeListener(project, () -> {myCachedCompilableTypes = null;}, JavaPluginDisposable.getInstance(project)); } COMPILER_FACTORY_EP.getPoint(project).addExtensionPointListener(new ExtensionPointListener<>() { @Override @@ -118,7 +119,7 @@ public class CompilerManagerImpl extends CompilerManager { projectGeneratedSrcRoot.mkdirs(); final LocalFileSystem lfs = LocalFileSystem.getInstance(); myWatchRoots = lfs.addRootsToWatch(Collections.singletonList(FileUtil.toCanonicalPath(projectGeneratedSrcRoot.getPath())), true); - Disposer.register(project, () -> { + Disposer.register(JavaPluginDisposable.getInstance(project), () -> { final ExternalJavacManager manager = myExternalJavacManager; myExternalJavacManager = null; if (manager != null) { diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java b/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java index bc66a3829e2d..adca089ef4ac 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java @@ -2,6 +2,7 @@ package com.intellij.compiler.impl; import com.intellij.compiler.CompilerConfiguration; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -28,7 +29,7 @@ public abstract class ExcludeFromCompileAction extends AnAction { public void actionPerformed(@NotNull AnActionEvent e) { VirtualFile file = getFile(); if (file != null && file.isValid()) { - ExcludeEntryDescription description = new ExcludeEntryDescription(file, false, true, myProject); + ExcludeEntryDescription description = new ExcludeEntryDescription(file, false, true, JavaPluginDisposable.getInstance(myProject)); CompilerConfiguration.getInstance(myProject).getExcludedEntriesConfiguration().addExcludeEntryDescription(description); } } diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java b/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java index 98bc7dd8884f..8aa2d1d2a1c2 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/ExcludeFromValidationAction.java @@ -3,6 +3,7 @@ package com.intellij.compiler.options; import com.intellij.build.FileNavigatable; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -27,9 +28,11 @@ public class ExcludeFromValidationAction extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent e) { Project project = e.getData(CommonDataKeys.PROJECT); + if (project == null) return; final Pair pair = getExcludedConfigurationAndFile(e, project); if (pair == null) return; - final ExcludeEntryDescription description = new ExcludeEntryDescription(pair.getSecond(), false, true, project); + final ExcludeEntryDescription description = + new ExcludeEntryDescription(pair.getSecond(), false, true, JavaPluginDisposable.getInstance(project)); pair.getFirst().addExcludeEntryDescription(description); } diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java index 28a44d9a92a9..5ed3ea370e5c 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java @@ -4,6 +4,7 @@ package com.intellij.openapi.compiler.options; import com.intellij.compiler.CompilerConfiguration; import com.intellij.ide.IdeBundle; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.compiler.JavaCompilerBundle; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; @@ -56,7 +57,7 @@ public final class ExcludedEntriesConfigurable implements UnnamedConfigurable, N ExcludeEntryDescription[] descriptions = myConfiguration.getExcludeEntryDescriptions(); disposeMyDescriptions(); for (ExcludeEntryDescription description : descriptions) { - myExcludeEntryDescriptions.add(description.copy(myProject)); + myExcludeEntryDescriptions.add(description.copy(JavaPluginDisposable.getInstance(myProject))); } ((AbstractTableModel)myExcludedEntriesPanel.myExcludedTable.getModel()).fireTableDataChanged(); } @@ -77,7 +78,7 @@ public final class ExcludedEntriesConfigurable implements UnnamedConfigurable, N public void apply() { myConfiguration.removeAllExcludeEntryDescriptions(); for (ExcludeEntryDescription description : myExcludeEntryDescriptions) { - myConfiguration.addExcludeEntryDescription(description.copy(myProject)); + myConfiguration.addExcludeEntryDescription(description.copy(JavaPluginDisposable.getInstance(myProject))); } } @@ -167,10 +168,10 @@ public final class ExcludedEntriesConfigurable implements UnnamedConfigurable, N } ExcludeEntryDescription description; if (chosenFile.isDirectory()) { - description = new ExcludeEntryDescription(chosenFile, true, false, myProject); + description = new ExcludeEntryDescription(chosenFile, true, false, JavaPluginDisposable.getInstance(myProject)); } else { - description = new ExcludeEntryDescription(chosenFile, false, true, myProject); + description = new ExcludeEntryDescription(chosenFile, false, true, JavaPluginDisposable.getInstance(myProject)); } myExcludeEntryDescriptions.add(selected, description); selected++; diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java index 6daae31487c5..2bf09f95557f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -11,6 +11,7 @@ import com.intellij.debugger.impl.DebuggerUtilsEx; import com.intellij.debugger.impl.DebuggerUtilsImpl; import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.*; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; @@ -128,7 +129,7 @@ class CompoundRendererConfigurable extends JPanel { updateContext(myClassNameField.getText()); } }); - ComponentValidator validator = new ComponentValidator(myProject).withValidator(() -> { + ComponentValidator validator = new ComponentValidator(JavaPluginDisposable.getInstance(myProject)).withValidator(() -> { String text = myClassNameField.getText(); if (StringUtil.containsAnyChar(text, "<>")) { return new ValidationInfo(JavaDebuggerBundle.message("error.compound.renderer.configurable.fqn.generic"), editorTextField); diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java index 2a604fbf6c6c..7bb98d77793a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/breakpoints/Breakpoint.java @@ -27,6 +27,7 @@ import com.intellij.debugger.statistics.DebuggerStatistics; import com.intellij.debugger.ui.impl.watch.CompilingEvaluatorImpl; import com.intellij.debugger.ui.overhead.OverheadProducer; import com.intellij.icons.AllIcons; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; @@ -228,7 +229,7 @@ public abstract class Breakpoint

implements breakpoint.emitBreakpointChanged(); }) .coalesceBy(myProject, this) - .expireWith(myProject) + .expireWith(JavaPluginDisposable.getInstance(myProject)) .submit(RELOAD_EXECUTOR); } diff --git a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java index 8ab57b9eef23..4ca4d304bc10 100644 --- a/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java +++ b/java/execution/impl/src/com/intellij/compiler/options/CompileStepBeforeRun.java @@ -8,6 +8,7 @@ import com.intellij.execution.remote.RemoteConfiguration; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.icons.AllIcons; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; @@ -188,7 +189,7 @@ public final class CompileStepBeforeRun extends BeforeRunTaskProvider(context, projectTask); - }).expireWith(myProject).executeSynchronously(); + }).expireWith(JavaPluginDisposable.getInstance(myProject)).executeSynchronously(); ProjectTaskManagerImpl.putBuildOriginator(myProject, CompileStepBeforeRun.class); diff --git a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java index 48fa47c0801e..dee38d837bb3 100644 --- a/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java +++ b/java/execution/impl/src/com/intellij/execution/JavaTestFrameworkRunnableState.java @@ -27,6 +27,7 @@ import com.intellij.execution.ui.ConsoleView; import com.intellij.execution.util.JavaParametersUtil; import com.intellij.execution.util.ProgramParametersConfigurator; import com.intellij.execution.util.ProgramParametersUtil; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.compiler.JavaCompilerBundle; import com.intellij.openapi.diagnostic.Logger; @@ -281,7 +282,7 @@ public abstract class JavaTestFrameworkRunnableState { myTransportCombo.setSelectedItem(Transport.SOCKET); myPort.setMinimumSize(myPort.getPreferredSize()); - new ComponentValidator(project).withValidator(() -> { + new ComponentValidator(JavaPluginDisposable.getInstance(project)).withValidator(() -> { String pt = myPort.getText(); if (StringUtil.isNotEmpty(pt)) { try { diff --git a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java index dbaf5ad20c88..59068d38eced 100644 --- a/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java +++ b/java/idea-ui/src/com/intellij/codeInsight/daemon/impl/AttachSourcesNotificationProvider.java @@ -8,6 +8,7 @@ import com.intellij.codeInsight.AttachSourcesProviderFilter; import com.intellij.ide.JavaUiBundle; import com.intellij.ide.highlighter.JavaClassFileType; import com.intellij.ide.highlighter.JavaFileType; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; @@ -170,7 +171,7 @@ public final class AttachSourcesNotificationProvider implements EditorNotificati throw new RuntimeException(JavaUiBundle.message("can.t.find.library.for.0", file.getName())); }) - .expireWith(project) + .expireWith(JavaPluginDisposable.getInstance(project)) .expireWhen(() -> !file.isValid()) .coalesceBy(file, project) .finishOnUiThread(ModalityState.current(), uiThreadAction) diff --git a/java/idea-ui/src/com/intellij/ide/SetupJavaProjectFromSourcesActivity.kt b/java/idea-ui/src/com/intellij/ide/SetupJavaProjectFromSourcesActivity.kt index 98c55ef13d5a..835a72e9b0ad 100644 --- a/java/idea-ui/src/com/intellij/ide/SetupJavaProjectFromSourcesActivity.kt +++ b/java/idea-ui/src/com/intellij/ide/SetupJavaProjectFromSourcesActivity.kt @@ -12,6 +12,7 @@ import com.intellij.ide.util.importProject.LibrariesDetectionStep import com.intellij.ide.util.importProject.RootDetectionProcessor import com.intellij.ide.util.projectWizard.WizardContext import com.intellij.ide.util.projectWizard.importSources.impl.ProjectFromSourcesBuilderImpl +import com.intellij.java.JavaPluginDisposable import com.intellij.notification.* import com.intellij.notification.impl.NotificationIdsHolder import com.intellij.openapi.application.ApplicationManager @@ -188,7 +189,7 @@ private fun filesToLinks(files: MutableCollection, projectDirectory } private suspend fun setupFromSources(project: Project, projectDir: VirtualFile) { - val builder = ProjectFromSourcesBuilderImpl(WizardContext(project, project), ModulesProvider.EMPTY_MODULES_PROVIDER) + val builder = ProjectFromSourcesBuilderImpl(WizardContext(project, JavaPluginDisposable.getInstance(project)), ModulesProvider.EMPTY_MODULES_PROVIDER) val projectPath = projectDir.path builder.baseProjectPath = projectPath val roots = RootDetectionProcessor.detectRoots(File(projectPath)) diff --git a/java/idea-ui/src/com/intellij/ide/projectWizard/GeneralModuleTypeForIdea.java b/java/idea-ui/src/com/intellij/ide/projectWizard/GeneralModuleTypeForIdea.java index 3453bc83aafd..5c4efd2e3718 100644 --- a/java/idea-ui/src/com/intellij/ide/projectWizard/GeneralModuleTypeForIdea.java +++ b/java/idea-ui/src/com/intellij/ide/projectWizard/GeneralModuleTypeForIdea.java @@ -6,6 +6,7 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.ide.util.projectWizard.ModuleWizardStep; import com.intellij.ide.util.projectWizard.WizardContext; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -99,7 +100,8 @@ public final class GeneralModuleTypeForIdea extends GeneralModuleType { String shortcutText = KeymapUtil.getShortcutText(IdeActions.ACTION_NEW_ELEMENT); GotItTooltip tooltip = - new GotItTooltip("empty.project.create.file", IdeBundle.message("to.create.new.file.tooltip", shortcutText), project) + new GotItTooltip("empty.project.create.file", IdeBundle.message("to.create.new.file.tooltip", shortcutText), + JavaPluginDisposable.getInstance(project)) .withPosition(Balloon.Position.atRight); ApplicationManager.getApplication().getMessageBus().connect(tooltip).subscribe(AnActionListener.TOPIC, new AnActionListener() { @Override diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/StructureConfigurableContext.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/StructureConfigurableContext.java index 29e631270cd4..ee65cf18fe37 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/StructureConfigurableContext.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/StructureConfigurableContext.java @@ -1,6 +1,7 @@ // Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.roots.ui.configuration.projectRoot; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.Disposable; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -32,7 +33,7 @@ public final class StructureConfigurableContext implements Disposable, LibraryEd public StructureConfigurableContext(Project project, final ModulesConfigurator modulesConfigurator) { myProject = project; myModulesConfigurator = modulesConfigurator; - Disposer.register(project, this); + Disposer.register(JavaPluginDisposable.getInstance(project), this); myDaemonAnalyzer = new ProjectStructureDaemonAnalyzer(this); } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java index 52dde4673094..6b8286825091 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/reference/RefJavaManagerImpl.java @@ -7,6 +7,7 @@ import com.intellij.codeInspection.InspectionProfileEntry; import com.intellij.codeInspection.SuppressionUtilCore; import com.intellij.codeInspection.deadCode.UnusedDeclarationInspectionBase; import com.intellij.codeInspection.ex.*; +import com.intellij.java.JavaPluginDisposable; import com.intellij.java.analysis.JavaAnalysisBundle; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -420,7 +421,7 @@ public final class RefJavaManagerImpl extends RefJavaManager { public void configureAnnotations() { } }; - Disposer.register(project, entryPointsManager); + Disposer.register(JavaPluginDisposable.getInstance(project), entryPointsManager); ((EntryPointsManagerBase)entryPointsManager).addAllPersistentEntries(EntryPointsManagerBase.getInstance(project)); } diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/ExtractMethodPreviewManager.java b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/ExtractMethodPreviewManager.java index fedbf7533a27..50dd90f2a38e 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/ExtractMethodPreviewManager.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/ExtractMethodPreviewManager.java @@ -2,6 +2,7 @@ package com.intellij.refactoring.extractMethod.preview; import com.intellij.ide.impl.ContentManagerWatcher; +import com.intellij.java.JavaPluginDisposable; import com.intellij.openapi.components.Service; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; @@ -24,8 +25,12 @@ public final class ExtractMethodPreviewManager { StartupManager.getInstance(myProject).runWhenProjectIsInitialized(() -> { ToolWindowManager toolWindowManager = ToolWindowManager.getInstance(myProject); - ToolWindow toolWindow = toolWindowManager.registerToolWindow(ToolWindowId.EXTRACT_METHOD, - true, ToolWindowAnchor.BOTTOM, myProject); + ToolWindow toolWindow = toolWindowManager.registerToolWindow( + ToolWindowId.EXTRACT_METHOD, + true, + ToolWindowAnchor.BOTTOM, + JavaPluginDisposable.getInstance(myProject) + ); myContentManager = toolWindow.getContentManager(); ContentManagerWatcher.watchContentManager(toolWindow, myContentManager); }); diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/PreviewPanel.java b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/PreviewPanel.java index 358cab67f73e..c96217695e0f 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/PreviewPanel.java +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/preview/PreviewPanel.java @@ -3,6 +3,7 @@ package com.intellij.refactoring.extractMethod.preview; import com.intellij.ide.IdeBundle; import com.intellij.ide.actions.exclusion.ExclusionHandler; +import com.intellij.java.JavaPluginDisposable; import com.intellij.java.refactoring.JavaRefactoringBundle; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.CommonDataKeys; @@ -70,7 +71,7 @@ class PreviewPanel extends BorderLayoutPanel implements Disposable, UiDataProvid Disposer.register(this, usageModelTracker); usageModelTracker.addListener(isPropertyChange -> updateLater(), this); - Disposer.register(processor.getProject(), this); + Disposer.register(JavaPluginDisposable.getInstance(processor.getProject()), this); Disposer.register(this, myTree); Disposer.register(this, myDiffPanel); } diff --git a/java/openapi/src/com/intellij/java/JavaPluginDisposable.kt b/java/openapi/src/com/intellij/java/JavaPluginDisposable.kt new file mode 100644 index 000000000000..9f50324ba850 --- /dev/null +++ b/java/openapi/src/com/intellij/java/JavaPluginDisposable.kt @@ -0,0 +1,24 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.intellij.java + +import com.intellij.openapi.Disposable +import com.intellij.openapi.components.Service +import com.intellij.openapi.components.service +import com.intellij.openapi.project.Project +import kotlinx.coroutines.CoroutineScope +import org.jetbrains.annotations.ApiStatus + +/** + * A project level disposable for the Java plugin. + * Use this class instead of passing [Project] as a disposable to make sure your resource gets disposed when the Java plugin is unloaded. + */ +@ApiStatus.Internal +@Service(Service.Level.PROJECT) +class JavaPluginDisposable(val coroutineScope: CoroutineScope) : Disposable { + override fun dispose() { } + + companion object { + @JvmStatic + fun getInstance(project: Project): JavaPluginDisposable = project.service() + } +} \ No newline at end of file diff --git a/java/testFramework/src/com/intellij/mock/MockPsiDirectory.java b/java/testFramework/src/com/intellij/mock/MockPsiDirectory.java index 9b37fa27c52c..1f63ebf4dba0 100644 --- a/java/testFramework/src/com/intellij/mock/MockPsiDirectory.java +++ b/java/testFramework/src/com/intellij/mock/MockPsiDirectory.java @@ -105,6 +105,7 @@ public class MockPsiDirectory extends MockPsiElement implements PsiDirectory { @Override public @Nullable PsiDirectory getParentDirectory() { final PsiPackage psiPackage = myPackage.getParentPackage(); + //noinspection IncorrectParentDisposable return psiPackage == null ? null : new MockPsiDirectory(psiPackage, getProject()); } diff --git a/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java b/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java index 85d955f6a6fd..c1166acb3456 100644 --- a/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java +++ b/java/testFramework/src/com/intellij/testFramework/fixtures/LightJavaCodeInsightFixtureTestCase.java @@ -1,4 +1,4 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2026 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.testFramework.fixtures; import com.intellij.lang.Language; diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java index 5621ab47e32c..d50bbc01d4bc 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/LightIdeaTestFixtureImpl.java @@ -6,6 +6,7 @@ import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.impl.NonBlockingReadActionImpl; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; @@ -60,6 +61,9 @@ public final class LightIdeaTestFixtureImpl extends BaseFixture implements Light // don't use method references here to make stack trace reading easier //noinspection Convert2MethodRef new RunAll( + // wait for NBRAs to complete because they might access a temporarily disposed project + () -> NonBlockingReadActionImpl.waitForAsyncTaskCompletion(), + () -> PlatformTestUtil.dispatchAllInvocationEventsInIdeEventQueue(), // dispatch events that NBRAs potentially schedule () -> { if (project != null) { CodeStyle.dropTemporarySettings(project);