From 93275ffa823248d3fe57ef94fd68d8df383b5fb7 Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Wed, 15 Jan 2020 15:16:43 +0300 Subject: [PATCH] IDEA-219200 Changing the type of source folder in Gradle build script does not change type of source folder in IJ on import GitOrigin-RevId: a7698f11c201ba4a214dcbeb20d54a81c4acad9d --- .../manage/ContentRootDataService.java | 5 +- .../importing/GradleFoldersImportingTest.java | 70 +++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java index b30c9bc40018..1b6fa30fa630 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java @@ -246,10 +246,7 @@ public class ContentRootDataService extends AbstractProjectDataService folderRootType = folder.getRootType(); - if (JavaSourceRootType.SOURCE.equals(folderRootType) || sourceRootType.equals(folderRootType)) { - return; - } - if (JavaSourceRootType.TEST_SOURCE.equals(folderRootType) && JavaResourceRootType.TEST_RESOURCE.equals(sourceRootType)) { + if (sourceRootType.equals(folderRootType)) { return; } contentEntry.removeSourceFolder(folder); diff --git a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java index 5f39a2c9387d..5e7325f47b62 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java @@ -19,12 +19,15 @@ import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ContentEntry; +import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.SourceFolder; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.java.JavaSourceRootType; +import org.jetbrains.jps.model.module.JpsModuleSourceRootType; import org.jetbrains.plugins.gradle.GradleManager; import org.jetbrains.plugins.gradle.settings.GradleProjectSettings; import org.jetbrains.plugins.gradle.settings.GradleSettings; @@ -35,6 +38,7 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.doWriteAction; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.getManager; /** @@ -306,6 +310,72 @@ public class GradleFoldersImportingTest extends GradleImportingTestCase { assertTestResources("project", "src/test/resources", "src/test/resources2"); } + @Test + @TargetVersions("4.7+") + public void testSourceFoldersTypeAfterReimport() throws Exception { + createProjectSubDirs("src/main/java", + "src/main/resources", + "src/test/java", + "src/test/src2", + "src/test/resources", + "src/test/resources2", + "src/customSourceSet/java", + "src/customSourceSet/resources"); + importProject( + "apply plugin: 'java'\n" + + "apply plugin: 'idea'\n" + + "sourceSets {\n" + + " customSourceSet\n" + + "}\n" + + "idea {\n" + + " module {\n" + + " testSourceDirs += file('src/test/src2')\n" + + " testResourceDirs += file('src/test/resources2')\n" + + " testSourceDirs += project.sourceSets.customSourceSet.java.srcDirs\n" + + " testResourceDirs += project.sourceSets.customSourceSet.resources.srcDirs\n" + + " }\n" + + "}" + ); + + Runnable check = () -> { + assertModules("project", "project.main", "project.test", "project.customSourceSet"); + assertContentRoots("project", getProjectPath()); + assertExcludes("project", ".gradle", "build"); + assertContentRoots("project.main", getProjectPath() + "/src/main"); + assertSources("project.main", "java"); + assertResources("project.main", "resources"); + assertContentRoots("project.test", getProjectPath() + "/src/test"); + assertTestSources("project.test", "java", "src2"); + assertTestResources("project.test", "resources", "resources2"); + + assertContentRoots("project.customSourceSet", getProjectPath() + "/src/customSourceSet"); + assertTestSources("project.customSourceSet", "java"); + assertTestResources("project.customSourceSet", "resources"); + }; + + check.run(); + markModuleSourceFolders("project.customSourceSet", JavaSourceRootType.SOURCE); + importProject(); + check.run(); + } + + private void markModuleSourceFolders(@NotNull String moduleName, @NotNull JpsModuleSourceRootType rootType) { + doWriteAction(() -> { + Module module = getModule(moduleName); + final ModifiableRootModel model = ModuleRootManager.getInstance(module).getModifiableModel(); + ContentEntry[] contentEntries = model.getContentEntries(); + for (ContentEntry contentEntry : contentEntries) { + final SourceFolder[] sourceFolders = contentEntry.getSourceFolders(); + for (SourceFolder sourceFolder : sourceFolders) { + VirtualFile folderFile = sourceFolder.getFile(); + contentEntry.removeSourceFolder(sourceFolder); + contentEntry.addSourceFolder(folderFile, rootType); + } + } + model.commit(); + }); + } + @Test public void testProjectWithInheritedOutputDirs() throws Exception {