Import list of pure kotlin source roots from gradle

in facet settings for inspections
#KT-32300 Fixed
This commit is contained in:
Andrey Uskov
2019-07-03 21:15:21 +03:00
parent 2665fff373
commit c98ad923bd
10 changed files with 47 additions and 11 deletions
@@ -64,8 +64,8 @@ var DataNode<out ModuleData>.dependenciesCache
by DataNodeUserDataProperty( by DataNodeUserDataProperty(
Key.create<MutableMap<DataNode<ProjectData>, Collection<DataNode<out ModuleData>>>>("MODULE_DEPENDENCIES_CACHE") Key.create<MutableMap<DataNode<ProjectData>, Collection<DataNode<out ModuleData>>>>("MODULE_DEPENDENCIES_CACHE")
) )
var DataNode<out ContentRootData>.isPureKotlinSourceFolder var DataNode<out ModuleData>.pureKotlinSourceFolders
by NotNullableCopyableDataNodeUserDataProperty(Key.create<Boolean>("PURE_KOTLIN_SOURCE_FOLDER"), false) by NotNullableCopyableDataNodeUserDataProperty(Key.create<List<String>>("PURE_KOTLIN_SOURCE_FOLDER"), emptyList())
class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() { class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension() {
@@ -287,6 +287,8 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
nextResolver.populateModuleContentRoots(gradleModule, ideModule) nextResolver.populateModuleContentRoots(gradleModule, ideModule)
val moduleNamePrefix = GradleProjectResolverUtil.getModuleId(resolverCtx, gradleModule) val moduleNamePrefix = GradleProjectResolverUtil.getModuleId(resolverCtx, gradleModule)
resolverCtx.getExtraProject(gradleModule, KotlinGradleModel::class.java)?.let { gradleModel -> 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<DataNode<GradleSourceSetData>> val gradleSourceSets = ideModule.children.filter { it.data is GradleSourceSetData } as Collection<DataNode<GradleSourceSetData>>
for (gradleSourceSetNode in gradleSourceSets) { for (gradleSourceSetNode in gradleSourceSets) {
val propertiesForSourceSet = val propertiesForSourceSet =
@@ -295,10 +297,12 @@ class KotlinGradleProjectResolverExtension : AbstractProjectResolverExtension()
gradleSourceSetNode.children.forEach { dataNode -> gradleSourceSetNode.children.forEach { dataNode ->
val data = dataNode.data as? ContentRootData val data = dataNode.data as? ContentRootData
if (data != null) { if (data != null) {
/*
Code snippet for setting in content root properties
if (propertiesForSourceSet?.second?.pureKotlinSourceFolders?.contains(File(data.rootPath)) == true) { if (propertiesForSourceSet?.second?.pureKotlinSourceFolders?.contains(File(data.rootPath)) == true) {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
(dataNode as DataNode<ContentRootData>).isPureKotlinSourceFolder = true (dataNode as DataNode<ContentRootData>).isPureKotlinSourceFolder = true
} }*/
val packagePrefix = propertiesForSourceSet?.second?.packagePrefix val packagePrefix = propertiesForSourceSet?.second?.packagePrefix
if (packagePrefix != null) { if (packagePrefix != null) {
ExternalSystemSourceType.values().filter { !(it.isResource || it.isGenerated) }.forEach { type -> ExternalSystemSourceType.values().filter { !(it.isResource || it.isGenerated) }.forEach { type ->
@@ -288,7 +288,14 @@ fun configureFacetByGradleModule(
) )
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false, GradleConstants.SYSTEM_ID.id) 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) { if (sourceSetNode == null) {
ideModule.compilerArgumentsBySourceSet = moduleNode.compilerArgumentsBySourceSet ideModule.compilerArgumentsBySourceSet = moduleNode.compilerArgumentsBySourceSet
@@ -121,7 +121,14 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
) )
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false) val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider, mainModuleNode.isHmpp) kotlinFacet.configureFacet(
compilerVersion,
coroutinesProperty,
platform,
modelsProvider,
mainModuleNode.isHmpp,
mainModuleNode.pureKotlinSourceFolders
)
val compilerArguments = kotlinSourceSet.compilerArguments val compilerArguments = kotlinSourceSet.compilerArguments
val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
@@ -158,6 +165,8 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
productionOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile productionOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
testOutputPath = null testOutputPath = null
} }
this.pureKotlinSourceFolders = mainModuleNode.pureKotlinSourceFolders
} }
return kotlinFacet return kotlinFacet
@@ -240,6 +240,8 @@ class KotlinFacetSettings {
var externalProjectId: String = "" var externalProjectId: String = ""
var isHmppEnabled: Boolean = false var isHmppEnabled: Boolean = false
var pureKotlinSourceFolders: List<String> = emptyList()
} }
interface KotlinFacetSettingsProvider { interface KotlinFacetSettingsProvider {
@@ -161,6 +161,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings {
isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false
externalProjectId = element.getAttributeValue("externalProjectId") ?: "" externalProjectId = element.getAttributeValue("externalProjectId") ?: ""
isHmppEnabled = element.getAttribute("isHmppProject")?.booleanValue ?: false isHmppEnabled = element.getAttribute("isHmppProject")?.booleanValue ?: false
pureKotlinSourceFolders = element.getAttributeValue("pureKotlinSourceFolders")?.split(";")?.toList() ?: emptyList()
element.getChild("compilerSettings")?.let { element.getChild("compilerSettings")?.let {
compilerSettings = CompilerSettings() compilerSettings = CompilerSettings()
XmlSerializer.deserializeInto(compilerSettings!!, it) XmlSerializer.deserializeInto(compilerSettings!!, it)
@@ -331,6 +332,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
if (isHmppEnabled) { if (isHmppEnabled) {
element.setAttribute("isHmppProject", isHmppEnabled.toString()) element.setAttribute("isHmppProject", isHmppEnabled.toString())
} }
if (pureKotlinSourceFolders.isNotEmpty()) {
element.setAttribute("pureKotlinSourceFolders", pureKotlinSourceFolders.joinToString(";"))
}
productionOutputPath?.let { productionOutputPath?.let {
if (it != (compilerArguments as? K2JSCompilerArguments)?.outputFile) { if (it != (compilerArguments as? K2JSCompilerArguments)?.outputFile) {
element.addContent(Element("productionOutputPath").apply { addContent(PathUtil.toSystemIndependentName(it)) }) element.addContent(Element("productionOutputPath").apply { addContent(PathUtil.toSystemIndependentName(it)) })
@@ -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 // TODO There should be a way to figure out the correct platform version
val platform = detectPlatform(mavenProject)?.defaultPlatform 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 facetSettings = kotlinFacet.configuration.settings
val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!! val configuredPlatform = kotlinFacet.configuration.settings.targetPlatform!!
val configuration = mavenPlugin.configurationElement val configuration = mavenPlugin.configurationElement
@@ -282,7 +282,7 @@ fun configureLanguageAndApiVersion(
WriteAction.run<Throwable> { WriteAction.run<Throwable> {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) 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) { if (apiVersion != null) {
facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion) facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion)
} }
@@ -149,7 +149,8 @@ fun KotlinFacet.configureFacet(
coroutineSupport: LanguageFeature.State, coroutineSupport: LanguageFeature.State,
platform: TargetPlatform?, // if null, detect by module dependencies platform: TargetPlatform?, // if null, detect by module dependencies
modelsProvider: IdeModifiableModelsProvider, modelsProvider: IdeModifiableModelsProvider,
hmppEnabled: Boolean hmppEnabled: Boolean,
pureKotlinSourceFolders: List<String>
) { ) {
val module = module val module = module
with(configuration.settings) { with(configuration.settings) {
@@ -169,6 +170,7 @@ fun KotlinFacet.configureFacet(
this.apiLevel = languageLevel this.apiLevel = languageLevel
} }
this.coroutineSupport = if (languageLevel != null && languageLevel < LanguageVersion.KOTLIN_1_3) coroutineSupport else null this.coroutineSupport = if (languageLevel != null && languageLevel < LanguageVersion.KOTLIN_1_3) coroutineSupport else null
this.pureKotlinSourceFolders = pureKotlinSourceFolders
} }
module.externalCompilerVersion = compilerVersion module.externalCompilerVersion = compilerVersion
@@ -185,7 +187,7 @@ fun KotlinFacet.configureFacet(
platform: IdePlatform<*, *>, platform: IdePlatform<*, *>,
modelsProvider: IdeModifiableModelsProvider 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
} }
@@ -762,7 +762,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
WriteAction.run<Throwable> { WriteAction.run<Throwable> {
val modelsProvider = IdeModifiableModelsProviderImpl(project) val modelsProvider = IdeModifiableModelsProviderImpl(project)
val facet = module.getOrCreateFacet(modelsProvider, useProjectSettings = false) 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() modelsProvider.commit()
} }
} }
@@ -351,7 +351,8 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
LanguageFeature.State.ENABLED, LanguageFeature.State.ENABLED,
platform, platform,
modelsProvider, modelsProvider,
false false,
emptyList()
); );
assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform()); assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform());
assertEquals(jvmTarget.getDescription(), assertEquals(jvmTarget.getDescription(),