[FIR] Report UNSUPPORTED_FEATURE for expect/actual members if MPP is disabled

Always enable MultiPlatformProjects for K2MetadataCompilerArguments

 ^KT-57243 Fixed
This commit is contained in:
Ivan Kochurkin
2023-05-24 22:15:41 +02:00
committed by Space Team
parent 16ed06d4e9
commit 994c2229df
12 changed files with 44 additions and 22 deletions
@@ -868,8 +868,12 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
if (internalArguments.isNotEmpty()) { if (internalArguments.isNotEmpty()) {
configureLanguageFeaturesFromInternalArgs(collector) configureLanguageFeaturesFromInternalArgs(collector)
} }
configureExtraLanguageFeatures(this)
} }
protected open fun configureExtraLanguageFeatures(map: HashMap<LanguageFeature, LanguageFeature.State>) {}
private fun HashMap<LanguageFeature, LanguageFeature.State>.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) { private fun HashMap<LanguageFeature, LanguageFeature.State>.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) {
val featuresThatForcePreReleaseBinaries = mutableListOf<LanguageFeature>() val featuresThatForcePreReleaseBinaries = mutableListOf<LanguageFeature>()
val disabledFeaturesFromUnsupportedVersions = mutableListOf<LanguageFeature>() val disabledFeaturesFromUnsupportedVersions = mutableListOf<LanguageFeature>()
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.cli.common.arguments package org.jetbrains.kotlin.cli.common.arguments
import org.jetbrains.kotlin.config.LanguageFeature
class K2MetadataCompilerArguments : CommonCompilerArguments() { class K2MetadataCompilerArguments : CommonCompilerArguments() {
companion object { companion object {
@JvmStatic private val serialVersionUID = 0L @JvmStatic private val serialVersionUID = 0L
@@ -80,4 +82,8 @@ class K2MetadataCompilerArguments : CommonCompilerArguments() {
} }
override fun copyOf(): Freezable = copyK2MetadataCompilerArguments(this, K2MetadataCompilerArguments()) override fun copyOf(): Freezable = copyK2MetadataCompilerArguments(this, K2MetadataCompilerArguments())
override fun configureExtraLanguageFeatures(map: HashMap<LanguageFeature, LanguageFeature.State>) {
map[LanguageFeature.MultiPlatformProjects] = LanguageFeature.State.ENABLED
}
} }
@@ -1,3 +1,5 @@
// LANGUAGE: +MultiPlatformProjects
object O { object O {
fun foo() {} fun foo() {}
} }
@@ -1,3 +1,5 @@
// LANGUAGE: +MultiPlatformProjects
// FILE: B.kt // FILE: B.kt
package b.d package b.d
@@ -1,3 +1,5 @@
// LANGUAGE: +MultiPlatformProjects
open class Base(v: String) open class Base(v: String)
expect class Derived(v: String) : Base expect class Derived(v: String) : Base
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.SourceElementPositioningStrategies
import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -35,8 +36,19 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
@Suppress("DuplicatedCode") @Suppress("DuplicatedCode")
object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) return
if (declaration !is FirMemberDeclaration) return if (declaration !is FirMemberDeclaration) return
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
if ((declaration.isExpect || declaration.isActual) && context.containingDeclarations.lastOrNull() is FirFile) {
reporter.reportOn(
declaration.source,
FirErrors.UNSUPPORTED_FEATURE,
LanguageFeature.MultiPlatformProjects to context.session.languageVersionSettings,
context,
positioningStrategy = SourceElementPositioningStrategies.EXPECT_ACTUAL_MODIFIER
)
}
return
}
if (declaration.isExpect) { if (declaration.isExpect) {
checkExpectDeclarationModifiers(declaration, context, reporter) checkExpectDeclarationModifiers(declaration, context, reporter)
} }
-1
View File
@@ -5,7 +5,6 @@ $TESTDATA_DIR$/../jvm/hmpp/src/c.kt
$TEMP_DIR$ $TEMP_DIR$
-language-version -language-version
2.0 2.0
-XXLanguage\:+MultiPlatformProjects
-Xfragments=a,b,c -Xfragments=a,b,c
-Xfragment-sources=a\:$TESTDATA_DIR$/../jvm/hmpp/src/a.kt -Xfragment-sources=a\:$TESTDATA_DIR$/../jvm/hmpp/src/a.kt
-Xfragment-sources=b\:$TESTDATA_DIR$/../jvm/hmpp/src/b.kt -Xfragment-sources=b\:$TESTDATA_DIR$/../jvm/hmpp/src/b.kt
-9
View File
@@ -1,12 +1,3 @@
warning: ATTENTION!
This build uses unsafe internal compiler arguments:
-XXLanguage:+MultiPlatformProjects
This mode is not recommended for production use,
as no stability/compatibility guarantees are given on
compiler or generated code. Use it at your own risk!
warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features
error: HMPP module structure should not be passed during metadata compilation. Please remove `-Xfragments` and related flags error: HMPP module structure should not be passed during metadata compilation. Please remove `-Xfragments` and related flags
COMPILATION_ERROR COMPILATION_ERROR
@@ -3,6 +3,11 @@ $TESTDATA_DIR$/inheritorOfExpectSealedClass/common-2.kt
$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-3.kt $TESTDATA_DIR$/inheritorOfExpectSealedClass/common-3.kt
-d -d
$TEMP_DIR$ $TEMP_DIR$
-Xcommon-sources=$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-1.kt,$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-2.kt
-language-version -language-version
2.0 2.0
-Xfragments=a,b,c
-Xfragment-sources=a\:$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-1.kt
-Xfragment-sources=b\:$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-2.kt
-Xfragment-sources=c\:$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-3.kt
-Xfragment-refines=b\:a
-Xfragment-refines=c\:b
@@ -1,2 +1,3 @@
warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features warning: language version 2.0 is experimental, there are no backwards compatibility guarantees for new language and library features
OK error: HMPP module structure should not be passed during metadata compilation. Please remove `-Xfragments` and related flags
COMPILATION_ERROR
@@ -1,7 +0,0 @@
expect fun foo1()
expect val bar1 = <!EXPECTED_PROPERTY_INITIALIZER!>42<!>
expect class Baz1
actual fun foo2() = 42
<!MUST_BE_INITIALIZED!>actual val bar2: Int<!>
actual interface Baz2
@@ -1,6 +1,11 @@
// FIR_IDENTICAL
<!UNSUPPORTED_FEATURE!>expect<!> fun foo1() <!UNSUPPORTED_FEATURE!>expect<!> fun foo1()
<!UNSUPPORTED_FEATURE!>expect<!> val bar1 = <!EXPECTED_PROPERTY_INITIALIZER!>42<!> <!UNSUPPORTED_FEATURE!>expect<!> val bar1 = <!EXPECTED_PROPERTY_INITIALIZER!>42<!>
<!UNSUPPORTED_FEATURE!>expect<!> class Baz1 <!UNSUPPORTED_FEATURE!>expect<!> class Baz1 {
fun foo()
class Baz12
}
<!UNSUPPORTED_FEATURE!>actual<!> fun foo2() = 42 <!UNSUPPORTED_FEATURE!>actual<!> fun foo2() = 42
<!MUST_BE_INITIALIZED!><!UNSUPPORTED_FEATURE!>actual<!> val bar2: Int<!> <!MUST_BE_INITIALIZED!><!UNSUPPORTED_FEATURE!>actual<!> val bar2: Int<!>