From a270d6161adf2fa3c6a77ac34f494a8c516ddc14 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 21 Mar 2017 10:50:06 +0100 Subject: [PATCH] [platform] marks library roots for initial refresh Needed to detect "offline" changes to SDks and libs (made when the IDE is loaded but a project isn't loaded). --- .../impl/ProjectRootManagerComponent.java | 84 +++++++++++-------- .../ide/startup/impl/StartupManagerImpl.java | 19 +---- .../roots/impl/ProjectRootManagerImpl.java | 6 +- 3 files changed, 54 insertions(+), 55 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java index 8e3d6d9a4d42..f42555170226 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerComponent.java @@ -31,12 +31,20 @@ import com.intellij.openapi.module.impl.ModuleEx; import com.intellij.openapi.project.DumbModeTask; import com.intellij.openapi.project.DumbServiceImpl; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.OrderEnumerator; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.WatchedRootsProvider; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.*; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.openapi.vfs.VirtualFileSystem; import com.intellij.openapi.vfs.ex.VirtualFileManagerAdapter; +import com.intellij.openapi.vfs.newvfs.ArchiveFileSystem; +import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.vfs.pointers.VirtualFilePointerListener; import com.intellij.project.ProjectKt; @@ -51,7 +59,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.Collection; import java.util.Set; /** @@ -231,47 +238,41 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl implemen recursive.addAll(extension.getRootsToWatch()); } - final Module[] modules = ModuleManager.getInstance(myProject).getModules(); - for (Module module : modules) { - flat.add(module.getModuleFilePath()); - - final ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module); - - addRootsToTrack(moduleRootManager.getContentRootUrls(), recursive, flat); - - if (includeSourceRoots) { - addRootsToTrack(moduleRootManager.getSourceRootUrls(), recursive, flat); - } - - final OrderEntry[] orderEntries = moduleRootManager.getOrderEntries(); - for (OrderEntry entry : orderEntries) { - if (entry instanceof LibraryOrSdkOrderEntry) { - final LibraryOrSdkOrderEntry libSdkEntry = (LibraryOrSdkOrderEntry)entry; - for (OrderRootType orderRootType : OrderRootType.getAllTypes()) { - addRootsToTrack(libSdkEntry.getRootUrls(orderRootType), recursive, flat); - } - } - } + for (VirtualFile root : getRootsFromModules(includeSourceRoots)) { + (root.isDirectory() ? recursive : flat).add(root.getPath()); } return Pair.create(recursive, flat); } - private static void addRootsToTrack(final String[] urls, final Collection recursive, final Collection flat) { - for (String url : urls) { - if (url != null) { - final String protocol = VirtualFileManager.extractProtocol(url); - if (protocol == null || LocalFileSystem.PROTOCOL.equals(protocol)) { - recursive.add(extractLocalPath(url)); - } - else if (JarFileSystem.PROTOCOL.equals(protocol)) { - flat.add(extractLocalPath(url)); - } - else if (StandardFileSystems.JRT_PROTOCOL.equals(protocol)) { - recursive.add(extractLocalPath(url)); - } + private Set getRootsFromModules(boolean includeSourceRoots) { + Set roots = ContainerUtil.newHashSet(); + + for (Module module : ModuleManager.getInstance(myProject).getModules()) { + OrderEnumerator enumerator = ModuleRootManager.getInstance(module).orderEntries().withoutDepModules(); + if (!includeSourceRoots) { + enumerator = enumerator.withoutModuleSourceEntries(); } + enumerator.forEach(entry -> { + for (OrderRootType type : OrderRootType.getAllTypes()) { + for (VirtualFile root : entry.getFiles(type)) { + VirtualFileSystem fs = root.getFileSystem(); + if (fs instanceof LocalFileSystem) { + roots.add(root); + } + else if (fs instanceof ArchiveFileSystem) { + VirtualFile local = ((ArchiveFileSystem)fs).getLocalByEntry(root); + if (local != null) { + roots.add(local); + } + } + } + } + return true; + }); } + + return roots; } @Override @@ -302,6 +303,15 @@ public class ProjectRootManagerComponent extends ProjectRootManagerImpl implemen } } + @Override + public void markRootsForRefresh() { + for (VirtualFile root : getRootsFromModules(false)) { + if (root instanceof NewVirtualFile) { + ((NewVirtualFile)root).markDirtyRecursively(); + } + } + } + private class AppListener extends ApplicationAdapter { @Override public void beforeWriteActionStart(@NotNull Object action) { diff --git a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java index 22509e56d1f4..a6b88340aa25 100644 --- a/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/ide/startup/impl/StartupManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -23,15 +23,13 @@ import com.intellij.notification.Notifications; import com.intellij.openapi.application.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.*; import com.intellij.openapi.project.impl.ProjectLifecycleListener; -import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; import com.intellij.openapi.startup.StartupActivity; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; @@ -40,7 +38,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.openapi.vfs.impl.local.FileWatcher; import com.intellij.openapi.vfs.impl.local.LocalFileSystemImpl; -import com.intellij.openapi.vfs.newvfs.NewVirtualFile; import com.intellij.openapi.vfs.newvfs.RefreshQueue; import com.intellij.project.ProjectKt; import com.intellij.ui.GuiUtils; @@ -223,7 +220,7 @@ public class StartupManagerImpl extends StartupManagerEx { if (myProject.isDisposed() || myInitialRefreshScheduled) return; myInitialRefreshScheduled = true; - markContentRootsForRefresh(); + ((ProjectRootManagerImpl)ProjectRootManager.getInstance(myProject)).markRootsForRefresh(); Application app = ApplicationManager.getApplication(); if (!app.isCommandLine()) { @@ -245,16 +242,6 @@ public class StartupManagerImpl extends StartupManagerEx { }, ModalityState.defaultModalityState()); } - private void markContentRootsForRefresh() { - for (Module module : ModuleManager.getInstance(myProject).getModules()) { - for (VirtualFile contentRoot : ModuleRootManager.getInstance(module).getContentRoots()) { - if (contentRoot instanceof NewVirtualFile) { - ((NewVirtualFile)contentRoot).markDirtyRecursively(); - } - } - } - } - private void checkFsSanity() { try { String path = myProject.getProjectFilePath(); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java index 042e5175b35b..06300ac19461 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ProjectRootManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2016 JetBrains s.r.o. + * Copyright 2000-2017 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. @@ -644,4 +644,6 @@ public class ProjectRootManagerImpl extends ProjectRootManagerEx implements Pers } } } -} + + public void markRootsForRefresh() { } +} \ No newline at end of file