diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java index eea78619a1a7..5fd53f4afb64 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleImpl.java @@ -49,7 +49,7 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { private static final Logger LOG = Logger.getInstance(ModuleImpl.class); @NotNull private final Project myProject; - @Nullable private final VirtualFilePointer myImlFilePointer; + @Nullable protected VirtualFilePointer myImlFilePointer; private volatile boolean isModuleAdded; private String myName; @@ -57,32 +57,37 @@ public class ModuleImpl extends ComponentManagerImpl implements ModuleEx { private final ModuleScopeProvider myModuleScopeProvider; @ApiStatus.Internal - public ModuleImpl(@NotNull String name, @NotNull Project project, @Nullable String filePath) { + public ModuleImpl(@NotNull String name, @NotNull Project project, @NotNull String filePath) { + this(name, project); + myImlFilePointer = VirtualFilePointerManager.getInstance().create( + VfsUtilCore.pathToUrl(filePath), this, + new VirtualFilePointerListener() { + @Override + public void validityChanged(@NotNull VirtualFilePointer @NotNull [] pointers) { + if (myImlFilePointer == null) return; + VirtualFile virtualFile = myImlFilePointer.getFile(); + if (virtualFile != null) { + ((ModuleStore)getStore()).setPath(virtualFile.toNioPath(), virtualFile, false); + ModuleManager.getInstance(myProject).incModificationCount(); + } + } + }); + } + + @ApiStatus.Internal + public ModuleImpl(@NotNull String name, @NotNull Project project, @Nullable VirtualFilePointer virtualFilePointer) { + this(name, project); + VirtualFilePointerManager.getInstance(); + myImlFilePointer = virtualFilePointer; + } + + @ApiStatus.Internal + public ModuleImpl(@NotNull String name, @NotNull Project project) { super((ComponentManagerImpl)project); - registerServiceInstance(Module.class, this, ComponentManagerImpl.getFakeCorePluginDescriptor()); - myProject = project; myModuleScopeProvider = new ModuleScopeProviderImpl(this); - myName = name; - if (filePath == null) { - myImlFilePointer = null; - } - else { - myImlFilePointer = VirtualFilePointerManager.getInstance().create( - VfsUtilCore.pathToUrl(filePath), this, - new VirtualFilePointerListener() { - @Override - public void validityChanged(@NotNull VirtualFilePointer @NotNull [] pointers) { - VirtualFile virtualFile = myImlFilePointer.getFile(); - if (virtualFile != null) { - ((ModuleStore)getStore()).setPath(virtualFile.toNioPath(), virtualFile, false); - ModuleManager.getInstance(myProject).incModificationCount(); - } - } - }); - } } @Override diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java index 0eb8948f6a00..901f2e478161 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java @@ -117,7 +117,7 @@ public class ModuleManagerComponent extends ModuleManagerImpl { @NotNull @Override protected ModuleEx createNonPersistentModule(@NotNull String name) { - return new ModuleImpl(name, myProject, null); + return new ModuleImpl(name, myProject); } @NotNull diff --git a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModifiableModuleModelBridgeImpl.kt b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModifiableModuleModelBridgeImpl.kt index 8e18c0c4c480..f11c139d9f9f 100644 --- a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModifiableModuleModelBridgeImpl.kt +++ b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModifiableModuleModelBridgeImpl.kt @@ -16,10 +16,7 @@ import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.projectModel.ProjectModelBundle import com.intellij.util.PathUtil import com.intellij.util.io.systemIndependentPath -import com.intellij.workspaceModel.ide.NonPersistentEntitySource -import com.intellij.workspaceModel.ide.WorkspaceModel -import com.intellij.workspaceModel.ide.configLocation -import com.intellij.workspaceModel.ide.getInstance +import com.intellij.workspaceModel.ide.* import com.intellij.workspaceModel.ide.impl.jps.serialization.ErrorReporter import com.intellij.workspaceModel.ide.impl.jps.serialization.JpsProjectEntitiesLoader import com.intellij.workspaceModel.ide.impl.legacyBridge.LegacyBridgeModifiableBase @@ -176,8 +173,8 @@ internal class ModifiableModuleModelBridgeImpl( throw IOException("Failed to load module from $filePath") } - val moduleFilePath = ModuleManagerComponentBridge.getInstance(project).getModuleFilePath(moduleEntity)!! - LocalFileSystem.getInstance().refreshAndFindFileByNioFile(moduleFilePath) + val moduleFileUrl = ModuleManagerComponentBridge.getInstance(project).getModuleVirtualFileUrl(moduleEntity)!! + LocalFileSystem.getInstance().refreshAndFindFileByNioFile(moduleFileUrl.toPath()) return createModuleInstance(moduleEntity, false) } diff --git a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleBridgeImpl.kt b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleBridgeImpl.kt index 3d2c6c7fd7ab..9cba9ffdb4b2 100644 --- a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleBridgeImpl.kt +++ b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleBridgeImpl.kt @@ -13,6 +13,7 @@ import com.intellij.openapi.roots.ModuleRootManager import com.intellij.workspaceModel.ide.WorkspaceModel import com.intellij.workspaceModel.ide.WorkspaceModelChangeListener import com.intellij.workspaceModel.ide.WorkspaceModelTopics +import com.intellij.workspaceModel.ide.impl.VirtualFileUrlBridge import com.intellij.workspaceModel.ide.impl.legacyBridge.facet.FacetManagerBridge import com.intellij.workspaceModel.ide.impl.legacyBridge.module.ModuleManagerComponentBridge.Companion.findModuleEntity import com.intellij.workspaceModel.ide.impl.legacyBridge.module.roots.ModuleRootComponentBridge @@ -20,17 +21,17 @@ import com.intellij.workspaceModel.ide.legacyBridge.ModuleBridge import com.intellij.workspaceModel.storage.* import com.intellij.workspaceModel.storage.bridgeEntities.* import com.intellij.workspaceModel.storage.impl.VersionedEntityStorageOnStorage +import com.intellij.workspaceModel.storage.url.VirtualFileUrl import org.picocontainer.MutablePicoContainer -import java.nio.file.Path internal class ModuleBridgeImpl( override var moduleEntityId: ModuleId, name: String, project: Project, - filePath: Path?, + virtualFileUrl: VirtualFileUrl?, override var entityStorage: VersionedEntityStorage, override var diff: WorkspaceEntityStorageDiffBuilder? -) : ModuleImpl(name, project, filePath?.toString()), ModuleBridge { +) : ModuleImpl(name, project, virtualFileUrl as? VirtualFileUrlBridge), ModuleBridge { init { // default project doesn't have modules @@ -53,6 +54,11 @@ internal class ModuleBridgeImpl( } } + fun rename(newName: String, newModuleFileUrl: VirtualFileUrl?, notifyStorage: Boolean) { + myImlFilePointer = newModuleFileUrl as VirtualFileUrlBridge + rename(newName, notifyStorage) + } + override fun rename(newName: String, notifyStorage: Boolean) { moduleEntityId = moduleEntityId.copy(name = newName) super.rename(newName, notifyStorage) diff --git a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt index fa28b7174657..8f73e7f46b6c 100644 --- a/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt +++ b/platform/lang-impl/src/com/intellij/workspaceModel/ide/impl/legacyBridge/module/ModuleManagerComponentBridge.kt @@ -44,6 +44,7 @@ import com.intellij.workspaceModel.ide.impl.legacyBridge.project.ProjectRootsCha import com.intellij.workspaceModel.ide.legacyBridge.ModuleBridge import com.intellij.workspaceModel.storage.* import com.intellij.workspaceModel.storage.bridgeEntities.* +import com.intellij.workspaceModel.storage.url.VirtualFileUrl import java.nio.file.Path import java.util.* import java.util.concurrent.Callable @@ -257,7 +258,8 @@ class ModuleManagerComponentBridge(private val project: Project) : ModuleManager unloadedModules.remove(change.newEntity.name) val module = event.storageBefore.findModuleByEntity(change.oldEntity) if (module != null) { - module.rename(newId.name, true) + module as ModuleBridgeImpl + module.rename(newId.name, getModuleVirtualFileUrl(change.newEntity), true) oldModuleNames[module] = oldId.name } } @@ -339,7 +341,7 @@ class ModuleManagerComponentBridge(private val project: Project) : ModuleManager private fun loadModules(entities: List) { LOG.debug { "Loading modules for ${entities.size} entities" } val fileSystem = LocalFileSystem.getInstance() - entities.forEach { module -> getModuleFilePath(module)?.let { fileSystem.refreshAndFindFileByNioFile(it) } } + entities.forEach { module -> getModuleVirtualFileUrl(module)?.let { fileSystem.refreshAndFindFileByNioFile(it.toPath()) } } val service = AppExecutorUtil.createBoundedApplicationPoolExecutor("ModuleManager Loader", JobSchedulerImpl.getCPUCoresCount()) try { @@ -542,7 +544,7 @@ class ModuleManagerComponentBridge(private val project: Project) : ModuleManager UnloadedModulesListStorage.getInstance(project).unloadedModuleNames = this.unloadedModules.keys.toList() } - internal fun getModuleFilePath(moduleEntity: ModuleEntity): Path? { + internal fun getModuleVirtualFileUrl(moduleEntity: ModuleEntity): VirtualFileUrl? { val entitySource = when (val moduleSource = moduleEntity.entitySource) { is JpsFileDependentEntitySource -> moduleSource.originalSource is CustomModuleEntitySource -> moduleSource.internalSource @@ -551,28 +553,28 @@ class ModuleManagerComponentBridge(private val project: Project) : ModuleManager if (entitySource !is JpsFileEntitySource.FileInDirectory) { return null } - return entitySource.directory.toPath().resolve("${moduleEntity.name}.iml") + return entitySource.directory.append("${moduleEntity.name}.iml") } fun createModuleInstance(moduleEntity: ModuleEntity, versionedStorage: VersionedEntityStorage, diff: WorkspaceEntityStorageDiffBuilder?, isNew: Boolean): ModuleBridge { - val modulePath = getModuleFilePath(moduleEntity) + val moduleFileUrl = getModuleVirtualFileUrl(moduleEntity) val module = ModuleBridgeImpl( name = moduleEntity.name, project = project, - filePath = modulePath, + virtualFileUrl = moduleFileUrl, moduleEntityId = moduleEntity.persistentId(), entityStorage = versionedStorage, diff = diff ) module.init { - if (modulePath != null) { + if (moduleFileUrl != null) { try { val moduleStore = module.stateStore as ModuleStore - moduleStore.setPath(modulePath, null, isNew) + moduleStore.setPath(moduleFileUrl.toPath(), null, isNew) } catch (t: Throwable) { logger().error(t)