From 9752381bd9b0dad81bf56c22ca56e382b54635e6 Mon Sep 17 00:00:00 2001 From: Jinbo Wang Date: Mon, 10 Jul 2023 09:48:27 +0800 Subject: [PATCH] Should not delete the project javanature when removing a nested .classpath resource file (#2750) --- .../core/internal/managers/IBuildSupport.java | 3 ++- .../projects/eclipse/classpath3/.classpath | 6 ++++++ .../projects/eclipse/classpath3/.project | 17 +++++++++++++++++ .../eclipse/classpath3/resources/.classpath | 0 .../EclipseProjectMetadataFileTest.java | 17 +++++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.classpath create mode 100644 org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.project create mode 100644 org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/resources/.classpath diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java index c20a4511d2..a96b926dda 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/managers/IBuildSupport.java @@ -96,7 +96,8 @@ default void refresh(IResource resource, CHANGE_TYPE changeType, IProgressMonito if (changeType == CHANGE_TYPE.DELETED) { if (IJavaProject.CLASSPATH_FILE_NAME.equals(resource.getName())) { IProject project = resource.getProject(); - if (ProjectUtils.isJavaProject(project)) { + if (ProjectUtils.isJavaProject(project) && (resource.equals(project.getFile(IJavaProject.CLASSPATH_FILE_NAME)) + || resource.getProjectRelativePath().segmentCount() == 1)) { ProjectUtils.removeJavaNatureAndBuilder(project, monitor); update(project, true, monitor); } diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.classpath b/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.classpath new file mode 100644 index 0000000000..63566ea3fc --- /dev/null +++ b/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.project b/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.project new file mode 100644 index 0000000000..3a992cf7b1 --- /dev/null +++ b/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/.project @@ -0,0 +1,17 @@ + + + classpath3 + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/resources/.classpath b/org.eclipse.jdt.ls.tests/projects/eclipse/classpath3/resources/.classpath new file mode 100644 index 0000000000..e69de29bb2 diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java index 8869434fa3..db3d5f70a9 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/filesystem/EclipseProjectMetadataFileTest.java @@ -28,6 +28,7 @@ import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.ls.core.internal.ProjectUtils; import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest; @@ -98,4 +99,20 @@ public void testDeleteClasspath() throws Exception { IFile bin = project.getFile("bin"); assertFalse(bin.getRawLocation().toFile().exists()); } + + @Test + public void testDeleteNonMetadataClasspath() throws Exception { + String name = "classpath3"; + importProjects("eclipse/" + name); + IProject project = getProject(name); + assertNotNull(project); + IFile dotClasspath = project.getFile(new Path("resources/.classpath")); + File file = FileUtil.toPath(dotClasspath.getLocationURI()).toFile(); + assertTrue(file.exists()); + file.delete(); + projectsManager.fileChanged(file.toPath().toUri().toString(), CHANGE_TYPE.DELETED); + waitForBackgroundJobs(); + project = getProject(name); + assertTrue(ProjectUtils.isJavaProject(project)); + } }