diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/DefaultExternalSourceDirectorySet.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/DefaultExternalSourceDirectorySet.java index d6a8d7aa6291..8121c0ccaa8a 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/DefaultExternalSourceDirectorySet.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/DefaultExternalSourceDirectorySet.java @@ -43,6 +43,8 @@ public class DefaultExternalSourceDirectorySet implements ExternalSourceDirector @NotNull private List myFilters; + private boolean myInheritedCompilerOutput; + public DefaultExternalSourceDirectorySet() { mySrcDirs = new HashSet(); myExcludes = new HashSet(); @@ -88,6 +90,15 @@ public class DefaultExternalSourceDirectorySet implements ExternalSourceDirector return myOutputDir; } + @Override + public boolean isCompilerOutputPathInherited() { + return myInheritedCompilerOutput; + } + + public void setInheritedCompilerOutput(boolean inheritedCompilerOutput) { + myInheritedCompilerOutput = inheritedCompilerOutput; + } + @NotNull @Override public Set getIncludes() { diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/ExternalSourceDirectorySet.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/ExternalSourceDirectorySet.java index 70f0bed3d177..530d4d4c0695 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/ExternalSourceDirectorySet.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/model/ExternalSourceDirectorySet.java @@ -36,6 +36,12 @@ public interface ExternalSourceDirectorySet extends Serializable { @NotNull File getOutputDir(); + /** + * Returns true if compiler output for this ExternalSourceDirectorySet should is inherited from IDEA project + * @return true if compiler output path is inherited, false otherwise + */ + boolean isCompilerOutputPathInherited(); + @NotNull Set getExcludes(); @NotNull diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemImportingTestCase.java b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemImportingTestCase.java index 6107a00b7107..d55ceb0fe97c 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemImportingTestCase.java +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalSystemImportingTestCase.java @@ -157,6 +157,11 @@ public abstract class ExternalSystemImportingTestCase extends ExternalSystemTest assertEquals(testOutput, getAbsolutePath(e.getCompilerOutputUrlForTests())); } + protected void assertModuleInheritedOutput(String moduleName) { + CompilerModuleExtension e = getCompilerExtension(moduleName); + assertTrue(e.isCompilerOutputPathInherited()); + } + private static String getAbsolutePath(String path) { path = VfsUtil.urlToPath(path); path = PathUtil.getCanonicalPath(path); @@ -168,8 +173,7 @@ public abstract class ExternalSystemImportingTestCase extends ExternalSystemTest } protected CompilerModuleExtension getCompilerExtension(String module) { - ModuleRootManager m = getRootManager(module); - return CompilerModuleExtension.getInstance(m.getModule()); + return CompilerModuleExtension.getInstance(getModule(module)); } protected void assertModuleLibDep(String moduleName, String depName) { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java index 113e49a61a25..28de6f8861d7 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/execution/GradleOrderEnumeratorHandler.java @@ -107,6 +107,8 @@ public class GradleOrderEnumeratorHandler extends OrderEnumerationHandler { final ExternalSourceDirectorySet directorySet = externalSourceSet.getSources().get(sourceType); if (directorySet == null) return; + if (directorySet.isCompilerOutputPathInherited()) return; + result.add(VfsUtilCore.pathToUrl(directorySet.getOutputDir().getAbsolutePath())); } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java index ad7ade6a3c58..ac858e56f634 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/BaseGradleProjectResolverExtension.java @@ -230,8 +230,8 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver File sourceCompileOutputPath = null; File testCompileOutputPath = null; - File resourceCompileOutputPath; - File testResourceCompileOutputPath; + File resourceCompileOutputPath = null; + File testResourceCompileOutputPath = null; boolean inheritOutputDirs = false; ModuleData moduleData = ideModule.getData(); @@ -244,21 +244,22 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver ExternalProject externalProject = resolverCtx.getExtraProject(gradleModule, ExternalProject.class); if (externalProject != null) { externalProject = new DefaultExternalProject(externalProject); - } - if (!inheritOutputDirs && (sourceCompileOutputPath == null || testCompileOutputPath == null)) { - sourceCompileOutputPath = getCompileOutputPath(externalProject, MAIN_SOURCE_SET, ExternalSystemSourceType.SOURCE); - resourceCompileOutputPath = getCompileOutputPath(externalProject, MAIN_SOURCE_SET, ExternalSystemSourceType.RESOURCE); - testCompileOutputPath = getCompileOutputPath(externalProject, TEST_SOURCE_SET, ExternalSystemSourceType.TEST); - testResourceCompileOutputPath = getCompileOutputPath(externalProject, TEST_SOURCE_SET, ExternalSystemSourceType.TEST_RESOURCE); - } - else { - resourceCompileOutputPath = sourceCompileOutputPath; - testResourceCompileOutputPath = testCompileOutputPath; - - if (externalProject != null) { + if (!inheritOutputDirs && (sourceCompileOutputPath == null || testCompileOutputPath == null)) { + sourceCompileOutputPath = getCompileOutputPath(externalProject, MAIN_SOURCE_SET, ExternalSystemSourceType.SOURCE); + resourceCompileOutputPath = getCompileOutputPath(externalProject, MAIN_SOURCE_SET, ExternalSystemSourceType.RESOURCE); + testCompileOutputPath = getCompileOutputPath(externalProject, TEST_SOURCE_SET, ExternalSystemSourceType.TEST); + testResourceCompileOutputPath = getCompileOutputPath(externalProject, TEST_SOURCE_SET, ExternalSystemSourceType.TEST_RESOURCE); + } + else if (!inheritOutputDirs) { + resourceCompileOutputPath = sourceCompileOutputPath; + testResourceCompileOutputPath = testCompileOutputPath; final ExternalSourceSet mainSourceSet = externalProject.getSourceSets().get(MAIN_SOURCE_SET); if (mainSourceSet != null) { + final ExternalSourceDirectorySet sourceDirectories = mainSourceSet.getSources().get(ExternalSystemSourceType.SOURCE); + if (sourceDirectories instanceof DefaultExternalSourceDirectorySet) { + ((DefaultExternalSourceDirectorySet)sourceDirectories).setOutputDir(sourceCompileOutputPath); + } final ExternalSourceDirectorySet resourceDirectories = mainSourceSet.getSources().get(ExternalSystemSourceType.RESOURCE); if (resourceDirectories instanceof DefaultExternalSourceDirectorySet) { ((DefaultExternalSourceDirectorySet)resourceDirectories).setOutputDir(sourceCompileOutputPath); @@ -266,6 +267,10 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver } final ExternalSourceSet testSourceSet = externalProject.getSourceSets().get(TEST_SOURCE_SET); if (testSourceSet != null) { + final ExternalSourceDirectorySet testDirectories = testSourceSet.getSources().get(ExternalSystemSourceType.TEST); + if (testDirectories instanceof DefaultExternalSourceDirectorySet) { + ((DefaultExternalSourceDirectorySet)testDirectories).setOutputDir(testCompileOutputPath); + } final ExternalSourceDirectorySet testResourceDirectories = testSourceSet.getSources().get(ExternalSystemSourceType.TEST_RESOURCE); if (testResourceDirectories instanceof DefaultExternalSourceDirectorySet) { ((DefaultExternalSourceDirectorySet)testResourceDirectories).setOutputDir(testCompileOutputPath); @@ -277,6 +282,9 @@ public class BaseGradleProjectResolverExtension implements GradleProjectResolver projectDataNode.createOrReplaceChild(ExternalProjectDataService.KEY, externalProject); } } + else { + LOG.warn(String.format("Unable to get ExternalProject model for '%s'", gradleModule.getName())); + } if (sourceCompileOutputPath != null) { moduleData.setCompileOutputPath(ExternalSystemSourceType.SOURCE, sourceCompileOutputPath.getAbsolutePath()); 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 8c57ebb57d29..5fd64533dcc9 100644 --- a/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java +++ b/plugins/gradle/testSources/org/jetbrains/plugins/gradle/importing/GradleFoldersImportingTest.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.gradle.importing; +import org.jetbrains.annotations.NotNull; import org.junit.Test; /** @@ -34,14 +35,39 @@ public class GradleFoldersImportingTest extends GradleImportingTestCase { assertModules("project"); assertContentRoots("project", getProjectPath()); - assertSources("project", "src/main/java"); - assertResources("project", "src/main/resources"); - assertTestSources("project", "src/test/java"); - assertTestResources("project", "src/test/resources"); - assertExcludes("project", ".gradle", "build"); + assertDefaultGradleJavaProjectFolders("project"); assertModuleOutput("project", getProjectPath() + "/build/classes/main", getProjectPath() + "/build/classes/test"); } + + @Test + public void testProjectWithInheritedOutputDirs() throws Exception { + + importProject( + "apply plugin: 'java'\n" + + "apply plugin: 'idea'\n" + + "idea {\n" + + " module {\n" + + " inheritOutputDirs = true\n" + + " }\n" + + "}" + ); + + assertModules("project"); + assertContentRoots("project", getProjectPath()); + + assertDefaultGradleJavaProjectFolders("project"); + + assertModuleInheritedOutput("project"); + } + + protected void assertDefaultGradleJavaProjectFolders(@NotNull String moduleName) { + assertSources(moduleName, "src/main/java"); + assertResources(moduleName, "src/main/resources"); + assertTestSources(moduleName, "src/test/java"); + assertTestResources(moduleName, "src/test/resources"); + assertExcludes(moduleName, ".gradle", "build"); + } } diff --git a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy index 3bb6b471b755..1322c13ef54e 100644 --- a/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy +++ b/plugins/gradle/tooling-extension-impl/src/org/jetbrains/plugins/gradle/tooling/builder/ExternalProjectBuilderImpl.groovy @@ -26,6 +26,7 @@ import org.gradle.api.file.FileCopyDetails import org.gradle.api.tasks.SourceSet import org.gradle.api.tasks.SourceSetContainer import org.gradle.api.tasks.util.PatternFilterable +import org.gradle.plugins.ide.idea.IdeaPlugin import org.jetbrains.annotations.NotNull import org.jetbrains.annotations.Nullable import org.jetbrains.plugins.gradle.tooling.ErrorMessageBuilder @@ -109,6 +110,9 @@ class ExternalProjectBuilderImpl implements ModelBuilderService { } static Map getSourceSets(Project project) { + final IdeaPlugin ideaPlugin = project.getPlugins().getPlugin(IdeaPlugin.class); + boolean inheritOutputDirs = ideaPlugin?.model?.module?.inheritOutputDirs ?: false + def result = [:] as Map if (!project.hasProperty("sourceSets") || !(project.sourceSets instanceof SourceSetContainer)) { return result @@ -128,11 +132,13 @@ class ExternalProjectBuilderImpl implements ModelBuilderService { resourcesDirectorySet.name = sourceSet.resources.name resourcesDirectorySet.srcDirs = sourceSet.resources.srcDirs resourcesDirectorySet.outputDir = sourceSet.output.resourcesDir + resourcesDirectorySet.inheritedCompilerOutput = inheritOutputDirs ExternalSourceDirectorySet javaDirectorySet = new DefaultExternalSourceDirectorySet() javaDirectorySet.name = sourceSet.allJava.name javaDirectorySet.srcDirs = sourceSet.allJava.srcDirs javaDirectorySet.outputDir = sourceSet.output.classesDir + javaDirectorySet.inheritedCompilerOutput = inheritOutputDirs // javaDirectorySet.excludes = javaExcludes + sourceSet.java.excludes; // javaDirectorySet.includes = javaIncludes + sourceSet.java.includes;