Emit MultiPlatformProjects diagnostic on all declarations

where expect/actual modifier is present

^KT-31281
This commit is contained in:
Timofey Solonin
2023-07-10 09:37:18 +02:00
committed by Space Team
parent 341f61428b
commit 792b6482c0
3 changed files with 24 additions and 1 deletions
@@ -13,6 +13,7 @@ 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
import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.utils.isActual
@@ -26,6 +27,9 @@ import org.jetbrains.kotlin.fir.scopes.impl.declaredMemberScope
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.coneType
import org.jetbrains.kotlin.fir.types.toSymbol
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility
import org.jetbrains.kotlin.resolve.multiplatform.ExpectActualCompatibility.*
@@ -34,7 +38,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
if (declaration !is FirMemberDeclaration) return
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
if ((declaration.isExpect || declaration.isActual) && context.containingDeclarations.lastOrNull() is FirFile) {
if ((declaration.isExpect || declaration.isActual) && containsExpectOrActualModifier(declaration)) {
reporter.reportOn(
declaration.source,
FirErrors.UNSUPPORTED_FEATURE,
@@ -53,6 +57,12 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() {
}
}
private fun containsExpectOrActualModifier(declaration: FirMemberDeclaration): Boolean {
return declaration.source.getModifierList()?.let { modifiers ->
KtTokens.EXPECT_KEYWORD in modifiers || KtTokens.ACTUAL_KEYWORD in modifiers
} ?: false
}
private fun checkExpectDeclarationModifiers(
declaration: FirMemberDeclaration,
context: CheckerContext,
@@ -10,3 +10,8 @@
<!UNSUPPORTED_FEATURE!>actual<!> fun foo2() = 42
<!MUST_BE_INITIALIZED!><!UNSUPPORTED_FEATURE!>actual<!> val bar2: Int<!>
<!UNSUPPORTED_FEATURE!>actual<!> interface Baz2
<!UNSUPPORTED_FEATURE!>actual<!> class Baz1 {
<!UNSUPPORTED_FEATURE!>actual<!> fun foo() {
}
}
@@ -3,6 +3,14 @@ package
public actual val bar2: kotlin.Int
public actual fun foo2(): kotlin.Int
public final actual class Baz1 {
public constructor Baz1()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final actual fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public actual interface Baz2 {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int