Emit MultiPlatformProjects diagnostic on all declarations
where expect/actual modifier is present ^KT-31281
This commit is contained in:
committed by
Space Team
parent
341f61428b
commit
792b6482c0
+11
-1
@@ -13,6 +13,7 @@ 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
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isActual
|
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.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
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
|
||||||
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) {
|
override fun check(declaration: FirDeclaration, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (declaration !is FirMemberDeclaration) return
|
if (declaration !is FirMemberDeclaration) return
|
||||||
if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
|
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(
|
reporter.reportOn(
|
||||||
declaration.source,
|
declaration.source,
|
||||||
FirErrors.UNSUPPORTED_FEATURE,
|
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(
|
private fun checkExpectDeclarationModifiers(
|
||||||
declaration: FirMemberDeclaration,
|
declaration: FirMemberDeclaration,
|
||||||
context: CheckerContext,
|
context: CheckerContext,
|
||||||
|
|||||||
+5
@@ -10,3 +10,8 @@
|
|||||||
<!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<!>
|
||||||
<!UNSUPPORTED_FEATURE!>actual<!> interface Baz2
|
<!UNSUPPORTED_FEATURE!>actual<!> interface Baz2
|
||||||
|
|
||||||
|
<!UNSUPPORTED_FEATURE!>actual<!> class Baz1 {
|
||||||
|
<!UNSUPPORTED_FEATURE!>actual<!> fun foo() {
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
@@ -3,6 +3,14 @@ package
|
|||||||
public actual val bar2: kotlin.Int
|
public actual val bar2: kotlin.Int
|
||||||
public actual fun foo2(): 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 actual interface Baz2 {
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
|||||||
Reference in New Issue
Block a user