[vfs] support refreshing virtual files by NIO Paths

GitOrigin-RevId: 33aaf8207fccdb2270e5952bad9ee38d2338d314
This commit is contained in:
Alexander Zolotov
2021-03-16 23:59:35 +00:00
committed by intellij-monorepo-bot
parent 6647f4b467
commit 833797d238
4 changed files with 30 additions and 15 deletions
@@ -59,10 +59,10 @@ public abstract class LocalFileSystem extends NewVirtualFileSystem {
}
/**
* See {@link #refreshIoFiles(Iterable, boolean, boolean, Runnable)}.
* See {@link #refreshNioFiles(Iterable, boolean, boolean, Runnable)}.
*/
public final void refreshNioFiles(@NotNull Iterable<? extends Path> files) {
refreshIoFiles(ContainerUtil.map(files, Path::toFile), false, false, null);
refreshNioFiles(files, false, false, null);
}
/**
@@ -72,6 +72,8 @@ public abstract class LocalFileSystem extends NewVirtualFileSystem {
*/
public abstract void refreshIoFiles(@NotNull Iterable<? extends File> files, boolean async, boolean recursive, @Nullable Runnable onFinish);
public abstract void refreshNioFiles(@NotNull Iterable<? extends Path> files, boolean async, boolean recursive, @Nullable Runnable onFinish);
/**
* Performs a non-recursive synchronous refresh of specified files.
*/
@@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile
import com.intellij.util.LocalTimeCounter.currentTime
import org.jetbrains.annotations.ApiStatus
import java.io.File
import java.nio.file.Path
import java.util.concurrent.Executor
import java.util.concurrent.atomic.AtomicReference
@@ -144,8 +145,8 @@ class ProjectSettingsTracker(
settingsProvider.invalidate()
settingsProvider.supply({ settingsPaths ->
val localFileSystem = LocalFileSystem.getInstance()
val settingsFiles = settingsPaths.map { File(it) }
localFileSystem.refreshIoFiles(settingsFiles, projectTracker.isAsyncChangesProcessing, false) {
val settingsFiles = settingsPaths.map { Path.of(it) }
localFileSystem.refreshNioFiles(settingsFiles, projectTracker.isAsyncChangesProcessing, false) {
callback(settingsPaths)
}
}, parentDisposable)
@@ -25,6 +25,7 @@ import com.intellij.util.ThrowableConsumer;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.io.PreemptiveSafeFileOutputStream;
import com.intellij.util.io.SafeFileOutputStream;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly;
@@ -33,7 +34,10 @@ import java.io.*;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Dmitry Avdeev
@@ -181,6 +185,20 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
@Override
public void refreshIoFiles(@NotNull Iterable<? extends File> files, boolean async, boolean recursive, @Nullable Runnable onFinish) {
Stream<VirtualFile> iterator = StreamEx.of(files.iterator()).map(f -> refreshAndFindFileByIoFile(f));
refreshFiles(iterator, async, recursive, onFinish);
}
@Override
public void refreshNioFiles(@NotNull Iterable<? extends Path> files,
boolean async,
boolean recursive,
@Nullable Runnable onFinish) {
Stream<VirtualFile> iterator = StreamEx.of(files.iterator()).map(f -> refreshAndFindFileByNioFile(f));
refreshFiles(iterator, async, recursive, onFinish);
}
private static void refreshFiles(@NotNull Stream<VirtualFile> files, boolean async, boolean recursive, @Nullable Runnable onFinish) {
VirtualFileManagerEx manager = (VirtualFileManagerEx)VirtualFileManager.getInstance();
Application app = ApplicationManager.getApplication();
@@ -188,23 +206,13 @@ public abstract class LocalFileSystemBase extends LocalFileSystem {
if (fireCommonRefreshSession) manager.fireBeforeRefreshStart(false);
try {
List<VirtualFile> filesToRefresh = new ArrayList<>();
for (File file : files) {
VirtualFile virtualFile = refreshAndFindFileByIoFile(file);
if (virtualFile != null) {
filesToRefresh.add(virtualFile);
}
}
RefreshQueue.getInstance().refresh(async, recursive, onFinish, filesToRefresh);
RefreshQueue.getInstance().refresh(async, recursive, onFinish, files.filter(f -> f != null).collect(Collectors.toList()));
}
finally {
if (fireCommonRefreshSession) manager.fireAfterRefreshFinish(false);
}
}
@Override
public void refreshFiles(@NotNull Iterable<? extends VirtualFile> files, boolean async, boolean recursive, @Nullable Runnable onFinish) {
RefreshQueue.getInstance().refresh(async, recursive, onFinish, ContainerUtil.toCollection(files));
@@ -13,6 +13,7 @@ import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Set;
@@ -22,6 +23,9 @@ public class MockLocalFileSystem extends LocalFileSystem {
@Override
public void refreshIoFiles(@NotNull Iterable<? extends File> files, boolean async, boolean recursive, @Nullable Runnable onFinish) { }
@Override
public void refreshNioFiles(@NotNull Iterable<? extends Path> files, boolean async, boolean recursive, @Nullable Runnable onFinish) { }
@Override
public void refreshFiles(@NotNull Iterable<? extends VirtualFile> files, boolean async, boolean recursive, @Nullable Runnable onFinish) { }