do not return already disposed vfp
authorAlexey Kudravtsev <cdr@intellij.com>
Tue, 11 Aug 2020 14:47:04 +0000 (17:47 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Wed, 12 Aug 2020 15:27:14 +0000 (15:27 +0000)
(when during project close the VFPMI is disposed first, then all SDKs, which fired rootsChanged which caused root manager to try to re-collect all roots)

GitOrigin-RevId: 68894c3adec2e3057aaace177cbea9a97605724a

java/java-impl/src/com/intellij/openapi/roots/impl/CompilerProjectExtensionImpl.java

index 5a7bbeb82a534952ee2efc061a2d2bccf7103bc5..d35bf4303c1f32d92aef718d46867962c1d21d27 100644 (file)
@@ -1,6 +1,7 @@
 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
 package com.intellij.openapi.roots.impl;
 
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.project.Project;
@@ -20,23 +21,18 @@ import org.jetbrains.annotations.NotNull;
 import java.util.HashSet;
 import java.util.Set;
 
-final class CompilerProjectExtensionImpl extends CompilerProjectExtension {
+final class CompilerProjectExtensionImpl extends CompilerProjectExtension implements Disposable {
   private static final String OUTPUT_TAG = "output";
   private static final String URL = "url";
 
   private VirtualFilePointer myCompilerOutput;
   private LocalFileSystem.WatchRequest myCompilerOutputWatchRequest;
-  private final Project myProject;
 
-  CompilerProjectExtensionImpl(@NotNull Project project) {
-    myProject = project;
-  }
-
-  private void readExternal(@NotNull Project project, @NotNull Element element) {
+  private void readExternal(@NotNull Element element) {
     Element pathElement = element.getChild(OUTPUT_TAG);
     if (pathElement != null) {
       String outputPath = pathElement.getAttributeValue(URL);
-      myCompilerOutput = outputPath != null ? VirtualFilePointerManager.getInstance().create(outputPath, project, null) : null;
+      myCompilerOutput = outputPath != null ? VirtualFilePointerManager.getInstance().create(outputPath, this, null) : null;
     }
   }
 
@@ -48,6 +44,11 @@ final class CompilerProjectExtensionImpl extends CompilerProjectExtension {
     }
   }
 
+  @Override
+  public void dispose() {
+    myCompilerOutput = null;
+  }
+
   @Override
   public VirtualFile getCompilerOutput() {
     return myCompilerOutput != null ? myCompilerOutput.getFile() : null;
@@ -70,7 +71,7 @@ final class CompilerProjectExtensionImpl extends CompilerProjectExtension {
 
   @Override
   public void setCompilerOutputUrl(String compilerOutputUrl) {
-    VirtualFilePointer pointer = VirtualFilePointerManager.getInstance().create(compilerOutputUrl, myProject, null);
+    VirtualFilePointer pointer = VirtualFilePointerManager.getInstance().create(compilerOutputUrl, this, null);
     setCompilerOutputPointer(pointer);
     String path = VfsUtilCore.urlToPath(compilerOutputUrl);
     myCompilerOutputWatchRequest = LocalFileSystem.getInstance().replaceWatchedRoot(myCompilerOutputWatchRequest, path, true);
@@ -121,7 +122,7 @@ final class CompilerProjectExtensionImpl extends CompilerProjectExtension {
 
     @Override
     public void readExternal(@NotNull Element element) {
-      getImpl(myProject).readExternal(myProject, element);
+      getImpl(myProject).readExternal(element);
     }
 
     @Override