[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()) {
configureLanguageFeaturesFromInternalArgs(collector)
}
configureExtraLanguageFeatures(this)
}
protected open fun configureExtraLanguageFeatures(map: HashMap<LanguageFeature, LanguageFeature.State>) {}
private fun HashMap<LanguageFeature, LanguageFeature.State>.configureLanguageFeaturesFromInternalArgs(collector: MessageCollector) {
val featuresThatForcePreReleaseBinaries = mutableListOf<LanguageFeature>()
val disabledFeaturesFromUnsupportedVersions = mutableListOf<LanguageFeature>()
@@ -16,6 +16,8 @@
package org.jetbrains.kotlin.cli.common.arguments
import org.jetbrains.kotlin.config.LanguageFeature
class K2MetadataCompilerArguments : CommonCompilerArguments() {
companion object {
@JvmStatic private val serialVersionUID = 0L
@@ -80,4 +82,8 @@ class K2MetadataCompilerArguments : CommonCompilerArguments() {
}
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 {
fun foo() {}
}
@@ -1,3 +1,5 @@
// LANGUAGE: +MultiPlatformProjects
// FILE: B.kt
package b.d
@@ -1,3 +1,5 @@
// LANGUAGE: +MultiPlatformProjects
open class Base(v: String)
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.descriptors.ClassKind
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.SourceElementPositioningStrategies
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
@@ -35,8 +36,19 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
@Suppress("DuplicatedCode")
object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) 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) {
checkExpectDeclarationModifiers(declaration, context, reporter)
}
-1
View File
@@ -5,7 +5,6 @@ $TESTDATA_DIR$/../jvm/hmpp/src/c.kt
$TEMP_DIR$
-language-version
2.0
-XXLanguage\:+MultiPlatformProjects
-Xfragments=a,b,c
-Xfragment-sources=a\:$TESTDATA_DIR$/../jvm/hmpp/src/a.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
error: HMPP module structure should not be passed during metadata compilation. Please remove `-Xfragments` and related flags
COMPILATION_ERROR
@@ -3,6 +3,11 @@ $TESTDATA_DIR$/inheritorOfExpectSealedClass/common-2.kt
$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-3.kt
-d
$TEMP_DIR$
-Xcommon-sources=$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-1.kt,$TESTDATA_DIR$/inheritorOfExpectSealedClass/common-2.kt
-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
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<!> 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
<!MUST_BE_INITIALIZED!><!UNSUPPORTED_FEATURE!>actual<!> val bar2: Int<!>