diff --git a/platform/analysis-api/src/com/intellij/openapi/vfs/LocalFileSystem.java b/platform/analysis-api/src/com/intellij/openapi/vfs/LocalFileSystem.java index ebdf338b4ea4..0c4e694b1833 100644 --- a/platform/analysis-api/src/com/intellij/openapi/vfs/LocalFileSystem.java +++ b/platform/analysis-api/src/com/intellij/openapi/vfs/LocalFileSystem.java @@ -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 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 files, boolean async, boolean recursive, @Nullable Runnable onFinish); + public abstract void refreshNioFiles(@NotNull Iterable files, boolean async, boolean recursive, @Nullable Runnable onFinish); + /** * Performs a non-recursive synchronous refresh of specified files. */ diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autoimport/ProjectSettingsTracker.kt b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autoimport/ProjectSettingsTracker.kt index a44f0ab3d6ac..bcfae8863be0 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autoimport/ProjectSettingsTracker.kt +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/autoimport/ProjectSettingsTracker.kt @@ -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) diff --git a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemBase.java b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemBase.java index 68ea91282eb9..afa14723b79c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemBase.java +++ b/platform/platform-impl/src/com/intellij/openapi/vfs/impl/local/LocalFileSystemBase.java @@ -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 files, boolean async, boolean recursive, @Nullable Runnable onFinish) { + Stream iterator = StreamEx.of(files.iterator()).map(f -> refreshAndFindFileByIoFile(f)); + refreshFiles(iterator, async, recursive, onFinish); + } + + @Override + public void refreshNioFiles(@NotNull Iterable files, + boolean async, + boolean recursive, + @Nullable Runnable onFinish) { + Stream iterator = StreamEx.of(files.iterator()).map(f -> refreshAndFindFileByNioFile(f)); + refreshFiles(iterator, async, recursive, onFinish); + } + + private static void refreshFiles(@NotNull Stream 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 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 files, boolean async, boolean recursive, @Nullable Runnable onFinish) { RefreshQueue.getInstance().refresh(async, recursive, onFinish, ContainerUtil.toCollection(files)); diff --git a/platform/testFramework/src/com/intellij/mock/MockLocalFileSystem.java b/platform/testFramework/src/com/intellij/mock/MockLocalFileSystem.java index 88501bf2172d..453716a18813 100644 --- a/platform/testFramework/src/com/intellij/mock/MockLocalFileSystem.java +++ b/platform/testFramework/src/com/intellij/mock/MockLocalFileSystem.java @@ -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 files, boolean async, boolean recursive, @Nullable Runnable onFinish) { } + @Override + public void refreshNioFiles(@NotNull Iterable files, boolean async, boolean recursive, @Nullable Runnable onFinish) { } + @Override public void refreshFiles(@NotNull Iterable files, boolean async, boolean recursive, @Nullable Runnable onFinish) { }