Merge remote-tracking branch 'origin/master'

This commit is contained in:
Yann Cébron
2017-03-21 10:52:07 +01:00
3 changed files with 54 additions and 55 deletions
@@ -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<String> recursive, final Collection<String> 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<VirtualFile> getRootsFromModules(boolean includeSourceRoots) {
Set<VirtualFile> 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) {
@@ -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();
@@ -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() { }
}