Kotlin Facet: Get rid of duplicating data in facet configuration

This commit is contained in:
Alexey Sedunov
2017-03-04 14:35:20 +03:00
parent 19ea18a340
commit 641a9a7153
36 changed files with 857 additions and 408 deletions
@@ -54,7 +54,7 @@ fun getLibraryLanguageLevel(
rootModel: ModuleRootModel?,
targetPlatform: TargetPlatformKind<*>?
): LanguageVersion {
val minVersion = getRuntimeLibraryVersions(module, rootModel, targetPlatform ?: TargetPlatformKind.Jvm[JvmTarget.JVM_1_8])
val minVersion = getRuntimeLibraryVersions(module, rootModel, targetPlatform ?: TargetPlatformKind.DEFAULT_PLATFORM)
.minWith(VersionComparatorUtil.COMPARATOR)
return getDefaultLanguageLevel(module, minVersion)
}
@@ -75,7 +75,7 @@ fun getDefaultLanguageLevel(
}
fun getRuntimeLibraryVersion(module: Module): String? {
val targetPlatform = KotlinFacetSettingsProvider.getInstance(module.project).getSettings(module).versionInfo.targetPlatformKind
val versions = getRuntimeLibraryVersions(module, null, targetPlatform ?: TargetPlatformKind.Jvm[JvmTarget.JVM_1_8])
val targetPlatform = KotlinFacetSettingsProvider.getInstance(module.project).getSettings(module).targetPlatformKind
val versions = getRuntimeLibraryVersions(module, null, targetPlatform ?: TargetPlatformKind.DEFAULT_PLATFORM)
return versions.toSet().singleOrNull()
}
@@ -47,7 +47,7 @@ fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
val languageLevel = getLibraryLanguageLevel(
this,
null,
KotlinFacetSettingsProvider.getInstance(project).getSettings(this).versionInfo.targetPlatformKind
KotlinFacetSettingsProvider.getInstance(project).getSettings(this).targetPlatformKind
)
// Preserve inferred version in facet/project settings
@@ -63,7 +63,7 @@ fun Module.getAndCacheLanguageLevelByDependencies(): LanguageVersion {
}
}
else {
with(facetSettings.versionInfo) {
with(facetSettings) {
if (this.languageLevel == null) {
this.languageLevel = languageLevel
}
@@ -101,14 +101,13 @@ val Module.languageVersionSettings: LanguageVersionSettings
get() {
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(this)
if (facetSettings.useProjectSettings) return project.getLanguageVersionSettings(this)
val versionInfo = facetSettings.versionInfo
val languageVersion = versionInfo.languageLevel ?: getAndCacheLanguageLevelByDependencies()
val apiVersion = versionInfo.apiLevel ?: languageVersion
val languageVersion = facetSettings.languageLevel ?: getAndCacheLanguageLevelByDependencies()
val apiVersion = facetSettings.apiLevel ?: languageVersion
val extraLanguageFeatures = getExtraLanguageFeatures(
versionInfo.targetPlatformKind ?: TargetPlatformKind.Common,
facetSettings.compilerInfo.coroutineSupport,
facetSettings.compilerInfo.compilerSettings,
facetSettings.targetPlatformKind ?: TargetPlatformKind.Common,
facetSettings.coroutineSupport,
facetSettings.compilerSettings,
this
)
@@ -116,7 +115,7 @@ val Module.languageVersionSettings: LanguageVersionSettings
}
val Module.targetPlatform: TargetPlatformKind<*>?
get() = KotlinFacetSettingsProvider.getInstance(project).getSettings(this).versionInfo.targetPlatformKind
get() = KotlinFacetSettingsProvider.getInstance(project).getSettings(this).targetPlatformKind
private val Module.implementsCommonModule: Boolean
get() = targetPlatform != TargetPlatformKind.Common
@@ -68,7 +68,7 @@ public class ProjectStructureUtil {
@Nullable
private static TargetPlatform getPlatformConfiguredInFacet(@NotNull Module module) {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(module.getProject()).getSettings(module);
TargetPlatformKind<?> kind = settings.getVersionInfo().getTargetPlatformKind();
TargetPlatformKind<?> kind = settings.getTargetPlatformKind();
if (kind instanceof TargetPlatformKind.Jvm) {
return JvmPlatform.INSTANCE;
}
@@ -19,11 +19,10 @@ package org.jetbrains.kotlin.config
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.util.xmlb.annotations.Property
import com.intellij.util.xmlb.annotations.Transient
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2MetadataCompilerArguments
import org.jetbrains.kotlin.utils.DescriptionAware
sealed class TargetPlatformKind<out Version : DescriptionAware>(
@@ -45,24 +44,12 @@ sealed class TargetPlatformKind<out Version : DescriptionAware>(
object Common : TargetPlatformKind<DescriptionAware.NoVersion>(DescriptionAware.NoVersion, "Common (experimental)")
companion object {
val ALL_PLATFORMS: List<TargetPlatformKind<*>> by lazy { Jvm.JVM_PLATFORMS + JavaScript + Common }
val DEFAULT_PLATFORM: TargetPlatformKind<*>
get() = Jvm[JvmTarget.DEFAULT]
}
}
data class KotlinVersionInfo(
var languageLevel: LanguageVersion? = null,
var apiLevel: LanguageVersion? = null,
@get:Transient var targetPlatformKind: TargetPlatformKind<*>? = null
) {
// To be serialized
var targetPlatformName: String
get() = targetPlatformKind?.description ?: ""
set(value) {
targetPlatformKind = TargetPlatformKind.ALL_PLATFORMS.firstOrNull { it.description == value }
}
}
enum class CoroutineSupport(
override val description: String,
val compilerArgument: String
@@ -90,38 +77,62 @@ enum class CoroutineSupport(
}
}
class KotlinCompilerInfo {
// To be serialized
@Property private var _commonCompilerArguments: CommonCompilerArguments.DummyImpl? = null
@get:Transient var commonCompilerArguments: CommonCompilerArguments?
get() = _commonCompilerArguments
set(value) {
_commonCompilerArguments = value as? CommonCompilerArguments.DummyImpl
}
var k2jsCompilerArguments: K2JSCompilerArguments? = null
var k2jvmCompilerArguments: K2JVMCompilerArguments? = null
var compilerSettings: CompilerSettings? = null
@get:Transient var coroutineSupport: CoroutineSupport
get() = CoroutineSupport.byCompilerArguments(commonCompilerArguments)
set(value) {
commonCompilerArguments?.coroutinesEnable = value == CoroutineSupport.ENABLED
commonCompilerArguments?.coroutinesWarn = value == CoroutineSupport.ENABLED_WITH_WARNING
commonCompilerArguments?.coroutinesError = value == CoroutineSupport.DISABLED
}
}
class KotlinFacetSettings {
companion object {
// Increment this when making serialization-incompatible changes to configuration data
val CURRENT_VERSION = 1
val CURRENT_VERSION = 2
val DEFAULT_VERSION = 0
}
var useProjectSettings: Boolean = true
var versionInfo = KotlinVersionInfo()
var compilerInfo = KotlinCompilerInfo()
var compilerArguments: CommonCompilerArguments? = null
var compilerSettings: CompilerSettings? = null
var languageLevel: LanguageVersion?
get() = compilerArguments?.languageVersion?.let { LanguageVersion.fromFullVersionString(it) }
set(value) {
compilerArguments!!.languageVersion = value?.versionString
}
var apiLevel: LanguageVersion?
get() = compilerArguments?.apiVersion?.let { LanguageVersion.fromFullVersionString(it) }
set(value) {
compilerArguments!!.apiVersion = value?.versionString
}
val targetPlatformKind: TargetPlatformKind<*>?
get() = compilerArguments?.let {
when (it) {
is K2JVMCompilerArguments -> {
val jvmTarget = it.jvmTarget ?: JvmTarget.DEFAULT.description
TargetPlatformKind.Jvm.JVM_PLATFORMS.firstOrNull { it.version.description >= jvmTarget }
}
is K2JSCompilerArguments -> TargetPlatformKind.JavaScript
is K2MetadataCompilerArguments -> TargetPlatformKind.Common
else -> null
}
}
var coroutineSupport: CoroutineSupport
get() = CoroutineSupport.byCompilerArguments(compilerArguments)
set(value) {
with(compilerArguments!!) {
coroutinesEnable = value == CoroutineSupport.ENABLED
coroutinesWarn = value == CoroutineSupport.ENABLED_WITH_WARNING
coroutinesError = value == CoroutineSupport.DISABLED
}
}
}
fun TargetPlatformKind<*>.createCompilerArguments(): CommonCompilerArguments {
return when (this) {
is TargetPlatformKind.Jvm -> {
K2JVMCompilerArguments().apply { jvmTarget = this@createCompilerArguments.version.description }
}
is TargetPlatformKind.JavaScript -> K2JSCompilerArguments()
is TargetPlatformKind.Common -> K2MetadataCompilerArguments()
}
}
interface KotlinFacetSettingsProvider {
@@ -150,7 +150,7 @@ class KotlinMavenImporter : MavenImporter(KOTLIN_PLUGIN_GROUP_ID, KOTLIN_PLUGIN_
val platform = detectPlatformByExecutions(mavenProject) ?: detectPlatformByLibraries(mavenProject)
kotlinFacet.configureFacet(compilerVersion, CoroutineSupport.DEFAULT, platform, modifiableModelsProvider)
val configuredPlatform = kotlinFacet.configuration.settings.versionInfo.targetPlatformKind!!
val configuredPlatform = kotlinFacet.configuration.settings.targetPlatformKind!!
val configuration = mavenPlugin.configurationElement
val sharedArguments = configuration?.let { getCompilerArgumentsByConfigurationElement(it, configuredPlatform) } ?: emptyList()
val executionArguments = mavenPlugin.executions?.filter { it.goals.any { it in compilationGoals } }
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.idea.maven
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.KotlinFacetSettings
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.facet.KotlinFacet
@@ -442,16 +444,16 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
assertImporterStatePresent()
with (facetSettings) {
Assert.assertEquals("1.1", versionInfo.languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerInfo.commonCompilerArguments!!.languageVersion)
Assert.assertEquals("1.0", versionInfo.apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerInfo.commonCompilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerInfo.commonCompilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", compilerInfo.coroutineSupport.compilerArgument)
Assert.assertEquals("JVM 1.8", versionInfo.targetPlatformKind!!.description)
Assert.assertEquals("1.8", compilerInfo.k2jvmCompilerArguments!!.jvmTarget)
Assert.assertEquals("1.1", languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerArguments!!.languageVersion)
Assert.assertEquals("1.0", apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
Assert.assertEquals("JVM 1.8", targetPlatformKind!!.description)
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
Assert.assertEquals("-cp foobar.jar -jdk-home JDK_HOME -Xmulti-platform",
compilerInfo.compilerSettings!!.additionalArguments)
compilerSettings!!.additionalArguments)
}
}
@@ -510,17 +512,19 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
assertImporterStatePresent()
with (facetSettings) {
Assert.assertEquals("1.1", versionInfo.languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerInfo.commonCompilerArguments!!.languageVersion)
Assert.assertEquals("1.0", versionInfo.apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerInfo.commonCompilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerInfo.commonCompilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", compilerInfo.coroutineSupport.compilerArgument)
Assert.assertTrue(versionInfo.targetPlatformKind is TargetPlatformKind.JavaScript)
Assert.assertEquals(true, compilerInfo.k2jsCompilerArguments!!.sourceMap)
Assert.assertEquals("commonjs", compilerInfo.k2jsCompilerArguments!!.moduleKind)
Assert.assertEquals("1.1", languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerArguments!!.languageVersion)
Assert.assertEquals("1.0", apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
Assert.assertTrue(targetPlatformKind is TargetPlatformKind.JavaScript)
with(compilerArguments as K2JSCompilerArguments) {
Assert.assertEquals(true, sourceMap)
Assert.assertEquals("commonjs", moduleKind)
}
Assert.assertEquals("-output test.js -meta-info -Xmulti-platform",
compilerInfo.compilerSettings!!.additionalArguments)
compilerSettings!!.additionalArguments)
}
}
@@ -580,16 +584,16 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
assertImporterStatePresent()
with (facetSettings) {
Assert.assertEquals("1.1", versionInfo.languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerInfo.commonCompilerArguments!!.languageVersion)
Assert.assertEquals("1.0", versionInfo.apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerInfo.commonCompilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerInfo.commonCompilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", compilerInfo.coroutineSupport.compilerArgument)
Assert.assertEquals("JVM 1.8", versionInfo.targetPlatformKind!!.description)
Assert.assertEquals("1.8", compilerInfo.k2jvmCompilerArguments!!.jvmTarget)
Assert.assertEquals("1.1", languageLevel!!.versionString)
Assert.assertEquals("1.1", compilerArguments!!.languageVersion)
Assert.assertEquals("1.0", apiLevel!!.versionString)
Assert.assertEquals("1.0", compilerArguments!!.apiVersion)
Assert.assertEquals(true, compilerArguments!!.suppressWarnings)
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
Assert.assertEquals("JVM 1.8", targetPlatformKind!!.description)
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
Assert.assertEquals("-cp foobar.jar -jdk-home JDK_HOME -Xmulti-platform",
compilerInfo.compilerSettings!!.additionalArguments)
compilerSettings!!.additionalArguments)
}
}
@@ -642,9 +646,9 @@ class KotlinMavenImporterTest : MavenImportingTestCase() {
assertImporterStatePresent()
with (facetSettings) {
Assert.assertEquals("JVM 1.8", versionInfo.targetPlatformKind!!.description)
Assert.assertEquals("1.8", compilerInfo.k2jvmCompilerArguments!!.jvmTarget)
Assert.assertEquals("enable", compilerInfo.coroutineSupport.compilerArgument)
Assert.assertEquals("JVM 1.8", targetPlatformKind!!.description)
Assert.assertEquals("1.8", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
Assert.assertEquals("enable", coroutineSupport.compilerArgument)
}
}
@@ -24,13 +24,14 @@ import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.idea.facet.KotlinFacetConfiguration
import org.jetbrains.kotlin.idea.facet.KotlinFacetType
import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
import org.jetbrains.kotlin.test.testFramework.runInEdtAndWait
import org.jetbrains.kotlin.test.testFramework.runWriteAction
class KotlinProjectDescriptorWithFacet(val languageVersion: LanguageVersion) : KotlinLightProjectDescriptor() {
override fun configureModule(module: Module, model: ModifiableRootModel, contentEntry: ContentEntry) {
configureKotlinFacet(module) { ->
settings.versionInfo.languageLevel = languageVersion
settings.languageLevel = languageVersion
}
}
@@ -43,6 +44,7 @@ fun configureKotlinFacet(module: Module, configureCallback: KotlinFacetConfigura
val facetManager = FacetManager.getInstance(module)
val facetModel = facetManager.createModifiableModel()
val configuration = KotlinFacetConfiguration()
configuration.settings.initializeIfNeeded(module, null)
configuration.settings.useProjectSettings = false
configuration.configureCallback()
val facet = facetManager.createFacet(KotlinFacetType.INSTANCE, "Kotlin", configuration, null)
@@ -110,11 +110,10 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
public KotlinCompilerConfigurableTab(
Project project,
CommonCompilerArguments commonCompilerArguments,
K2JSCompilerArguments k2jsCompilerArguments,
CompilerSettings compilerSettings,
@NotNull CommonCompilerArguments commonCompilerArguments,
@NotNull K2JSCompilerArguments k2jsCompilerArguments,
@NotNull K2JVMCompilerArguments k2jvmCompilerArguments, CompilerSettings compilerSettings,
@Nullable KotlinCompilerWorkspaceSettings compilerWorkspaceSettings,
@Nullable K2JVMCompilerArguments k2jvmCompilerArguments,
boolean isProjectSettings,
boolean isMultiEditor
) {
@@ -174,9 +173,9 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
this(project,
KotlinCommonCompilerArgumentsHolder.getInstance(project).getSettings(),
Kotlin2JsCompilerArgumentsHolder.getInstance(project).getSettings(),
Kotlin2JvmCompilerArgumentsHolder.getInstance(project).getSettings(),
KotlinCompilerSettings.getInstance(project).getSettings(),
ServiceManager.getService(project, KotlinCompilerWorkspaceSettings.class),
Kotlin2JvmCompilerArgumentsHolder.getInstance(project).getSettings(),
true,
false);
}
@@ -323,7 +322,8 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
isModified(outputPrefixFile, k2jsCompilerArguments.outputPrefix) ||
isModified(outputPostfixFile, k2jsCompilerArguments.outputPostfix) ||
!getSelectedModuleKind().equals(getModuleKindOrDefault(k2jsCompilerArguments.moduleKind)) ||
(k2jvmCompilerArguments != null && !getSelectedJvmVersion().equals(getJvmVersionOrDefault(k2jvmCompilerArguments.jvmTarget)));
!getSelectedJvmVersion().equals(getJvmVersionOrDefault(k2jvmCompilerArguments.jvmTarget));
}
@NotNull
@@ -395,9 +395,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
k2jsCompilerArguments.outputPostfix = StringUtil.nullize(outputPostfixFile.getText(), true);
k2jsCompilerArguments.moduleKind = getSelectedModuleKind();
if (k2jvmCompilerArguments != null) {
k2jvmCompilerArguments.jvmTarget = getSelectedJvmVersion();
}
k2jvmCompilerArguments.jvmTarget = getSelectedJvmVersion();
BuildManager.getInstance().clearState(project);
}
@@ -426,9 +424,7 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
moduleKindComboBox.setSelectedItem(getModuleKindOrDefault(k2jsCompilerArguments.moduleKind));
if (k2jvmCompilerArguments != null) {
jvmVersionComboBox.setSelectedItem(getJvmVersionOrDefault(k2jvmCompilerArguments.jvmTarget));
}
jvmVersionComboBox.setSelectedItem(getJvmVersionOrDefault(k2jvmCompilerArguments.jvmTarget));
}
@Override
@@ -511,4 +507,12 @@ public class KotlinCompilerConfigurableTab implements SearchableConfigurable, Co
isEnabled = value;
UIUtil.setEnabled(getContentPane(), value, true);
}
public K2JSCompilerArguments getK2jsCompilerArguments() {
return k2jsCompilerArguments;
}
public K2JVMCompilerArguments getK2jvmCompilerArguments() {
return k2jvmCompilerArguments;
}
}
@@ -24,12 +24,77 @@ import com.intellij.util.xmlb.SkipDefaultsSerializationFilter
import com.intellij.util.xmlb.XmlSerializer
import org.jdom.DataConversionException
import org.jdom.Element
import org.jetbrains.kotlin.config.KotlinFacetSettings
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.*
class KotlinFacetConfiguration : FacetConfiguration {
var settings = KotlinFacetSettings()
private set
private fun Element.getOption(name: String) = getChildren("option").firstOrNull { it.getAttribute("name").value == name }
private fun Element.getOptionValue(name: String) = getOption(name)?.getAttribute("value")?.value
private fun Element.getOptionBody(name: String) = getOption(name)?.children?.firstOrNull()
private fun readV1Config(element: Element) {
val useProjectSettings = element.getOptionValue("useProjectSettings")?.toBoolean()
val targetPlatformName = element.getOptionBody("versionInfo")?.getOptionValue("targetPlatformName")
val targetPlatform = TargetPlatformKind.ALL_PLATFORMS.firstOrNull { it.description == targetPlatformName }
?: TargetPlatformKind.Jvm.get(JvmTarget.DEFAULT)
val compilerInfoElement = element.getOptionBody("compilerInfo")
val compilerSettings = CompilerSettings().apply {
compilerInfoElement?.getOptionBody("compilerSettings")?.let { compilerSettingsElement ->
XmlSerializer.deserializeInto(this, compilerSettingsElement)
}
}
val commonArgumentsElement = compilerInfoElement?.getOptionBody("_commonCompilerArguments")
val jvmArgumentsElement = compilerInfoElement?.getOptionBody("k2jvmCompilerArguments")
val jsArgumentsElement = compilerInfoElement?.getOptionBody("k2jsCompilerArguments")
val compilerArguments = targetPlatform.createCompilerArguments()
commonArgumentsElement?.let { XmlSerializer.deserializeInto(compilerArguments, it) }
when (compilerArguments) {
is K2JVMCompilerArguments -> jvmArgumentsElement?.let { XmlSerializer.deserializeInto(compilerArguments, it) }
is K2JSCompilerArguments -> jsArgumentsElement?.let { XmlSerializer.deserializeInto(compilerArguments, it) }
}
if (useProjectSettings != null) {
settings.useProjectSettings = useProjectSettings
}
else {
// Migration problem workaround for pre-1.1-beta releases (mainly 1.0.6) -> 1.1-rc+
// Problematic cases: 1.1-beta/1.1-beta2 -> 1.1-rc+ (useProjectSettings gets reset to false)
// This heuristic detects old enough configurations:
if (jvmArgumentsElement == null) {
settings.useProjectSettings = false
}
}
settings.compilerSettings = compilerSettings
settings.compilerArguments = compilerArguments
}
private fun readV2Config(element: Element) {
element.getAttributeValue("useProjectSettings")?.let { settings.useProjectSettings = it.toBoolean() }
val platformName = element.getAttributeValue("platform")
val platformKind = TargetPlatformKind.ALL_PLATFORMS.firstOrNull { it.description == platformName } ?: TargetPlatformKind.DEFAULT_PLATFORM
element.getChild("compilerSettings")?.let {
settings.compilerSettings = CompilerSettings()
XmlSerializer.deserializeInto(settings.compilerSettings!!, it)
}
element.getChild("compilerArguments")?.let {
settings.compilerArguments = platformKind.createCompilerArguments()
XmlSerializer.deserializeInto(settings.compilerArguments!!, it)
}
}
@Suppress("OverridingDeprecatedMember")
override fun readExternal(element: Element) {
val version =
@@ -39,27 +104,36 @@ class KotlinFacetConfiguration : FacetConfiguration {
catch(e: DataConversionException) {
null
} ?: KotlinFacetSettings.DEFAULT_VERSION
// Reset facet configuration if versions don't match
if (version == KotlinFacetSettings.CURRENT_VERSION) {
XmlSerializer.deserializeInto(settings, element)
}
else {
settings = KotlinFacetSettings()
}
// Migration problem workaround for pre-1.1-beta releases (mainly 1.0.6) -> 1.1-rc+
// Problematic cases: 1.1-beta/1.1-beta2 -> 1.1-rc+ (useProjectSettings gets reset to false)
// This heuristic detects old enough configurations:
if (element.children.none { it.getAttribute("name").value == "useProjectSettings" }
&& settings.compilerInfo.k2jvmCompilerArguments == null) {
settings.useProjectSettings = false
when (version) {
1 -> readV1Config(element)
2 -> readV2Config(element)
else -> settings = KotlinFacetSettings() // Reset facet configuration if versions don't match
}
}
@Suppress("OverridingDeprecatedMember")
override fun writeExternal(element: Element) {
val filter = SkipDefaultsSerializationFilter()
element.setAttribute("version", KotlinFacetSettings.CURRENT_VERSION.toString())
XmlSerializer.serializeInto(settings, element, SkipDefaultsSerializationFilter())
settings.targetPlatformKind?.let {
element.setAttribute("platform", it.description)
}
if (!settings.useProjectSettings) {
element.setAttribute("useProjectSettings", settings.useProjectSettings.toString())
}
settings.compilerSettings?.let {
Element("compilerSettings").apply {
XmlSerializer.serializeInto(it, this, filter)
element.addContent(this)
}
}
settings.compilerArguments?.let {
Element("compilerArguments").apply {
XmlSerializer.serializeInto(it, this, filter)
element.addContent(this)
}
}
}
override fun createEditorTabs(
@@ -23,11 +23,10 @@ import com.intellij.openapi.project.Project
import com.intellij.ui.DocumentAdapter
import com.intellij.util.ui.FormBuilder
import com.intellij.util.ui.ThreeStateCheckBox
import org.jetbrains.kotlin.cli.common.arguments.CommonCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.cli.common.arguments.parseArguments
import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.config.*
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JsCompilerArgumentsHolder
import org.jetbrains.kotlin.idea.compiler.configuration.Kotlin2JvmCompilerArgumentsHolder
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerConfigurableTab
import java.awt.BorderLayout
import javax.swing.JComboBox
@@ -46,25 +45,36 @@ class KotlinFacetEditorGeneralTab(
) : JPanel(BorderLayout()) {
private val isMultiEditor = configuration == null
private val compilerInfo = configuration?.settings?.compilerInfo
?: KotlinCompilerInfo()
.apply {
commonCompilerArguments = object : CommonCompilerArguments() {}
k2jsCompilerArguments = K2JSCompilerArguments()
k2jvmCompilerArguments = K2JVMCompilerArguments()
compilerSettings = CompilerSettings()
}
val compilerConfigurable = with(compilerInfo) {
KotlinCompilerConfigurableTab(
project,
commonCompilerArguments,
k2jsCompilerArguments,
compilerSettings,
null,
k2jvmCompilerArguments,
false,
isMultiEditor
)
val compilerConfigurable = with(configuration?.settings) {
if (isMultiEditor) {
KotlinCompilerConfigurableTab(
project,
object : CommonCompilerArguments() {},
K2JSCompilerArguments(),
K2JVMCompilerArguments(),
CompilerSettings(),
null,
false,
true
)
}
else {
val compilerArguments = configuration!!.settings.compilerArguments!!
val k2jvmCompilerArguments = compilerArguments as? K2JVMCompilerArguments
?: copyBean(Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings)
val k2jsCompilerArguments = compilerArguments as? K2JSCompilerArguments
?: copyBean(Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings)
KotlinCompilerConfigurableTab(
project,
compilerArguments,
k2jsCompilerArguments,
k2jvmCompilerArguments,
configuration.settings.compilerSettings!!,
null,
false,
false
)
}
}
val useProjectSettingsCheckBox = ThreeStateCheckBox("Use project settings").apply { isThirdStateEnabled = isMultiEditor }
@@ -90,14 +100,6 @@ class KotlinFacetEditorGeneralTab(
targetPlatformComboBox.addActionListener {
updateCompilerConfigurable()
}
val commonCompilerArguments = compilerInfo.commonCompilerArguments
if (configuration != null && commonCompilerArguments != null) {
with(configuration.settings.versionInfo) {
commonCompilerArguments.languageVersion = languageLevel?.versionString
commonCompilerArguments.apiVersion = apiLevel?.versionString
}
}
}
internal fun updateCompilerConfigurable() {
@@ -128,7 +130,7 @@ class KotlinFacetEditorGeneralTab(
override fun check(): ValidationResult {
val selectedOption = editor.compilerConfigurable.coroutineSupportComboBox.selectedItem as? CoroutineSupport
?: return ValidationResult.OK
val parsedArguments = configuration.settings.compilerInfo.commonCompilerArguments?.javaClass?.newInstance()
val parsedArguments = configuration.settings.compilerArguments?.javaClass?.newInstance()
?: return ValidationResult.OK
parseArguments(
editor.compilerConfigurable.additionalArgsOptionsField.text.split(Regex("\\s")).toTypedArray(),
@@ -195,13 +197,13 @@ class KotlinFacetEditorGeneralTab(
override fun isModified(): Boolean {
if (editor.useProjectSettingsCheckBox.isSelected != configuration.settings.useProjectSettings) return true
if (editor.targetPlatformComboBox.selectedItem != configuration.settings.versionInfo.targetPlatformKind) return true
if (editor.targetPlatformComboBox.selectedItem != configuration.settings.targetPlatformKind) return true
return !editor.useProjectSettingsCheckBox.isSelected && editor.compilerConfigurable.isModified
}
override fun reset() {
editor.useProjectSettingsCheckBox.isSelected = configuration.settings.useProjectSettings
editor.targetPlatformComboBox.selectedItem = configuration.settings.versionInfo.targetPlatformKind
editor.targetPlatformComboBox.selectedItem = configuration.settings.targetPlatformKind
editor.compilerConfigurable.reset()
editor.updateCompilerConfigurable()
}
@@ -210,9 +212,21 @@ class KotlinFacetEditorGeneralTab(
editor.compilerConfigurable.apply()
with(configuration.settings) {
useProjectSettings = editor.useProjectSettingsCheckBox.isSelected
versionInfo.targetPlatformKind = editor.targetPlatformComboBox.selectedItem as TargetPlatformKind<*>?
versionInfo.languageLevel = LanguageVersion.fromVersionString(compilerInfo.commonCompilerArguments?.languageVersion)
versionInfo.apiLevel = LanguageVersion.fromVersionString(compilerInfo.commonCompilerArguments?.apiVersion)
(editor.targetPlatformComboBox.selectedItem as TargetPlatformKind<*>?)?.let {
if (it != targetPlatformKind) {
val newCompilerArguments = it.createCompilerArguments()
val platformArguments = when (it) {
is TargetPlatformKind.Jvm -> editor.compilerConfigurable.k2jvmCompilerArguments
is TargetPlatformKind.JavaScript -> editor.compilerConfigurable.k2jsCompilerArguments
else -> null
}
if (platformArguments != null) {
mergeBeans(platformArguments, newCompilerArguments)
}
copyInheritedFields(compilerArguments!!, newCompilerArguments)
compilerArguments = newCompilerArguments
}
}
}
}
@@ -18,11 +18,11 @@ package org.jetbrains.kotlin.idea.facet
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.JavaSdkVersion
import com.intellij.openapi.roots.ModuleRootManager
import com.intellij.openapi.roots.ModuleRootModel
import com.intellij.util.text.VersionComparatorUtil
import org.jetbrains.kotlin.cli.common.arguments.*
import org.jetbrains.kotlin.compilerRunner.ArgumentUtils
import org.jetbrains.kotlin.config.*
@@ -49,47 +49,47 @@ private fun getDefaultTargetPlatform(module: Module, rootModel: ModuleRootModel?
}
}
fun KotlinFacetSettings.initializeIfNeeded(module: Module, rootModel: ModuleRootModel?) {
fun KotlinFacetSettings.initializeIfNeeded(
module: Module,
rootModel: ModuleRootModel?,
platformKind: TargetPlatformKind<*>? = null // if null, detect by module dependencies
) {
val project = module.project
if (compilerSettings == null) {
compilerSettings = copyBean(KotlinCompilerSettings.getInstance(project).settings)
}
val commonArguments = KotlinCommonCompilerArgumentsHolder.getInstance(module.project).settings
with(versionInfo) {
if (targetPlatformKind == null) {
targetPlatformKind = getDefaultTargetPlatform(module, rootModel)
}
if (languageLevel == null) {
languageLevel = (if (useProjectSettings) LanguageVersion.fromVersionString(commonArguments.languageVersion) else null)
?: getDefaultLanguageLevel(module)
}
if (apiLevel == null) {
apiLevel = if (useProjectSettings) {
LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel
}
else {
languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind!!))
}
if (compilerArguments == null) {
val targetPlatformKind = platformKind ?: getDefaultTargetPlatform(module, rootModel)
compilerArguments = targetPlatformKind.createCompilerArguments().apply {
mergeBeans(commonArguments, this)
targetPlatformKind.getPlatformCompilerArgumentsByProject(module.project)?.let { mergeBeans(it, this) }
}
}
with(compilerInfo) {
if (commonCompilerArguments == null) {
commonCompilerArguments = copyBean(commonArguments)
}
if (languageLevel == null) {
languageLevel = (if (useProjectSettings) LanguageVersion.fromVersionString(commonArguments.languageVersion) else null)
?: getDefaultLanguageLevel(module)
}
if (compilerSettings == null) {
compilerSettings = copyBean(KotlinCompilerSettings.getInstance(project).settings)
if (apiLevel == null) {
apiLevel = if (useProjectSettings) {
LanguageVersion.fromVersionString(commonArguments.apiVersion) ?: languageLevel
}
else {
languageLevel!!.coerceAtMost(getLibraryLanguageLevel(module, rootModel, targetPlatformKind!!))
}
}
}
if (k2jsCompilerArguments == null) {
k2jsCompilerArguments = copyBean(Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings)
}
if (k2jvmCompilerArguments == null) {
k2jvmCompilerArguments = copyBean(Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings)
}
fun TargetPlatformKind<*>.getPlatformCompilerArgumentsByProject(project: Project): CommonCompilerArguments? {
return when (this) {
is TargetPlatformKind.Jvm -> Kotlin2JvmCompilerArgumentsHolder.getInstance(project).settings
is TargetPlatformKind.JavaScript -> Kotlin2JsCompilerArgumentsHolder.getInstance(project).settings
else -> null
}
}
@@ -118,19 +118,15 @@ fun KotlinFacet.configureFacet(
) {
val module = module
with(configuration.settings) {
versionInfo.targetPlatformKind = platformKind
versionInfo.apiLevel = null
initializeIfNeeded(module, modelsProvider.getModifiableRootModel(module))
with(versionInfo) {
languageLevel = LanguageVersion.fromFullVersionString(compilerVersion) ?: LanguageVersion.LATEST
// Both apiLevel and languageLevel should be initialized in the lines above
if (apiLevel!! > languageLevel!!) {
apiLevel = languageLevel
}
compilerArguments = null
compilerSettings = null
initializeIfNeeded(module, modelsProvider.getModifiableRootModel(module), platformKind)
languageLevel = LanguageVersion.fromFullVersionString(compilerVersion) ?: LanguageVersion.LATEST
// Both apiLevel and languageLevel should be initialized in the lines above
if (apiLevel!! > languageLevel!!) {
apiLevel = languageLevel
}
compilerInfo.coroutineSupport = coroutineSupport
compilerInfo.commonCompilerArguments?.languageVersion = versionInfo.languageLevel!!.versionString
compilerInfo.commonCompilerArguments?.apiVersion = versionInfo.apiLevel!!.versionString
this.coroutineSupport = coroutineSupport
}
}
@@ -160,46 +156,21 @@ fun parseCompilerArgumentsToFacet(arguments: List<String>, defaultArguments: Lis
val argumentArray = arguments.toTypedArray()
with(kotlinFacet.configuration.settings) {
// todo: merge common arguments with platform-specific ones in facet settings
val commonCompilerArguments = compilerInfo.commonCompilerArguments!!
val compilerArguments = when (versionInfo.targetPlatformKind) {
is TargetPlatformKind.Jvm -> compilerInfo.k2jvmCompilerArguments
is TargetPlatformKind.JavaScript -> compilerInfo.k2jsCompilerArguments
else -> commonCompilerArguments
}!!
val compilerArguments = this.compilerArguments ?: return
val defaultCompilerArguments = compilerArguments.javaClass.newInstance()
parseArguments(defaultArguments.toTypedArray(), defaultCompilerArguments, true)
val oldCoroutineSupport = CoroutineSupport.byCompilerArguments(commonCompilerArguments)
commonCompilerArguments.coroutinesEnable = false
commonCompilerArguments.coroutinesWarn = false
commonCompilerArguments.coroutinesError = false
if (compilerArguments != commonCompilerArguments) {
compilerArguments.coroutinesEnable = false
compilerArguments.coroutinesWarn = false
compilerArguments.coroutinesError = false
}
val oldCoroutineSupport = CoroutineSupport.byCompilerArguments(compilerArguments)
compilerArguments.coroutinesEnable = false
compilerArguments.coroutinesWarn = false
compilerArguments.coroutinesError = false
parseArguments(argumentArray, compilerArguments, true)
val restoreCoroutineSupport =
!compilerArguments.coroutinesEnable && !compilerArguments.coroutinesWarn && !compilerArguments.coroutinesError
compilerArguments.apiVersion?.let { versionInfo.apiLevel = LanguageVersion.fromVersionString(it) }
compilerArguments.languageVersion?.let { versionInfo.languageLevel = LanguageVersion.fromVersionString(it) }
if (versionInfo.targetPlatformKind is TargetPlatformKind.Jvm) {
val jvmTarget = compilerInfo.k2jvmCompilerArguments!!.jvmTarget
if (jvmTarget != null) {
versionInfo.targetPlatformKind = TargetPlatformKind.Jvm.JVM_PLATFORMS.firstOrNull {
VersionComparatorUtil.compare(it.version.description, jvmTarget) >= 0
} ?: TargetPlatformKind.Jvm.JVM_PLATFORMS.last()
}
}
// Retain only fields exposed in facet configuration editor.
// The rest is combined into string and stored in CompilerSettings.additionalArguments
@@ -211,17 +182,15 @@ fun parseCompilerArgumentsToFacet(arguments: List<String>, defaultArguments: Lis
copyFieldsSatisfying(compilerArguments, this, ::exposeAsAdditionalArgument)
ArgumentUtils.convertArgumentsToStringList(this).joinToString(separator = " ")
}
compilerInfo.compilerSettings!!.additionalArguments =
compilerSettings?.additionalArguments =
if (additionalArgumentsString.isNotEmpty()) additionalArgumentsString else CompilerSettings.DEFAULT_ADDITIONAL_ARGUMENTS
with(compilerArguments.javaClass.newInstance()) {
copyFieldsSatisfying(this, compilerArguments, ::exposeAsAdditionalArgument)
}
copyInheritedFields(compilerArguments, commonCompilerArguments)
if (restoreCoroutineSupport) {
compilerInfo.coroutineSupport = oldCoroutineSupport
coroutineSupport = oldCoroutineSupport
}
}
}
@@ -26,6 +26,7 @@ import com.intellij.openapi.roots.ex.ProjectRootManagerEx
import com.intellij.openapi.ui.Messages
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.Diagnostic
@@ -70,11 +71,11 @@ sealed class ChangeCoroutineSupportFix(
return
}
val facetSettings = KotlinFacet.get(module)?.configuration?.settings ?: return
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module)
ModuleRootModificationUtil.updateModel(module) {
facetSettings.compilerInfo.coroutineSupport = coroutineSupport
facetSettings.versionInfo.apiLevel = LanguageVersion.KOTLIN_1_1
facetSettings.versionInfo.languageLevel = LanguageVersion.KOTLIN_1_1
facetSettings.coroutineSupport = coroutineSupport
facetSettings.apiLevel = LanguageVersion.KOTLIN_1_1
facetSettings.languageLevel = LanguageVersion.KOTLIN_1_1
}
}
@@ -29,6 +29,7 @@ import com.intellij.openapi.roots.libraries.Library
import com.intellij.openapi.ui.Messages
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.ApiVersion
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.diagnostics.Diagnostic
@@ -64,8 +65,8 @@ sealed class EnableUnsupportedFeatureFix(
runtimeVersion < feature.sinceApiVersion
} ?: false
val facetSettings = KotlinFacet.get(module)?.configuration?.settings ?: return
val targetApiLevel = facetSettings.versionInfo.apiLevel?.let { apiLevel ->
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(module)
val targetApiLevel = facetSettings.apiLevel?.let { apiLevel ->
if (ApiVersion.createByLanguageVersion(apiLevel) < feature.sinceApiVersion)
feature.sinceApiVersion.versionString
else
@@ -97,7 +98,7 @@ sealed class EnableUnsupportedFeatureFix(
}
ModuleRootModificationUtil.updateModel(module) {
with(facetSettings.versionInfo) {
with(facetSettings) {
if (!apiVersionOnly) {
languageLevel = targetVersion
}
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="1">
<option name="compilerInfo">
<KotlinCompilerInfo>
<option name="compilerSettings">
<CompilerSettings>
<option name="additionalArguments" value="-version -meta-info" />
</CompilerSettings>
</option>
<option name="k2jsCompilerArguments">
<K2JSCompilerArguments>
<option name="moduleKind" value="amd" />
</K2JSCompilerArguments>
</option>
<option name="k2jvmCompilerArguments">
<K2JVMCompilerArguments>
<option name="jvmTarget" value="1.7" />
</K2JVMCompilerArguments>
</option>
<option name="_commonCompilerArguments">
<DummyImpl>
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.0" />
<option name="coroutinesWarn" value="true" />
</DummyImpl>
</option>
</KotlinCompilerInfo>
</option>
<option name="useProjectSettings" value="false" />
<option name="versionInfo">
<KotlinVersionInfo>
<option name="apiLevel" value="1.0" />
<option name="languageLevel" value="1.1" />
<option name="targetPlatformName" value="JavaScript " />
</KotlinVersionInfo>
</option>
</configuration>
</facet>
</component>
</module>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
<component name="CopyrightManager" default="" />
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/module.iml" filepath="$PROJECT_DIR$/module.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="libraryTable">
<library name="KotlinJavaRuntime (2)">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../mockRuntime11/kotlin-runtime.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
</SOURCES>
</library>
</component>
</project>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="2" platform="JavaScript " useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-version -meta-info" />
</compilerSettings>
<compilerArguments>
<option name="moduleKind" value="amd" />
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.0" />
<option name="coroutinesWarn" value="true" />
</compilerArguments>
</configuration>
</facet>
</component>
</module>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
<component name="CopyrightManager" default="" />
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/module.iml" filepath="$PROJECT_DIR$/module.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="libraryTable">
<library name="KotlinJavaRuntime (2)">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../mockRuntime11/kotlin-runtime.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
</SOURCES>
</library>
</component>
</project>
@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinJavaRuntime (2)" level="project" />
</component>
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="1">
<option name="compilerInfo">
<KotlinCompilerInfo>
<option name="compilerSettings">
<CompilerSettings>
<option name="additionalArguments" value="-version -Xallow-kotlin-package -Xskip-metadata-version-check" />
</CompilerSettings>
</option>
<option name="k2jsCompilerArguments">
<K2JSCompilerArguments>
<option name="moduleKind" value="plain" />
</K2JSCompilerArguments>
</option>
<option name="k2jvmCompilerArguments">
<K2JVMCompilerArguments>
<option name="jvmTarget" value="1.7" />
</K2JVMCompilerArguments>
</option>
<option name="_commonCompilerArguments">
<DummyImpl>
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.0" />
<option name="coroutinesWarn" value="true" />
</DummyImpl>
</option>
</KotlinCompilerInfo>
</option>
<option name="useProjectSettings" value="false" />
<option name="versionInfo">
<KotlinVersionInfo>
<option name="apiLevel" value="1.0" />
<option name="languageLevel" value="1.1" />
<option name="targetPlatformName" value="JVM 1.8" />
</KotlinVersionInfo>
</option>
</configuration>
</facet>
</component>
</module>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
<component name="CopyrightManager" default="" />
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/module.iml" filepath="$PROJECT_DIR$/module.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="libraryTable">
<library name="KotlinJavaRuntime (2)">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../mockRuntime11/kotlin-runtime.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
</SOURCES>
</library>
</component>
</project>
@@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="KotlinJavaRuntime (2)" level="project" />
</component>
<component name="FacetManager">
<facet type="kotlin-language" name="Kotlin">
<configuration version="2" platform="JVM 1.8" useProjectSettings="false">
<compilerSettings>
<option name="additionalArguments" value="-version -Xallow-kotlin-package -Xskip-metadata-version-check" />
</compilerSettings>
<compilerArguments>
<option name="jvmTarget" value="1.7" />
<option name="languageVersion" value="1.1" />
<option name="apiVersion" value="1.0" />
<option name="coroutinesWarn" value="true" />
</compilerArguments>
</configuration>
</facet>
</component>
</module>
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<resourceExtensions />
<wildcardResourcePatterns>
<entry name="!?*.java" />
<entry name="!?*.form" />
<entry name="!?*.class" />
<entry name="!?*.groovy" />
<entry name="!?*.scala" />
<entry name="!?*.flex" />
<entry name="!?*.kt" />
<entry name="!?*.clj" />
<entry name="!?*.aj" />
</wildcardResourcePatterns>
<annotationProcessing>
<profile default="true" name="Default" enabled="false">
<processorPath useClasspath="true" />
</profile>
</annotationProcessing>
</component>
<component name="CopyrightManager" default="" />
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/module.iml" filepath="$PROJECT_DIR$/module.iml" />
</modules>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" assert-keyword="true" jdk-15="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="libraryTable">
<library name="KotlinJavaRuntime (2)">
<CLASSES>
<root url="jar://$PROJECT_DIR$/../mockRuntime11/kotlin-runtime.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES>
</SOURCES>
</library>
</component>
</project>
@@ -63,10 +63,10 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformBasic() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -75,10 +75,10 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformClass() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -87,15 +87,15 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformNotImplementedForBoth() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
val js = module("js")
js.setPlatformKind(TargetPlatformKind.JavaScript)
js.createFacet(TargetPlatformKind.JavaScript)
js.enableMultiPlatform()
js.addDependency(header)
@@ -104,10 +104,10 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformPartiallyImplemented() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -116,10 +116,10 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformFunctionProperty() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -128,10 +128,10 @@ class MultiModuleHighlightingTest : AbstractMultiModuleHighlightingTest() {
fun testPlatformSuppress() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -22,10 +22,10 @@ import org.jetbrains.kotlin.config.TargetPlatformKind
class MultiModuleLineMarkerTest : AbstractMultiModuleLineMarkerTest() {
fun testFromCommonToJvmHeader() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -34,10 +34,10 @@ class MultiModuleLineMarkerTest : AbstractMultiModuleLineMarkerTest() {
fun testFromCommonToJvmImpl() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -46,10 +46,10 @@ class MultiModuleLineMarkerTest : AbstractMultiModuleLineMarkerTest() {
fun testFromClassToAlias() {
val header = module("header")
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module("jvm")
jvm.setPlatformKind(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.createFacet(TargetPlatformKind.Jvm[JvmTarget.JVM_1_6])
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -16,6 +16,7 @@
package org.jetbrains.kotlin.idea.codeInsight.gradle
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments
import org.jetbrains.kotlin.config.CoroutineSupport
import org.jetbrains.kotlin.config.JvmTarget
import org.jetbrains.kotlin.config.KotlinFacetSettings
@@ -62,12 +63,12 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
Assert.assertEquals("1.1", versionInfo.languageLevel!!.versionString)
Assert.assertEquals("1.1", versionInfo.apiLevel!!.versionString)
Assert.assertEquals(TargetPlatformKind.Jvm[JvmTarget.JVM_1_8], versionInfo.targetPlatformKind)
Assert.assertEquals("1.7", compilerInfo.k2jvmCompilerArguments!!.jvmTarget)
Assert.assertEquals("1.1", languageLevel!!.versionString)
Assert.assertEquals("1.1", apiLevel!!.versionString)
Assert.assertEquals(TargetPlatformKind.Jvm[JvmTarget.JVM_1_8], targetPlatformKind)
Assert.assertEquals("1.7", (compilerArguments as K2JVMCompilerArguments).jvmTarget)
Assert.assertEquals("-no-stdlib -no-reflect -module-name project_main -Xdump-declarations-to tmp -Xsingle-module -Xadd-compiler-builtins",
compilerInfo.compilerSettings!!.additionalArguments)
compilerSettings!!.additionalArguments)
}
}
@@ -105,7 +106,7 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
Assert.assertEquals(CoroutineSupport.ENABLED, compilerInfo.coroutineSupport)
Assert.assertEquals(CoroutineSupport.ENABLED, coroutineSupport)
}
}
@@ -144,16 +145,16 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
compilerInfo.k2jvmCompilerArguments!!.coroutinesEnable = true
compilerInfo.k2jvmCompilerArguments!!.coroutinesWarn = true
compilerInfo.k2jvmCompilerArguments!!.coroutinesError = true
compilerArguments!!.coroutinesEnable = true
compilerArguments!!.coroutinesWarn = true
compilerArguments!!.coroutinesError = true
importProject()
Assert.assertEquals(CoroutineSupport.ENABLED, compilerInfo.coroutineSupport)
Assert.assertEquals(true, compilerInfo.k2jvmCompilerArguments!!.coroutinesEnable)
Assert.assertEquals(false, compilerInfo.k2jvmCompilerArguments!!.coroutinesWarn)
Assert.assertEquals(false, compilerInfo.k2jvmCompilerArguments!!.coroutinesError)
Assert.assertEquals(CoroutineSupport.ENABLED, coroutineSupport)
Assert.assertEquals(true, compilerArguments!!.coroutinesEnable)
Assert.assertEquals(false, compilerArguments!!.coroutinesWarn)
Assert.assertEquals(false, compilerArguments!!.coroutinesError)
}
}
@@ -186,7 +187,7 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
Assert.assertEquals(CoroutineSupport.ENABLED, compilerInfo.coroutineSupport)
Assert.assertEquals(CoroutineSupport.ENABLED, coroutineSupport)
}
}
@@ -261,7 +262,7 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
Assert.assertEquals(TargetPlatformKind.JavaScript, versionInfo.targetPlatformKind)
Assert.assertEquals(TargetPlatformKind.JavaScript, targetPlatformKind)
}
}
@@ -293,9 +294,9 @@ class GradleFacetImportTest : GradleImportingTestCase() {
importProject()
with (facetSettings) {
Assert.assertEquals("1.1", versionInfo.languageLevel!!.versionString)
Assert.assertEquals("1.1", versionInfo.apiLevel!!.versionString)
Assert.assertEquals(TargetPlatformKind.Common, versionInfo.targetPlatformKind)
Assert.assertEquals("1.1", languageLevel!!.versionString)
Assert.assertEquals("1.1", apiLevel!!.versionString)
Assert.assertEquals(TargetPlatformKind.Common, targetPlatformKind)
}
}
}
@@ -24,7 +24,9 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
import com.intellij.testFramework.PlatformTestCase;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.config.LanguageVersion;
import org.jetbrains.kotlin.cli.common.arguments.K2JSCompilerArguments;
import org.jetbrains.kotlin.cli.common.arguments.K2JVMCompilerArguments;
import org.jetbrains.kotlin.config.*;
import org.jetbrains.kotlin.idea.project.PlatformKt;
import org.jetbrains.kotlin.utils.PathUtil;
@@ -38,16 +40,13 @@ import static org.jetbrains.kotlin.idea.configuration.KotlinWithLibraryConfigura
public class ConfigureKotlinTest extends PlatformTestCase {
private static final String BASE_PATH = "idea/testData/configuration/";
private static final String TEMP_DIR_MACRO_KEY = "TEMP_TEST_DIR";
private static final KotlinJavaModuleConfigurator JAVA_CONFIGURATOR = new KotlinJavaModuleConfigurator() {
@Override
protected String getDefaultPathToJarFile(@NotNull Project project) {
return getPathRelativeToTemp("default_jvm_lib");
}
};
private static final String TEMP_DIR_MACRO_KEY = "TEMP_TEST_DIR";
private static final KotlinJsModuleConfigurator JS_CONFIGURATOR = new KotlinJsModuleConfigurator() {
@Override
protected String getDefaultPathToJarFile(@NotNull Project project) {
@@ -55,6 +54,98 @@ public class ConfigureKotlinTest extends PlatformTestCase {
}
};
private static void configure(
@NotNull List<Module> modules,
@NotNull FileState runtimeState,
@NotNull LibraryState libraryState,
@NotNull KotlinWithLibraryConfigurator configurator,
@NotNull String jarFromDist,
@NotNull String jarFromTemp
) {
Project project = modules.iterator().next().getProject();
NotificationMessageCollector collector = NotificationMessageCollectorKt.createConfigureKotlinNotificationCollector(project);
for (Module module : modules) {
String pathToJar = getPathToJar(runtimeState, jarFromDist, jarFromTemp);
configurator.configureModuleWithLibraryClasses(module, libraryState, runtimeState, pathToJar, collector);
}
collector.showNotification();
}
@NotNull
private static String getPathToJar(@NotNull FileState runtimeState, @NotNull String jarFromDist, @NotNull String jarFromTemp) {
switch (runtimeState) {
case EXISTS:
return jarFromDist;
case COPY:
return jarFromTemp;
case DO_NOT_COPY:
return jarFromDist;
}
return jarFromDist;
}
private static void configure(@NotNull Module module, @NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinProjectConfigurator configurator) {
if (configurator instanceof KotlinJavaModuleConfigurator) {
configure(Collections.singletonList(module), jarState, libraryState,
(KotlinWithLibraryConfigurator) configurator,
getPathToExistentRuntimeJar(), getPathToNonexistentRuntimeJar());
}
if (configurator instanceof KotlinJsModuleConfigurator) {
configure(Collections.singletonList(module), jarState, libraryState,
(KotlinWithLibraryConfigurator) configurator,
getPathToExistentJsJar(), getPathToNonexistentJsJar());
}
}
private static String getPathToNonexistentRuntimeJar() {
String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.KOTLIN_JAVA_RUNTIME_JAR;
myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar));
return pathToTempKotlinRuntimeJar;
}
private static String getPathToNonexistentJsJar() {
String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.JS_LIB_JAR_NAME;
myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar));
return pathToTempKotlinRuntimeJar;
}
private static String getPathToExistentRuntimeJar() {
return PathUtil.getKotlinPathsForDistDirectory().getRuntimePath().getParent();
}
private static String getPathToExistentJsJar() {
return PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getParent();
}
private static void assertNotConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertFalse(
String.format("Module %s should not be configured as %s Module", module.getName(), configurator.getPresentableText()),
configurator.isConfigured(module));
}
private static void assertConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertTrue(String.format("Module %s should be configured with configurator '%s'", module.getName(),
configurator.getPresentableText()),
configurator.isConfigured(module));
}
private static void assertProperlyConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertConfigured(module, configurator);
assertNotConfigured(module, getOppositeConfigurator(configurator));
}
private static KotlinWithLibraryConfigurator getOppositeConfigurator(KotlinWithLibraryConfigurator configurator) {
if (configurator == JAVA_CONFIGURATOR) return JS_CONFIGURATOR;
if (configurator == JS_CONFIGURATOR) return JAVA_CONFIGURATOR;
throw new IllegalArgumentException("Only JS_CONFIGURATOR and JAVA_CONFIGURATOR are supported");
}
private static String getPathRelativeToTemp(String relativePath) {
String tempPath = PathMacros.getInstance().getValue(TEMP_DIR_MACRO_KEY);
return tempPath + '/' + relativePath;
}
@Override
protected void tearDown() throws Exception {
PathMacros.getInstance().removeMacro(TEMP_DIR_MACRO_KEY);
@@ -195,6 +286,66 @@ public class ConfigureKotlinTest extends PlatformTestCase {
assertEquals(LanguageVersion.KOTLIN_1_0, PlatformKt.getLanguageVersionSettings(getModule()).getLanguageVersion());
}
@SuppressWarnings("ConstantConditions")
public void testJvmProjectWithV1FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getSettings(getModule());
K2JVMCompilerArguments arguments = (K2JVMCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.Jvm.Companion.get(JvmTarget.JVM_1_8), settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals("warn", CoroutineSupport.byCompilerArguments(arguments).getCompilerArgument());
assertEquals("1.7", arguments.jvmTarget);
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJsProjectWithV1FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getSettings(getModule());
K2JSCompilerArguments arguments = (K2JSCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.JavaScript.INSTANCE, settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals("warn", CoroutineSupport.byCompilerArguments(arguments).getCompilerArgument());
assertEquals("amd", arguments.moduleKind);
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJvmProjectWithV2FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getSettings(getModule());
K2JVMCompilerArguments arguments = (K2JVMCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.Jvm.Companion.get(JvmTarget.JVM_1_8), settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals("warn", CoroutineSupport.byCompilerArguments(arguments).getCompilerArgument());
assertEquals("1.7", arguments.jvmTarget);
assertEquals("-version -Xallow-kotlin-package -Xskip-metadata-version-check", settings.getCompilerSettings().additionalArguments);
}
@SuppressWarnings("ConstantConditions")
public void testJsProjectWithV2FacetConfig() {
KotlinFacetSettings settings = KotlinFacetSettingsProvider.Companion.getInstance(myProject).getSettings(getModule());
K2JSCompilerArguments arguments = (K2JSCompilerArguments) settings.getCompilerArguments();
assertEquals(false, settings.getUseProjectSettings());
assertEquals("1.1", settings.getLanguageLevel().getDescription());
assertEquals("1.0", settings.getApiLevel().getDescription());
assertEquals(TargetPlatformKind.JavaScript.INSTANCE, settings.getTargetPlatformKind());
assertEquals("1.1", arguments.languageVersion);
assertEquals("1.0", arguments.apiVersion);
assertEquals("warn", CoroutineSupport.byCompilerArguments(arguments).getCompilerArgument());
assertEquals("amd", arguments.moduleKind);
assertEquals("-version -meta-info", settings.getCompilerSettings().additionalArguments);
}
private void doTestConfigureModulesWithNonDefaultSetup(KotlinWithLibraryConfigurator configurator) {
assertNoFilesInDefaultPaths();
@@ -229,69 +380,6 @@ public class ConfigureKotlinTest extends PlatformTestCase {
assertProperlyConfigured(module, configurator);
}
private static void configure(
@NotNull List<Module> modules,
@NotNull FileState runtimeState,
@NotNull LibraryState libraryState,
@NotNull KotlinWithLibraryConfigurator configurator,
@NotNull String jarFromDist,
@NotNull String jarFromTemp
) {
Project project = modules.iterator().next().getProject();
NotificationMessageCollector collector = NotificationMessageCollectorKt.createConfigureKotlinNotificationCollector(project);
for (Module module : modules) {
String pathToJar = getPathToJar(runtimeState, jarFromDist, jarFromTemp);
configurator.configureModuleWithLibraryClasses(module, libraryState, runtimeState, pathToJar, collector);
}
collector.showNotification();
}
@NotNull
private static String getPathToJar(@NotNull FileState runtimeState, @NotNull String jarFromDist, @NotNull String jarFromTemp) {
switch (runtimeState) {
case EXISTS:
return jarFromDist;
case COPY:
return jarFromTemp;
case DO_NOT_COPY:
return jarFromDist;
}
return jarFromDist;
}
private static void configure(@NotNull Module module, @NotNull FileState jarState, @NotNull LibraryState libraryState, @NotNull KotlinProjectConfigurator configurator) {
if (configurator instanceof KotlinJavaModuleConfigurator) {
configure(Collections.singletonList(module), jarState, libraryState,
(KotlinWithLibraryConfigurator) configurator,
getPathToExistentRuntimeJar(), getPathToNonexistentRuntimeJar());
}
if (configurator instanceof KotlinJsModuleConfigurator) {
configure(Collections.singletonList(module), jarState, libraryState,
(KotlinWithLibraryConfigurator) configurator,
getPathToExistentJsJar(), getPathToNonexistentJsJar());
}
}
private static String getPathToNonexistentRuntimeJar() {
String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.KOTLIN_JAVA_RUNTIME_JAR;
myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar));
return pathToTempKotlinRuntimeJar;
}
private static String getPathToNonexistentJsJar() {
String pathToTempKotlinRuntimeJar = FileUtil.getTempDirectory() + "/" + PathUtil.JS_LIB_JAR_NAME;
myFilesToDelete.add(new File(pathToTempKotlinRuntimeJar));
return pathToTempKotlinRuntimeJar;
}
private static String getPathToExistentRuntimeJar() {
return PathUtil.getKotlinPathsForDistDirectory().getRuntimePath().getParent();
}
private static String getPathToExistentJsJar() {
return PathUtil.getKotlinPathsForDistDirectory().getJsStdLibJarPath().getParent();
}
@Override
public Module getModule() {
Module[] modules = ModuleManager.getInstance(myProject).getModules();
@@ -333,33 +421,4 @@ public class ConfigureKotlinTest extends PlatformTestCase {
assertDoesntExist(new File(JAVA_CONFIGURATOR.getDefaultPathToJarFile(getProject())));
assertDoesntExist(new File(JS_CONFIGURATOR.getDefaultPathToJarFile(getProject())));
}
private static void assertNotConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertFalse(
String.format("Module %s should not be configured as %s Module", module.getName(), configurator.getPresentableText()),
configurator.isConfigured(module));
}
private static void assertConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertTrue(String.format("Module %s should be configured with configurator '%s'", module.getName(),
configurator.getPresentableText()),
configurator.isConfigured(module));
}
private static void assertProperlyConfigured(Module module, KotlinWithLibraryConfigurator configurator) {
assertConfigured(module, configurator);
assertNotConfigured(module, getOppositeConfigurator(configurator));
}
private static KotlinWithLibraryConfigurator getOppositeConfigurator(KotlinWithLibraryConfigurator configurator) {
if (configurator == JAVA_CONFIGURATOR) return JS_CONFIGURATOR;
if (configurator == JS_CONFIGURATOR) return JAVA_CONFIGURATOR;
throw new IllegalArgumentException("Only JS_CONFIGURATOR and JAVA_CONFIGURATOR are supported");
}
private static String getPathRelativeToTemp(String relativePath) {
String tempPath = PathMacros.getInstance().getValue(TEMP_DIR_MACRO_KEY);
return tempPath + '/' + relativePath;
}
}
@@ -68,9 +68,9 @@ class LanguageFeatureQuickFixTest : LightPlatformCodeInsightFixtureTestCase() {
resetProjectSettings(LanguageVersion.KOTLIN_1_1)
myFixture.configureByText("foo.kt", "suspend fun foo()")
assertEquals(CoroutineSupport.ENABLED_WITH_WARNING, facet.configuration.settings.compilerInfo.coroutineSupport)
assertEquals(CoroutineSupport.ENABLED_WITH_WARNING, facet.configuration.settings.coroutineSupport)
myFixture.launchAction(myFixture.findSingleIntention("Enable coroutine support in the current module"))
assertEquals(CoroutineSupport.ENABLED, facet.configuration.settings.compilerInfo.coroutineSupport)
assertEquals(CoroutineSupport.ENABLED, facet.configuration.settings.coroutineSupport)
}
fun testEnableCoroutines_UpdateRuntime() {
@@ -99,8 +99,8 @@ class LanguageFeatureQuickFixTest : LightPlatformCodeInsightFixtureTestCase() {
configureRuntime("mockRuntime11")
resetProjectSettings(LanguageVersion.KOTLIN_1_0)
configureKotlinFacet(myModule) {
settings.versionInfo.languageLevel = LanguageVersion.KOTLIN_1_0
settings.versionInfo.apiLevel = LanguageVersion.KOTLIN_1_0
settings.languageLevel = LanguageVersion.KOTLIN_1_0
settings.apiLevel = LanguageVersion.KOTLIN_1_0
}
myFixture.configureByText("foo.kt", "val x get() = 1")
@@ -137,8 +137,8 @@ class LanguageFeatureQuickFixTest : LightPlatformCodeInsightFixtureTestCase() {
val runtime = configureRuntime("mockRuntime106")
resetProjectSettings(LanguageVersion.KOTLIN_1_0)
configureKotlinFacet(myModule) {
settings.versionInfo.languageLevel = LanguageVersion.KOTLIN_1_0
settings.versionInfo.apiLevel = LanguageVersion.KOTLIN_1_0
settings.languageLevel = LanguageVersion.KOTLIN_1_0
settings.apiLevel = LanguageVersion.KOTLIN_1_0
}
myFixture.configureByText("foo.kt", "val x = <caret>\"s\"::length")
@@ -26,10 +26,10 @@ class QuickFixMultiModuleTest : AbstractQuickFixMultiModuleTest() {
implName: String = "jvm",
implKind: TargetPlatformKind<*> = TargetPlatformKind.Jvm[JvmTarget.JVM_1_6]) {
val header = module(headerName)
header.setPlatformKind(TargetPlatformKind.Common)
header.createFacet(TargetPlatformKind.Common)
val jvm = module(implName)
jvm.setPlatformKind(implKind)
jvm.createFacet(implKind)
jvm.enableMultiPlatform()
jvm.addDependency(header)
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.config.CompilerSettings
import org.jetbrains.kotlin.config.KotlinFacetSettingsProvider
import org.jetbrains.kotlin.config.TargetPlatformKind
import org.jetbrains.kotlin.idea.facet.getOrCreateFacet
import org.jetbrains.kotlin.idea.facet.initializeIfNeeded
import org.jetbrains.kotlin.idea.test.ConfigLibraryUtil
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
import java.io.File
@@ -74,11 +75,15 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
exported: Boolean = false
) = ModuleRootModificationUtil.addDependency(this, other, dependencyScope, exported)
private fun Module.createFacet() {
protected fun Module.createFacet(platformKind: TargetPlatformKind<*>? = null) {
val accessToken = WriteAction.start()
try {
val modelsProvider = IdeModifiableModelsProviderImpl(project)
getOrCreateFacet(modelsProvider, true)
getOrCreateFacet(modelsProvider, true).configuration.settings.initializeIfNeeded(
this,
modelsProvider.getModifiableRootModel(this),
platformKind
)
modelsProvider.commit()
}
finally {
@@ -86,20 +91,12 @@ abstract class AbstractMultiModuleTest : DaemonAnalyzerTestCase() {
}
}
protected fun Module.setPlatformKind(platformKind: TargetPlatformKind<*>) {
createFacet()
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(this)
val versionInfo = facetSettings.versionInfo
versionInfo.targetPlatformKind = platformKind
}
protected fun Module.enableMultiPlatform() {
createFacet()
val facetSettings = KotlinFacetSettingsProvider.getInstance(project).getSettings(this)
val compilerInfo = facetSettings.compilerInfo
val compilerSettings = CompilerSettings()
compilerSettings.additionalArguments += " -$multiPlatformArg"
compilerInfo.compilerSettings = compilerSettings
facetSettings.compilerSettings = compilerSettings
}
companion object {
@@ -66,11 +66,8 @@ class JpsKotlinCompilerSettings : JpsElementBase<JpsKotlinCompilerSettings>() {
val defaultArguments = getSettings(module.project).commonCompilerArguments
val facetSettings = module.kotlinFacetExtension?.settings ?: return defaultArguments
if (facetSettings.useProjectSettings) return defaultArguments
val (languageLevel, apiLevel) = facetSettings.versionInfo
val facetArguments = facetSettings.compilerInfo.commonCompilerArguments ?: return defaultArguments
val facetArguments = facetSettings.compilerArguments ?: return defaultArguments
return copyBean(facetArguments).apply {
languageVersion = languageLevel?.description
apiVersion = apiLevel?.description
multiPlatform = module
.dependenciesList
.dependencies
@@ -86,11 +83,7 @@ class JpsKotlinCompilerSettings : JpsElementBase<JpsKotlinCompilerSettings>() {
val defaultArguments = getSettings(module.project).k2JvmCompilerArguments
val facetSettings = module.kotlinFacetExtension?.settings ?: return defaultArguments
if (facetSettings.useProjectSettings) return defaultArguments
val targetPlatform = facetSettings.versionInfo.targetPlatformKind as? TargetPlatformKind.Jvm ?: return defaultArguments
val arguments = facetSettings.compilerInfo.k2jvmCompilerArguments ?: defaultArguments
return copyBean(arguments).apply {
jvmTarget = targetPlatform.version.description
}
return facetSettings.compilerArguments as? K2JVMCompilerArguments ?: defaultArguments
}
fun setK2JvmCompilerArguments(project: JpsProject, k2JvmCompilerArguments: K2JVMCompilerArguments) {
@@ -101,7 +94,7 @@ class JpsKotlinCompilerSettings : JpsElementBase<JpsKotlinCompilerSettings>() {
val defaultArguments = getSettings(module.project).k2JsCompilerArguments
val facetSettings = module.kotlinFacetExtension?.settings ?: return defaultArguments
if (facetSettings.useProjectSettings) return defaultArguments
return facetSettings.compilerInfo.k2jsCompilerArguments ?: defaultArguments
return facetSettings.compilerArguments as? K2JSCompilerArguments ?: defaultArguments
}
fun setK2JsCompilerArguments(project: JpsProject, k2JsCompilerArguments: K2JSCompilerArguments) {
@@ -112,7 +105,7 @@ class JpsKotlinCompilerSettings : JpsElementBase<JpsKotlinCompilerSettings>() {
val defaultSettings = getSettings(module.project).compilerSettings
val facetSettings = module.kotlinFacetExtension?.settings ?: return defaultSettings
if (facetSettings.useProjectSettings) return defaultSettings
return facetSettings.compilerInfo.compilerSettings ?: defaultSettings
return facetSettings.compilerSettings ?: defaultSettings
}
fun setCompilerSettings(project: JpsProject, compilerSettings: CompilerSettings) {
@@ -122,4 +115,4 @@ class JpsKotlinCompilerSettings : JpsElementBase<JpsKotlinCompilerSettings>() {
}
val JpsModule.targetPlatform: TargetPlatformKind<*>?
get() = kotlinFacetExtension?.settings?.versionInfo?.targetPlatformKind
get() = kotlinFacetExtension?.settings?.targetPlatformKind
@@ -50,7 +50,7 @@ class IdeAllOpenDeclarationAttributeAltererExtension(val project: Project) : Abs
return cache.value.getOrPut(module) {
val kotlinFacet = KotlinFacet.get(module) ?: return@getOrPut emptyList()
val commonArgs = kotlinFacet.configuration.settings.compilerInfo.commonCompilerArguments ?: return@getOrPut emptyList()
val commonArgs = kotlinFacet.configuration.settings.compilerArguments ?: return@getOrPut emptyList()
commonArgs.pluginOptions?.filter { it.startsWith(ANNOTATION_OPTION_PREFIX) }
?.map { it.substring(ANNOTATION_OPTION_PREFIX.length) }
@@ -28,10 +28,10 @@ internal fun modifyCompilerArgumentsForPlugin(
pluginName: String,
annotationOptionName: String
) {
val compileInfo = facet.configuration.settings.compilerInfo
val facetSettings = facet.configuration.settings
// investigate why copyBean() sometimes throws exceptions
val commonArguments = compileInfo.commonCompilerArguments ?: CommonCompilerArguments.DummyImpl()
val commonArguments = facetSettings.compilerArguments ?: CommonCompilerArguments.DummyImpl()
/** See [CommonCompilerArguments.PLUGIN_OPTION_FORMAT] **/
val annotationOptions = setup?.annotationFqNames?.map { "plugin:$compilerPluginId:$annotationOptionName=$it" } ?: emptyList()
@@ -48,5 +48,5 @@ internal fun modifyCompilerArgumentsForPlugin(
commonArguments.pluginOptions = newPluginOptions.toTypedArray()
commonArguments.pluginClasspaths = newPluginClasspaths.toTypedArray()
compileInfo.commonCompilerArguments = commonArguments
facetSettings.compilerArguments = commonArguments
}
@@ -24,9 +24,9 @@ import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import org.jetbrains.kotlin.idea.facet.KotlinFacet
import org.jetbrains.kotlin.noarg.diagnostic.AbstractNoArgDeclarationChecker
import org.jetbrains.kotlin.noarg.NoArgCommandLineProcessor.Companion.PLUGIN_ID
import org.jetbrains.kotlin.noarg.NoArgCommandLineProcessor.Companion.ANNOTATION_OPTION
import org.jetbrains.kotlin.noarg.NoArgCommandLineProcessor.Companion.PLUGIN_ID
import org.jetbrains.kotlin.noarg.diagnostic.AbstractNoArgDeclarationChecker
import org.jetbrains.kotlin.psi.KtModifierListOwner
import java.util.*
@@ -45,7 +45,7 @@ class IdeNoArgDeclarationChecker(val project: Project) : AbstractNoArgDeclaratio
return cache.value.getOrPut(module) {
val kotlinFacet = KotlinFacet.get(module) ?: return@getOrPut emptyList()
val commonArgs = kotlinFacet.configuration.settings.compilerInfo.commonCompilerArguments ?: return@getOrPut emptyList()
val commonArgs = kotlinFacet.configuration.settings.compilerArguments ?: return@getOrPut emptyList()
commonArgs.pluginOptions
?.filter { it.startsWith(ANNOTATION_OPTION_PREFIX) }