From 5fbd5cf4539c315d2d7581b1baa7d9a646f5fedf Mon Sep 17 00:00:00 2001 From: dkashyn Date: Mon, 17 Jul 2023 18:07:47 -0400 Subject: [PATCH 1/9] Select source roots for library jars that have interim folders like `/src/...`. IJ UI logic is reused and suggested candidate selected if and only if there is one candidate exists. --- .../base/sync/libraries/LibraryModifier.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index 1597cb7dd40..42f9bc10c4b 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -20,15 +20,20 @@ import com.google.idea.blaze.base.model.LibraryFilesProvider; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.Library.ModifiableModel; +import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.vfs.StandardFileSystems; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.util.io.URLUtil; import java.io.File; +import java.util.Collections; +import java.util.List; /** Modifies {@link Library} content in {@link Library.ModifiableModel}. */ public class LibraryModifier { @@ -73,7 +78,20 @@ private void addRoot(File file, OrderRootType orderRootType) { logger.warn("No local file found for " + file); return; } - modifiableModel.addRoot(pathToUrl(file), orderRootType); + if (orderRootType == OrderRootType.SOURCES) { + VirtualFile jarfile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(file)); + List candidates = Collections.emptyList(); + if (jarfile != null) { + candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarfile, new EmptyProgressIndicator()); + } + if (candidates.size() == 1) { + modifiableModel.addRoot(candidates.get(0), orderRootType); + } else { + modifiableModel.addRoot(pathToUrl(file), orderRootType); + } + } else { + modifiableModel.addRoot(pathToUrl(file), orderRootType); + } } private String pathToUrl(File path) { From 563474ffe3866309997cf64a289d2f027e16294a Mon Sep 17 00:00:00 2001 From: dkashyn Date: Mon, 17 Jul 2023 20:32:50 -0400 Subject: [PATCH 2/9] Add registry value to conditionally import all of the source dirs from a single source jar. --- .../blaze/base/sync/libraries/LibraryModifier.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index 42f9bc10c4b..a35c77586d7 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -27,6 +27,7 @@ import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; @@ -78,14 +79,14 @@ private void addRoot(File file, OrderRootType orderRootType) { logger.warn("No local file found for " + file); return; } - if (orderRootType == OrderRootType.SOURCES) { - VirtualFile jarfile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(file)); + if (Registry.is("bazel.sync.detect.source.roots") && orderRootType == OrderRootType.SOURCES) { + VirtualFile jarFile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(file)); List candidates = Collections.emptyList(); - if (jarfile != null) { - candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarfile, new EmptyProgressIndicator()); + if (jarFile != null) { + candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarFile, new EmptyProgressIndicator()); } - if (candidates.size() == 1) { - modifiableModel.addRoot(candidates.get(0), orderRootType); + if (!candidates.isEmpty()) { + candidates.forEach(candidate -> modifiableModel.addRoot(candidate, orderRootType)); } else { modifiableModel.addRoot(pathToUrl(file), orderRootType); } From 75b79a2cf80f6d3a991fb514dff9d0d414eb6b6e Mon Sep 17 00:00:00 2001 From: dkashyn Date: Tue, 18 Jul 2023 09:48:32 -0400 Subject: [PATCH 3/9] Registry key definition --- base/src/META-INF/blaze-base.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/base/src/META-INF/blaze-base.xml b/base/src/META-INF/blaze-base.xml index f2d90d1b175..a1a4dc8ea23 100644 --- a/base/src/META-INF/blaze-base.xml +++ b/base/src/META-INF/blaze-base.xml @@ -342,6 +342,9 @@ + From af4d35bd83dd652cb5ebc3e3a98e41d515949146 Mon Sep 17 00:00:00 2001 From: dkashyn Date: Sun, 30 Jul 2023 12:51:00 -0400 Subject: [PATCH 4/9] Addressed PR comments: 1. Moved some jar class/source related logic to BazelJarLibrary class from `base` module LibraryModifier. 2. Added proper progress indicator. 3. Applied registry key description edits suggestions. --- base/src/META-INF/blaze-base.xml | 2 +- .../base/model/LibraryFilesProvider.java | 12 +++ .../base/sync/libraries/LibraryModifier.java | 49 +++--------- .../java/sync/model/BlazeJarLibrary.java | 74 +++++++++++++++++++ 4 files changed, 96 insertions(+), 41 deletions(-) diff --git a/base/src/META-INF/blaze-base.xml b/base/src/META-INF/blaze-base.xml index 758906806b3..69bce8f2321 100644 --- a/base/src/META-INF/blaze-base.xml +++ b/base/src/META-INF/blaze-base.xml @@ -343,7 +343,7 @@ description="Enables opening the project view file the first time the project is imported" key="bazel.project.import.open_project_view"/> diff --git a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java index c71ba17a8ed..4eb058db8ce 100644 --- a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java +++ b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java @@ -30,12 +30,24 @@ public interface LibraryFilesProvider { */ ImmutableList getClassFiles(BlazeProjectData blazeProjectData); + /** + * Returns a list of files' urls that should be added to {@link Library.ModifiableModel} as + * OrderRootType.CLASSES. + */ + ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData); + /** * Returns a list of files that should be added to {@link Library.ModifiableModel} as * OrderRootType.SOURCES. */ ImmutableList getSourceFiles(BlazeProjectData blazeProjectData); + /** + * Returns a list of files' urls that should be added to {@link Library.ModifiableModel} as + * OrderRootType.SOURCES. + */ + ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData); + default boolean supportAnchors() { return false; } diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index a35c77586d7..9f26682b44e 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -55,12 +55,12 @@ public Library.ModifiableModel getModifiableModel() { /** Writes the library content to its {@link Library.ModifiableModel}. */ public void updateModifiableModel(BlazeProjectData blazeProjectData) { removeAllContents(); - for (File classFile : libraryFilesProvider.getClassFiles(blazeProjectData)) { - addRoot(classFile, OrderRootType.CLASSES); + for (String classFileUrl : libraryFilesProvider.getClassFilesUrls(blazeProjectData)) { + addRoot(classFileUrl, OrderRootType.CLASSES); } - for (File sourceFile : libraryFilesProvider.getSourceFiles(blazeProjectData)) { - addRoot(sourceFile, OrderRootType.SOURCES); + for (String sourceFileUrl : libraryFilesProvider.getSourceFilesUrls(blazeProjectData)) { + addRoot(sourceFileUrl, OrderRootType.SOURCES); } } @@ -74,44 +74,13 @@ private ModifiableModel getLibraryModifiableModel( return modelsProvider.getModifiableLibraryModel(library); } - private void addRoot(File file, OrderRootType orderRootType) { - if (!file.exists()) { - logger.warn("No local file found for " + file); + private void addRoot(String fileUrl, OrderRootType orderRootType) { + VirtualFile virtualFile = VirtualFileManager.getInstance().findFileByUrl(fileUrl); + if (virtualFile == null || !virtualFile.exists()) { + logger.warn("No local file found for " + fileUrl); return; } - if (Registry.is("bazel.sync.detect.source.roots") && orderRootType == OrderRootType.SOURCES) { - VirtualFile jarFile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(file)); - List candidates = Collections.emptyList(); - if (jarFile != null) { - candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarFile, new EmptyProgressIndicator()); - } - if (!candidates.isEmpty()) { - candidates.forEach(candidate -> modifiableModel.addRoot(candidate, orderRootType)); - } else { - modifiableModel.addRoot(pathToUrl(file), orderRootType); - } - } else { - modifiableModel.addRoot(pathToUrl(file), orderRootType); - } - } - - private String pathToUrl(File path) { - String name = path.getName(); - boolean isJarFile = - FileUtilRt.extensionEquals(name, "jar") - || FileUtilRt.extensionEquals(name, "srcjar") - || FileUtilRt.extensionEquals(name, "zip"); - // .jar files require an URL with "jar" protocol. - String protocol = - isJarFile - ? StandardFileSystems.JAR_PROTOCOL - : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); - String filePath = FileUtil.toSystemIndependentName(path.getPath()); - String url = VirtualFileManager.constructUrl(protocol, filePath); - if (isJarFile) { - url += URLUtil.JAR_SEPARATOR; - } - return url; + modifiableModel.addRoot(fileUrl, orderRootType); } private void removeAllContents() { diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java index eeda2c03bf8..7d88a89449f 100644 --- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java +++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java @@ -19,9 +19,12 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.intellij.model.ProjectData; +import com.google.idea.blaze.base.async.executor.ProgressiveTaskWithProgressIndicator; +import com.google.idea.blaze.base.async.executor.ProgressiveWithResult; import com.google.idea.blaze.base.ideinfo.LibraryArtifact; import com.google.idea.blaze.base.ideinfo.ProtoWrapper; import com.google.idea.blaze.base.ideinfo.TargetKey; +import com.google.idea.blaze.base.io.VirtualFileSystemProvider; import com.google.idea.blaze.base.model.BlazeLibrary; import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.LibraryFilesProvider; @@ -29,9 +32,24 @@ import com.google.idea.blaze.java.libraries.AttachedSourceJarManager; import com.google.idea.blaze.java.libraries.JarCache; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.progress.EmptyProgressIndicator; +import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.util.registry.Registry; +import com.intellij.openapi.vfs.StandardFileSystems; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.io.URLUtil; + import java.io.File; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; +import java.util.concurrent.ExecutionException; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -140,6 +158,62 @@ public ImmutableList getSourceFiles(BlazeProjectData blazeProjectData) { .collect(toImmutableList()); } + @Override + public ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData) { + return getClassFiles(blazeProjectData).stream() + .map(this::pathToUrl) + .collect(toImmutableList()); + } + + @Override + public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData) { + final ImmutableList sourceFiles = getSourceFiles(blazeProjectData); + ImmutableList jarFilesAsSourceRoots = sourceFiles.stream().map(this::pathToUrl).collect(toImmutableList()); + if (!Registry.is("bazel.sync.detect.source.roots")) { + return jarFilesAsSourceRoots; + } else { + try { + return ProgressiveTaskWithProgressIndicator.builder(project, "Building targets") + .setModality(ProgressiveTaskWithProgressIndicator.Modality.MODAL) + .submitTaskWithResult(indicator -> { + List sourceFilesUrls = new LinkedList<>(); + for (File sourceFile : sourceFiles) { + VirtualFile jarFile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(sourceFile)); + List candidates = Collections.emptyList(); + if (jarFile != null && jarFile.exists()) { + candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarFile, indicator); + } + if (!candidates.isEmpty()) { + candidates.forEach(sourceVirtualFile -> sourceFilesUrls.add(sourceVirtualFile.getUrl())); + } + } + return ImmutableList.copyOf(sourceFilesUrls); + }).get(); + } catch (InterruptedException | ExecutionException e) { + return jarFilesAsSourceRoots; + } + } + } + + private String pathToUrl(File path) { + String name = path.getName(); + boolean isJarFile = + FileUtilRt.extensionEquals(name, "jar") + || FileUtilRt.extensionEquals(name, "srcjar") + || FileUtilRt.extensionEquals(name, "zip"); + // .jar files require an URL with "jar" protocol. + String protocol = + isJarFile + ? StandardFileSystems.JAR_PROTOCOL + : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); + String filePath = FileUtil.toSystemIndependentName(path.getPath()); + String url = VirtualFileManager.constructUrl(protocol, filePath); + if (isJarFile) { + url += URLUtil.JAR_SEPARATOR; + } + return url; + } + @Override public boolean equals(Object other) { if (this == other) { From f2eb19a4f62ecda433a76df3b82cfa58d159fc0a Mon Sep 17 00:00:00 2001 From: dkashyn Date: Sun, 30 Jul 2023 12:53:55 -0400 Subject: [PATCH 5/9] Cleanup unused imports --- .../blaze/base/sync/libraries/LibraryModifier.java | 11 ----------- .../idea/blaze/java/sync/model/BlazeJarLibrary.java | 3 --- 2 files changed, 14 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index 9f26682b44e..eccc45c35cb 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -15,26 +15,15 @@ */ package com.google.idea.blaze.base.sync.libraries; -import com.google.idea.blaze.base.io.VirtualFileSystemProvider; import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.LibraryFilesProvider; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; -import com.intellij.openapi.progress.EmptyProgressIndicator; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.Library.ModifiableModel; -import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; -import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.io.URLUtil; -import java.io.File; -import java.util.Collections; -import java.util.List; /** Modifies {@link Library} content in {@link Library.ModifiableModel}. */ public class LibraryModifier { diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java index 7d88a89449f..785f91d4933 100644 --- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java +++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java @@ -20,7 +20,6 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.intellij.model.ProjectData; import com.google.idea.blaze.base.async.executor.ProgressiveTaskWithProgressIndicator; -import com.google.idea.blaze.base.async.executor.ProgressiveWithResult; import com.google.idea.blaze.base.ideinfo.LibraryArtifact; import com.google.idea.blaze.base.ideinfo.ProtoWrapper; import com.google.idea.blaze.base.ideinfo.TargetKey; @@ -32,8 +31,6 @@ import com.google.idea.blaze.java.libraries.AttachedSourceJarManager; import com.google.idea.blaze.java.libraries.JarCache; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.progress.EmptyProgressIndicator; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; import com.intellij.openapi.util.io.FileUtil; From fa4684e167d5f54391d121b6dc88a7e1a2104878 Mon Sep 17 00:00:00 2001 From: dkashyn Date: Sun, 30 Jul 2023 13:15:27 -0400 Subject: [PATCH 6/9] Created default impls to not upset existing LibrarySourceProviders out there --- .../base/model/LibraryFilesProvider.java | 42 ++++++++++++++++++- .../java/sync/model/BlazeJarLibrary.java | 31 -------------- 2 files changed, 40 insertions(+), 33 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java index 4eb058db8ce..e88e71882b7 100644 --- a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java +++ b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java @@ -16,9 +16,18 @@ package com.google.idea.blaze.base.model; import com.google.common.collect.ImmutableList; +import com.google.idea.blaze.base.io.VirtualFileSystemProvider; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.vfs.StandardFileSystems; +import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.io.URLUtil; + import java.io.File; +import static com.google.common.collect.ImmutableList.toImmutableList; + /** Provides files to be updated in {@link Library.ModifiableModel}. */ public interface LibraryFilesProvider { /** Returns the name of library that the modifier will update. */ @@ -34,7 +43,11 @@ public interface LibraryFilesProvider { * Returns a list of files' urls that should be added to {@link Library.ModifiableModel} as * OrderRootType.CLASSES. */ - ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData); + default ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData) { + return getClassFiles(blazeProjectData).stream() + .map(this::pathToUrl) + .collect(toImmutableList()); + }; /** * Returns a list of files that should be added to {@link Library.ModifiableModel} as @@ -46,9 +59,34 @@ public interface LibraryFilesProvider { * Returns a list of files' urls that should be added to {@link Library.ModifiableModel} as * OrderRootType.SOURCES. */ - ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData); + default ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData) { + return getSourceFiles(blazeProjectData).stream() + .map(this::pathToUrl) + .collect(toImmutableList()); + } default boolean supportAnchors() { return false; } + + default String pathToUrl(File path) { + String name = path.getName(); + boolean isJarFile = + FileUtilRt.extensionEquals(name, "jar") + || FileUtilRt.extensionEquals(name, "srcjar") + || FileUtilRt.extensionEquals(name, "zip"); + // .jar files require an URL with "jar" protocol. + String protocol = + isJarFile + ? StandardFileSystems.JAR_PROTOCOL + : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); + String filePath = FileUtil.toSystemIndependentName(path.getPath()); + String url = VirtualFileManager.constructUrl(protocol, filePath); + if (isJarFile) { + url += URLUtil.JAR_SEPARATOR; + } + return url; + } + + } diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java index 785f91d4933..2c9bd7fd4f0 100644 --- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java +++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java @@ -23,7 +23,6 @@ import com.google.idea.blaze.base.ideinfo.LibraryArtifact; import com.google.idea.blaze.base.ideinfo.ProtoWrapper; import com.google.idea.blaze.base.ideinfo.TargetKey; -import com.google.idea.blaze.base.io.VirtualFileSystemProvider; import com.google.idea.blaze.base.model.BlazeLibrary; import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.LibraryFilesProvider; @@ -33,13 +32,9 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ui.configuration.JavaVfsSourceRootDetectionUtil; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; import com.intellij.openapi.util.registry.Registry; -import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.io.URLUtil; import java.io.File; import java.util.Collections; @@ -155,13 +150,6 @@ public ImmutableList getSourceFiles(BlazeProjectData blazeProjectData) { .collect(toImmutableList()); } - @Override - public ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData) { - return getClassFiles(blazeProjectData).stream() - .map(this::pathToUrl) - .collect(toImmutableList()); - } - @Override public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData) { final ImmutableList sourceFiles = getSourceFiles(blazeProjectData); @@ -192,25 +180,6 @@ public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectDat } } - private String pathToUrl(File path) { - String name = path.getName(); - boolean isJarFile = - FileUtilRt.extensionEquals(name, "jar") - || FileUtilRt.extensionEquals(name, "srcjar") - || FileUtilRt.extensionEquals(name, "zip"); - // .jar files require an URL with "jar" protocol. - String protocol = - isJarFile - ? StandardFileSystems.JAR_PROTOCOL - : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); - String filePath = FileUtil.toSystemIndependentName(path.getPath()); - String url = VirtualFileManager.constructUrl(protocol, filePath); - if (isJarFile) { - url += URLUtil.JAR_SEPARATOR; - } - return url; - } - @Override public boolean equals(Object other) { if (this == other) { From b84662985bf126c019c2ac6faf95f13ec2d04371 Mon Sep 17 00:00:00 2001 From: dkashyn Date: Sun, 30 Jul 2023 13:26:00 -0400 Subject: [PATCH 7/9] Proper message for progress task --- .../com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java index 2c9bd7fd4f0..87e2322788e 100644 --- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java +++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java @@ -158,7 +158,7 @@ public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectDat return jarFilesAsSourceRoots; } else { try { - return ProgressiveTaskWithProgressIndicator.builder(project, "Building targets") + return ProgressiveTaskWithProgressIndicator.builder(project, "Locating source roots in source path entry") .setModality(ProgressiveTaskWithProgressIndicator.Modality.MODAL) .submitTaskWithResult(indicator -> { List sourceFilesUrls = new LinkedList<>(); From c50a400c8860223033f989af0b208ca2faedc572 Mon Sep 17 00:00:00 2001 From: dkashyn Date: Wed, 2 Aug 2023 04:52:52 -0700 Subject: [PATCH 8/9] Review comments --- .../base/model/LibraryFilesProvider.java | 31 ++----------------- .../base/sync/libraries/LibraryModifier.java | 26 ++++++++++++++++ .../java/sync/model/BlazeJarLibrary.java | 5 +-- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java index e88e71882b7..e51585ddb0b 100644 --- a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java +++ b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java @@ -16,13 +16,8 @@ package com.google.idea.blaze.base.model; import com.google.common.collect.ImmutableList; -import com.google.idea.blaze.base.io.VirtualFileSystemProvider; +import com.google.idea.blaze.base.sync.libraries.LibraryModifier; import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.io.FileUtilRt; -import com.intellij.openapi.vfs.StandardFileSystems; -import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.util.io.URLUtil; import java.io.File; @@ -45,7 +40,7 @@ public interface LibraryFilesProvider { */ default ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectData) { return getClassFiles(blazeProjectData).stream() - .map(this::pathToUrl) + .map(LibraryModifier::pathToUrl) .collect(toImmutableList()); }; @@ -61,7 +56,7 @@ default ImmutableList getClassFilesUrls(BlazeProjectData blazeProjectDat */ default ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData) { return getSourceFiles(blazeProjectData).stream() - .map(this::pathToUrl) + .map(LibraryModifier::pathToUrl) .collect(toImmutableList()); } @@ -69,24 +64,4 @@ default boolean supportAnchors() { return false; } - default String pathToUrl(File path) { - String name = path.getName(); - boolean isJarFile = - FileUtilRt.extensionEquals(name, "jar") - || FileUtilRt.extensionEquals(name, "srcjar") - || FileUtilRt.extensionEquals(name, "zip"); - // .jar files require an URL with "jar" protocol. - String protocol = - isJarFile - ? StandardFileSystems.JAR_PROTOCOL - : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); - String filePath = FileUtil.toSystemIndependentName(path.getPath()); - String url = VirtualFileManager.constructUrl(protocol, filePath); - if (isJarFile) { - url += URLUtil.JAR_SEPARATOR; - } - return url; - } - - } diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index eccc45c35cb..67b9a2d6ecb 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -15,6 +15,7 @@ */ package com.google.idea.blaze.base.sync.libraries; +import com.google.idea.blaze.base.io.VirtualFileSystemProvider; import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.LibraryFilesProvider; import com.intellij.openapi.diagnostic.Logger; @@ -22,8 +23,14 @@ import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.Library.ModifiableModel; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import com.intellij.openapi.vfs.StandardFileSystems; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.io.URLUtil; + +import java.io.File; /** Modifies {@link Library} content in {@link Library.ModifiableModel}. */ public class LibraryModifier { @@ -72,6 +79,25 @@ private void addRoot(String fileUrl, OrderRootType orderRootType) { modifiableModel.addRoot(fileUrl, orderRootType); } + public static String pathToUrl(File path) { + String name = path.getName(); + boolean isJarFile = + FileUtilRt.extensionEquals(name, "jar") + || FileUtilRt.extensionEquals(name, "srcjar") + || FileUtilRt.extensionEquals(name, "zip"); + // .jar files require an URL with "jar" protocol. + String protocol = + isJarFile + ? StandardFileSystems.JAR_PROTOCOL + : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); + String filePath = FileUtil.toSystemIndependentName(path.getPath()); + String url = VirtualFileManager.constructUrl(protocol, filePath); + if (isJarFile) { + url += URLUtil.JAR_SEPARATOR; + } + return url; + } + private void removeAllContents() { for (String url : modifiableModel.getUrls(OrderRootType.CLASSES)) { modifiableModel.removeRoot(url, OrderRootType.CLASSES); diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java index 87e2322788e..76f3918f72d 100644 --- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java +++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java @@ -27,6 +27,7 @@ import com.google.idea.blaze.base.model.BlazeProjectData; import com.google.idea.blaze.base.model.LibraryFilesProvider; import com.google.idea.blaze.base.model.LibraryKey; +import com.google.idea.blaze.base.sync.libraries.LibraryModifier; import com.google.idea.blaze.java.libraries.AttachedSourceJarManager; import com.google.idea.blaze.java.libraries.JarCache; import com.intellij.openapi.diagnostic.Logger; @@ -153,7 +154,7 @@ public ImmutableList getSourceFiles(BlazeProjectData blazeProjectData) { @Override public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectData) { final ImmutableList sourceFiles = getSourceFiles(blazeProjectData); - ImmutableList jarFilesAsSourceRoots = sourceFiles.stream().map(this::pathToUrl).collect(toImmutableList()); + ImmutableList jarFilesAsSourceRoots = sourceFiles.stream().map(LibraryModifier::pathToUrl).collect(toImmutableList()); if (!Registry.is("bazel.sync.detect.source.roots")) { return jarFilesAsSourceRoots; } else { @@ -163,7 +164,7 @@ public ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectDat .submitTaskWithResult(indicator -> { List sourceFilesUrls = new LinkedList<>(); for (File sourceFile : sourceFiles) { - VirtualFile jarFile = VirtualFileManager.getInstance().findFileByUrl(pathToUrl(sourceFile)); + VirtualFile jarFile = VirtualFileManager.getInstance().findFileByUrl(LibraryModifier.pathToUrl(sourceFile)); List candidates = Collections.emptyList(); if (jarFile != null && jarFile.exists()) { candidates = JavaVfsSourceRootDetectionUtil.suggestRoots(jarFile, indicator); From f7d0e7c85d34aad4b63ec7e62539ce0ea9a68e68 Mon Sep 17 00:00:00 2001 From: dkashyn Date: Wed, 2 Aug 2023 04:59:53 -0700 Subject: [PATCH 9/9] Reverted excessive formatting changes and empty lines. --- .../idea/blaze/base/model/LibraryFilesProvider.java | 2 -- .../blaze/base/sync/libraries/LibraryModifier.java | 13 ++++++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java index e51585ddb0b..32e60156675 100644 --- a/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java +++ b/base/src/com/google/idea/blaze/base/model/LibraryFilesProvider.java @@ -18,7 +18,6 @@ import com.google.common.collect.ImmutableList; import com.google.idea.blaze.base.sync.libraries.LibraryModifier; import com.intellij.openapi.roots.libraries.Library; - import java.io.File; import static com.google.common.collect.ImmutableList.toImmutableList; @@ -63,5 +62,4 @@ default ImmutableList getSourceFilesUrls(BlazeProjectData blazeProjectDa default boolean supportAnchors() { return false; } - } diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java index 67b9a2d6ecb..539d79b6a45 100644 --- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java +++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryModifier.java @@ -29,7 +29,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.util.io.URLUtil; - import java.io.File; /** Modifies {@link Library} content in {@link Library.ModifiableModel}. */ @@ -82,14 +81,14 @@ private void addRoot(String fileUrl, OrderRootType orderRootType) { public static String pathToUrl(File path) { String name = path.getName(); boolean isJarFile = - FileUtilRt.extensionEquals(name, "jar") - || FileUtilRt.extensionEquals(name, "srcjar") - || FileUtilRt.extensionEquals(name, "zip"); + FileUtilRt.extensionEquals(name, "jar") + || FileUtilRt.extensionEquals(name, "srcjar") + || FileUtilRt.extensionEquals(name, "zip"); // .jar files require an URL with "jar" protocol. String protocol = - isJarFile - ? StandardFileSystems.JAR_PROTOCOL - : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); + isJarFile + ? StandardFileSystems.JAR_PROTOCOL + : VirtualFileSystemProvider.getInstance().getSystem().getProtocol(); String filePath = FileUtil.toSystemIndependentName(path.getPath()); String url = VirtualFileManager.constructUrl(protocol, filePath); if (isJarFile) {