From c98ad923bd26026a11fb0da059973a9cb6b8f283 Mon Sep 17 00:00:00 2001 From: Andrey Uskov Date: Wed, 3 Jul 2019 21:15:21 +0300 Subject: [PATCH] Import list of pure kotlin source roots from gradle in facet settings for inspections #KT-32300 Fixed --- .../KotlinGradleProjectResolverExtension.kt | 10 +++++++--- .../configuration/KotlinGradleSourceSetDataService.kt | 9 ++++++++- .../idea/configuration/KotlinSourceSetDataService.kt | 11 ++++++++++- .../jetbrains/kotlin/config/KotlinFacetSettings.kt | 2 ++ .../org/jetbrains/kotlin/config/facetSerialization.kt | 4 ++++ .../kotlin/idea/maven/KotlinMavenImporter.kt | 9 ++++++++- .../test/KotlinLightCodeInsightFixtureTestCase.kt | 2 +- .../src/org/jetbrains/kotlin/idea/facet/facetUtils.kt | 6 ++++-- .../jetbrains/kotlin/asJava/KtLightAnnotationTest.kt | 2 +- .../idea/configuration/ConfigureKotlinTest.java | 3 ++- 10 files changed, 47 insertions(+), 11 deletions(-) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt index 5b8694e2fa0..ca54662201e 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleProjectResolverExtension.kt @@ -64,8 +64,8 @@ var DataNode.dependenciesCache by DataNodeUserDataProperty( Key.create, Collection>>>("MODULE_DEPENDENCIES_CACHE") ) -var DataNode.isPureKotlinSourceFolder - by NotNullableCopyableDataNodeUserDataProperty(Key.create("PURE_KOTLIN_SOURCE_FOLDER"), false) +var DataNode.pureKotlinSourceFolders + by NotNullableCopyableDataNodeUserDataProperty(Key.create>("PURE_KOTLIN_SOURCE_FOLDER"), emptyList()) class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() { @@ -287,6 +287,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() nextResolver.populateModuleContentRoots(gradleModule, ideModule) val moduleNamePrefix = GradleProjectResolverUtil.getModuleId(resolverCtx, gradleModule) resolverCtx.getExtraProject(gradleModule, KotlinGradleModel::class.java)?.let { gradleModel -> + ideModule.pureKotlinSourceFolders = + gradleModel.kotlinTaskProperties.flatMap { it.value.pureKotlinSourceFolders ?: emptyList() }.map { it.absolutePath } val gradleSourceSets = ideModule.children.filter { it.data is GradleSourceSetData } as Collection> for (gradleSourceSetNode in gradleSourceSets) { val propertiesForSourceSet = @@ -295,10 +297,12 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() gradleSourceSetNode.children.forEach { dataNode -> val data = dataNode.data as? ContentRootData if (data != null) { + /* + Code snippet for setting in content root properties if (propertiesForSourceSet?.second?.pureKotlinSourceFolders?.contains(File(data.rootPath)) == true) { @Suppress("UNCHECKED_CAST") (dataNode as DataNode).isPureKotlinSourceFolder = true - } + }*/ val packagePrefix = propertiesForSourceSet?.second?.packagePrefix if (packagePrefix != null) { ExternalSystemSourceType.values().filter { !(it.isResource || it.isGenerated) }.forEach { type -> diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt index 14dd1d1cc03..e0ce5eac8ec 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleSourceSetDataService.kt @@ -288,7 +288,14 @@ fun configureFacetByGradleModule( ) val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false, GradleConstants.SYSTEM_ID.id) - kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider, moduleNode.isHmpp) + kotlinFacet.configureFacet( + compilerVersion, + coroutinesProperty, + platform, + modelsProvider, + moduleNode.isHmpp, + moduleNode.pureKotlinSourceFolders + ) if (sourceSetNode == null) { ideModule.compilerArgumentsBySourceSet = moduleNode.compilerArgumentsBySourceSet diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt index 4bfd3e532de..3f9edd52616 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinSourceSetDataService.kt @@ -121,7 +121,14 @@ class KotlinSourceSetDataService : AbstractProjectDataService = emptyList() } interface KotlinFacetSettingsProvider { diff --git a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt index 92c7d934f64..900c1ad90fc 100644 --- a/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt +++ b/idea/idea-jps-common/src/org/jetbrains/kotlin/config/facetSerialization.kt @@ -161,6 +161,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings { isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false externalProjectId = element.getAttributeValue("externalProjectId") ?: "" isHmppEnabled = element.getAttribute("isHmppProject")?.booleanValue ?: false + pureKotlinSourceFolders = element.getAttributeValue("pureKotlinSourceFolders")?.split(";")?.toList() ?: emptyList() element.getChild("compilerSettings")?.let { compilerSettings = CompilerSettings() XmlSerializer.deserializeInto(compilerSettings!!, it) @@ -331,6 +332,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) { if (isHmppEnabled) { element.setAttribute("isHmppProject", isHmppEnabled.toString()) } + if (pureKotlinSourceFolders.isNotEmpty()) { + element.setAttribute("pureKotlinSourceFolders", pureKotlinSourceFolders.joinToString(";")) + } productionOutputPath?.let { if (it != (compilerArguments as? K2JSCompilerArguments)?.outputFile) { element.addContent(Element("productionOutputPath").apply { addContent(PathUtil.toSystemIndependentName(it)) }) diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt index af1e368f550..4ef7f6ad625 100644 --- a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/KotlinMavenImporter.kt @@ -255,7 +255,14 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_ // TODO There should be a way to figure out the correct platform version val platform = detectPlatform(mavenProject)?.defaultPlatform - kotlinFacet.configureFacet(compilerVersion, LanguageFeature.Coroutines.defaultState, platform, modifiableModelsProvider, hmppEnabled = isHmppModule) + kotlinFacet.configureFacet( + compilerVersion, + LanguageFeature.Coroutines.defaultState, + platform, + modifiableModelsProvider, + hmppEnabled = isHmppModule, + pureKotlinSourceFolders = emptyList() + ) val facetSettings = kotlinFacet.configuration.settings val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!! val configuration = mavenPlugin.configurationElement diff --git a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt index bf1c4e278b2..7a4b61f36d8 100644 --- a/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt +++ b/idea/idea-test-framework/test/org/jetbrains/kotlin/idea/test/KotlinLightCodeInsightFixtureTestCase.kt @@ -282,7 +282,7 @@ fun configureLanguageAndApiVersion( WriteAction.run { val modelsProvider = IdeModifiableModelsProviderImpl(project) val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) - facet.configureFacet(languageVersion, LanguageFeature.State.DISABLED, null, modelsProvider, false) + facet.configureFacet(languageVersion, LanguageFeature.State.DISABLED, null, modelsProvider, false, emptyList()) if (apiVersion != null) { facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion) } diff --git a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt index c16e579ce60..45a4eb51433 100644 --- a/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/facet/facetUtils.kt @@ -149,7 +149,8 @@ fun KotlinFacet.configureFacet( coroutineSupport: LanguageFeature.State, platform: TargetPlatform?, // if null, detect by module dependencies modelsProvider: IdeModifiableModelsProvider, - hmppEnabled: Boolean + hmppEnabled: Boolean, + pureKotlinSourceFolders: List ) { val module = module with(configuration.settings) { @@ -169,6 +170,7 @@ fun KotlinFacet.configureFacet( this.apiLevel = languageLevel } this.coroutineSupport = if (languageLevel != null && languageLevel < LanguageVersion.KOTLIN_1_3) coroutineSupport else null + this.pureKotlinSourceFolders = pureKotlinSourceFolders } module.externalCompilerVersion = compilerVersion @@ -185,7 +187,7 @@ fun KotlinFacet.configureFacet( platform: IdePlatform<*, *>, modelsProvider: IdeModifiableModelsProvider ) { - configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider, false) //TODO(auskov): passed isHmpp = false + configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider, false, emptyList()) //TODO(auskov): passed isHmpp = false } diff --git a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt index ad97cd1a4e1..3b51d460534 100644 --- a/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt +++ b/idea/tests/org/jetbrains/kotlin/asJava/KtLightAnnotationTest.kt @@ -762,7 +762,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() { WriteAction.run { val modelsProvider = IdeModifiableModelsProviderImpl(project) val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) - facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider, false) + facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider, false, emptyList()) modelsProvider.commit() } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java index 7bdefb88527..7c302e917a9 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java +++ b/idea/tests/org/jetbrains/kotlin/idea/configuration/ConfigureKotlinTest.java @@ -351,7 +351,8 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest { LanguageFeature.State.ENABLED, platform, modelsProvider, - false + false, + emptyList() ); assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform()); assertEquals(jvmTarget.getDescription(),