HMPP: import flag indicating that the project uses HMPP feature

This commit is contained in:
Andrey Uskov
2019-06-14 23:46:13 +03:00
parent 35dea296fa
commit e791b9d3f7
15 changed files with 32 additions and 13 deletions
@@ -55,6 +55,8 @@ var DataNode<ModuleData>.compilerArgumentsBySourceSet
by CopyableDataNodeUserDataProperty(Key.create<CompilerArgumentsBySourceSet>("CURRENT_COMPILER_ARGUMENTS"))
var DataNode<ModuleData>.coroutines
by CopyableDataNodeUserDataProperty(Key.create<String>("KOTLIN_COROUTINES"))
var DataNode<out ModuleData>.isHmpp
by NotNullableCopyableDataNodeUserDataProperty(Key.create<Boolean>("IS_HMPP_MODULE"), false)
var DataNode<ModuleData>.platformPluginId
by CopyableDataNodeUserDataProperty(Key.create<String>("PLATFORM_PLUGIN_ID"))
var DataNode<out ModuleData>.implementedModuleNames
@@ -288,7 +288,7 @@ fun configureFacetByGradleModule(
)
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false, GradleConstants.SYSTEM_ID.id)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider, moduleNode.isHmpp)
if (sourceSetNode == null) {
ideModule.compilerArgumentsBySourceSet = moduleNode.compilerArgumentsBySourceSet
@@ -360,6 +360,7 @@ open class KotlinMPPGradleProjectResolver : AbstractProjectResolverExtension() {
}
mainModuleNode.coroutines = mppModel.extraFeatures.coroutinesState
mainModuleNode.isHmpp = mppModel.extraFeatures.isHMPPEnabled
}
fun populateContentRoots(
@@ -121,7 +121,7 @@ class KotlinSourceSetDataService : AbstractProjectDataService<GradleSourceSetDat
)
val kotlinFacet = ideModule.getOrCreateFacet(modelsProvider, false)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider)
kotlinFacet.configureFacet(compilerVersion, coroutinesProperty, platform, modelsProvider, mainModuleNode.isHmpp)
val compilerArguments = kotlinSourceSet.compilerArguments
val defaultCompilerArguments = kotlinSourceSet.defaultCompilerArguments
@@ -239,6 +239,7 @@ class KotlinFacetSettings {
var isTestModule: Boolean = false
var externalProjectId: String = ""
var isHmppEnabled: Boolean = false
}
interface KotlinFacetSettingsProvider {
@@ -160,6 +160,7 @@ private fun readV2AndLaterConfig(element: Element): KotlinFacetSettings {
} ?: KotlinModuleKind.DEFAULT
isTestModule = element.getAttributeValue("isTestModule")?.toBoolean() ?: false
externalProjectId = element.getAttributeValue("externalProjectId") ?: ""
isHmppEnabled = element.getAttribute("isHmppProject")?.booleanValue ?: false
element.getChild("compilerSettings")?.let {
compilerSettings = CompilerSettings()
XmlSerializer.deserializeInto(compilerSettings!!, it)
@@ -326,6 +327,9 @@ private fun KotlinFacetSettings.writeLatestConfig(element: Element) {
if (externalProjectId.isNotEmpty()) {
element.setAttribute("externalProjectId", externalProjectId)
}
if (isHmppEnabled) {
element.setAttribute("isHmppProject", isHmppEnabled.toString())
}
productionOutputPath?.let {
if (it != (compilerArguments as? K2JSCompilerArguments)?.outputFile) {
element.addContent(Element("productionOutputPath").apply { addContent(PathUtil.toSystemIndependentName(it)) })
@@ -121,7 +121,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
}
}
configureFacet(mavenProject, modifiableModelsProvider, module)
configureFacet(mavenProject, modifiableModelsProvider, module, false) //HMPP is not supported currently for maven
}
private fun scheduleDownloadStdlibSources(mavenProject: MavenProject, module: Module) {
@@ -243,7 +243,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
PomFile.KotlinGoals.MetaData
)
private fun configureFacet(mavenProject: MavenProject, modifiableModelsProvider: IdeModifiableModelsProvider, module: Module) {
private fun configureFacet(mavenProject: MavenProject, modifiableModelsProvider: IdeModifiableModelsProvider, module: Module, isHmppModule: Boolean) {
val mavenPlugin = mavenProject.findPlugin(KotlinMavenConfigurator.GROUP_ID, KotlinMavenConfigurator.MAVEN_PLUGIN_ID) ?: return
val compilerVersion = mavenPlugin.version ?: LanguageVersion.LATEST_STABLE.versionString
val kotlinFacet = module.getOrCreateFacet(
@@ -255,7 +255,7 @@ 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)
kotlinFacet.configureFacet(compilerVersion, LanguageFeature.Coroutines.defaultState, platform, modifiableModelsProvider, hmppEnabled = isHmppModule)
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)
facet.configureFacet(languageVersion, LanguageFeature.State.DISABLED, null, modelsProvider, false)
if (apiVersion != null) {
facet.configuration.settings.apiLevel = LanguageVersion.fromVersionString(apiVersion)
}
@@ -128,6 +128,7 @@ interface KotlinTarget : Serializable {
interface ExtraFeatures : Serializable {
val coroutinesState: String?
val isHMPPEnabled: Boolean
}
interface KotlinMPPGradleModel : Serializable {
@@ -52,7 +52,7 @@ class KotlinMPPGradleModelBuilder : ModelBuilderService {
val coroutinesState = getCoroutinesState(project)
reportUnresolvedDependencies(targets)
val kotlinNativeHome = KotlinNativeHomeEvaluator.getKotlinNativeHome(project) ?: NO_KOTLIN_NATIVE_HOME
return KotlinMPPGradleModelImpl(sourceSetMap, targets, ExtraFeaturesImpl(coroutinesState), kotlinNativeHome)
return KotlinMPPGradleModelImpl(sourceSetMap, targets, ExtraFeaturesImpl(coroutinesState, isHMPPEnabled(project)), kotlinNativeHome)
}
private fun isHMPPEnabled(project: Project): Boolean {
@@ -147,7 +147,8 @@ data class KotlinTargetImpl(
}
data class ExtraFeaturesImpl(
override val coroutinesState: String?
override val coroutinesState: String?,
override val isHMPPEnabled: Boolean
) : ExtraFeatures
data class KotlinMPPGradleModelImpl(
@@ -169,7 +170,7 @@ data class KotlinMPPGradleModelImpl(
cloningCache[initialTarget] = it
}
}.toList(),
ExtraFeaturesImpl(mppModel.extraFeatures.coroutinesState),
ExtraFeaturesImpl(mppModel.extraFeatures.coroutinesState, mppModel.extraFeatures.isHMPPEnabled),
mppModel.kotlinNativeHome
)
}
@@ -61,6 +61,7 @@ class KotlinFacetEditorGeneralTab(
lateinit var useProjectSettingsCheckBox: ThreeStateCheckBox
lateinit var platformToCheckbox: Map<SimplePlatform, ThreeStateCheckBox>
lateinit var hmppCheckbox: ThreeStateCheckBox
private lateinit var projectSettingsLink: HoverHyperlinkLabel
@@ -111,12 +112,16 @@ class KotlinFacetEditorGeneralTab(
targetPlatformsPanel.add(it)
it.isEnabled = true //TODO(auskov): think about enabling/disabling editing facet settings
}
hmppCheckbox = ThreeStateCheckBox().apply {
this.isEnabled = false
}
val contentPanel = FormBuilder
.createFormBuilder()
.addComponent(JPanel(BorderLayout()).apply {
add(useProjectSettingsCheckBox, BorderLayout.WEST)
add(projectSettingsLink, BorderLayout.EAST)
}).addLabeledComponent("Selected target platforms:", targetPlatformsPanel)
.addLabeledComponent("HMPP enabled:", hmppCheckbox)
.addComponent(compilerConfigurable.createComponent()!!.apply {
border = null
})
@@ -307,6 +312,7 @@ class KotlinFacetEditorGeneralTab(
editor.platformToCheckbox.forEach {
it.value.isSelected = configuration.settings.targetPlatform?.contains(it.key) ?: false
}
editor.hmppCheckbox.isSelected = configuration.settings.isHmppEnabled
editor.compilerConfigurable.reset()
editor.updateCompilerConfigurable()
}
@@ -148,13 +148,15 @@ fun KotlinFacet.configureFacet(
compilerVersion: String?,
coroutineSupport: LanguageFeature.State,
platform: TargetPlatform?, // if null, detect by module dependencies
modelsProvider: IdeModifiableModelsProvider
modelsProvider: IdeModifiableModelsProvider,
hmppEnabled: Boolean
) {
val module = module
with(configuration.settings) {
compilerArguments = null
targetPlatform = null
compilerSettings = null
isHmppEnabled = hmppEnabled
initializeIfNeeded(
module,
modelsProvider.getModifiableRootModel(module),
@@ -183,7 +185,7 @@ fun KotlinFacet.configureFacet(
platform: IdePlatform<*, *>,
modelsProvider: IdeModifiableModelsProvider
) {
configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider)
configureFacet(compilerVersion, coroutineSupport, platform.toNewPlatform(), modelsProvider, false) //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)
facet.configureFacet(version, LanguageFeature.State.DISABLED, null, modelsProvider, false)
modelsProvider.commit()
}
}
@@ -350,7 +350,8 @@ public class ConfigureKotlinTest extends AbstractConfigureKotlinTest {
"1.1",
LanguageFeature.State.ENABLED,
platform,
modelsProvider
modelsProvider,
false
);
assertEquals(platform, facet.getConfiguration().getSettings().getTargetPlatform());
assertEquals(jvmTarget.getDescription(),