From 94497af6bcc44b1635a299cedf612125acc0bfc2 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 25 Jul 2025 12:50:12 +0200 Subject: [PATCH] Fix move/copy/rename/etc for single-source files. - disable some refactoring actions for standalone source files, since they throw exceptions without having project context - this will delegate to generic file actions Co-authored-by: Michael Bien --- .../java/file/launcher/api/SourceLauncher.java | 12 ++++++++++++ .../launcher/queries/MultiSourceRootProvider.java | 12 ++++++++++++ .../refactoring/java/RefactoringUtils.java | 7 ++++++- .../java/ui/RefactoringActionsProvider.java | 15 ++++++++++----- 4 files changed, 40 insertions(+), 6 deletions(-) diff --git a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/api/SourceLauncher.java b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/api/SourceLauncher.java index c09b89592561..3490f7f0e092 100644 --- a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/api/SourceLauncher.java +++ b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/api/SourceLauncher.java @@ -55,6 +55,18 @@ public static boolean isSourceLauncherFile(FileObject file) { return msrp != null && msrp.isSourceLauncher(file); } + /**Returns {@code true} if and only if the given file is known as a + * file that is handled by a source file launcher, for which index is created. + * + * @param file the file to test + * @return {@code true} if and only if the file is known as a file handled by the + * source launcher. {@code false} otherwise. + */ + public static boolean isIndexedSourceLauncherFile(FileObject file) { + MultiSourceRootProvider msrp = Lookup.getDefault().lookup(MultiSourceRootProvider.class); + return msrp != null && msrp.isRegisteredSourceLauncher(file); + } + public static String joinCommandLines(Iterable inputLines) { Map joinedOptions = new HashMap<>(); diff --git a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java index 40839442dc37..f695acef1bce 100644 --- a/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java +++ b/java/java.file.launcher/src/org/netbeans/modules/java/file/launcher/queries/MultiSourceRootProvider.java @@ -230,6 +230,18 @@ public boolean isSourceLauncher(FileObject file) { return getSourceRoot(file) != null; } + public boolean isRegisteredSourceLauncher(FileObject file) { + FileObject root = getSourceRoot(file); + + if (root == null) { + return false; + } + + synchronized (registeredRoots) { + return registeredRoots.contains(root); + } + } + private ClassPath getBootPath(FileObject file) { if (isSourceLauncher(file)) { return JavaPlatformManager.getDefault() diff --git a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/RefactoringUtils.java b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/RefactoringUtils.java index db0dadefb162..81c1944bd2f9 100644 --- a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/RefactoringUtils.java +++ b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/RefactoringUtils.java @@ -305,7 +305,7 @@ public static boolean isFileInOpenProject(FileObject file) { public static boolean isOnSourceClasspath(FileObject fo) { Project pr = FileOwnerQuery.getOwner(fo); if (pr == null) { - return SourceLauncher.isSourceLauncherFile(fo); + return isIndexedSourceLauncherFile(fo); } //workaround for 143542 @@ -321,6 +321,11 @@ public static boolean isOnSourceClasspath(FileObject fo) { //return ClassPath.getClassPath(fo, ClassPath.SOURCE)!=null; } + public static boolean isIndexedSourceLauncherFile(FileObject fo) { + // TODO: don't call from this module + return SourceLauncher.isIndexedSourceLauncherFile(fo); + } + /** * Is given file a root of source classpath? * diff --git a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RefactoringActionsProvider.java b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RefactoringActionsProvider.java index 106cd5e42032..d2ace08cf81a 100644 --- a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RefactoringActionsProvider.java +++ b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/ui/RefactoringActionsProvider.java @@ -49,6 +49,7 @@ import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.datatransfer.PasteType; + import static org.netbeans.modules.refactoring.java.ui.Bundle.*; @@ -185,7 +186,7 @@ public boolean canCopy(Lookup lookup) { if (!fo.isFolder()) { return false; } - if (!JavaRefactoringUtils.isOnSourceClasspath(fo)) { + if (!JavaRefactoringUtils.isOnSourceClasspath(fo) || RefactoringUtils.isIndexedSourceLauncherFile(fo)) { return false; } } @@ -331,7 +332,7 @@ public boolean canMove(Lookup lookup) { if (!fo.isFolder()) { return false; } - if (!JavaRefactoringUtils.isOnSourceClasspath(fo)) { + if (!JavaRefactoringUtils.isOnSourceClasspath(fo) || RefactoringUtils.isIndexedSourceLauncherFile(fo)) { return false; } @@ -343,7 +344,8 @@ public boolean canMove(Lookup lookup) { if (dob==null) { return false; } - if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile())) { + if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile()) + || RefactoringUtils.isIndexedSourceLauncherFile(dob.getPrimaryFile())) { return false; } if (dob instanceof DataFolder) { @@ -380,7 +382,9 @@ public boolean canMove(Lookup lookup) { return false; } else { //Ctrl-X - if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile()) || RefactoringUtils.isClasspathRoot(dob.getPrimaryFile())) { + if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile()) + || RefactoringUtils.isClasspathRoot(dob.getPrimaryFile()) + || RefactoringUtils.isIndexedSourceLauncherFile(dob.getPrimaryFile())) { return false; } else { LinkedList folders = new LinkedList(); @@ -399,7 +403,8 @@ public boolean canMove(Lookup lookup) { } } } - if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile())) { + if (!JavaRefactoringUtils.isOnSourceClasspath(dob.getPrimaryFile()) + || RefactoringUtils.isIndexedSourceLauncherFile(dob.getPrimaryFile())) { return false; } if (RefactoringUtils.isJavaFile(dob.getPrimaryFile())) {