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(
Key.create<MutableMap<DataNode<ProjectData>, Collection<DataNode<out ModuleData>>>>("MODULE_DEPENDENCIES_CACHE")
)
var DataNode<out ContentRootData>.isPureKotlinSourceFolder
by NotNullableCopyableDataNodeUserDataProperty(Key.create<Boolean>("PURE_KOTLIN_SOURCE_FOLDER"), false)
var DataNode<out ModuleData>.pureKotlinSourceFolders
by NotNullableCopyableDataNodeUserDataProperty(Key.create<List<String>>("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<DataNode<GradleSourceSetData>>
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<ContentRootData>).isPureKotlinSourceFolder = true
}
}*/
val packagePrefix = propertiesForSourceSet?.second?.packagePrefix
if (packagePrefix != null) {
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)
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
@@ -121,7 +121,14 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
)
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 defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
@@ -158,6 +165,8 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
productionOutputPath = (kotlinSourceSet.compilerArguments as? K2JSCompilerArguments)?.outputFile
testOutputPath = null
}
this.pureKotlinSourceFolders = mainModuleNode.pureKotlinSourceFolders
}
return kotlinFacet
@@ -240,6 +240,8 @@ class KotlinFacetSettings {
var externalProjectId: String = ""
var isHmppEnabled: Boolean = false
var pureKotlinSourceFolders: List<String> = emptyList()
}
interface KotlinFacetSettingsProvider {
@@ -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)) })
@@ -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
@@ -282,7 +282,7 @@ fun configureLanguageAndApiVersion(
WriteAction.run<Throwable> {
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)
}
@@ -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<String>
) {
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
}
@@ -762,7 +762,7 @@ class KtLightAnnotationTest : KotlinLightCodeInsightFixtureTestCase() {
WriteAction.run<Throwable> {
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()
}
}
@@ -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(),