From 8c0cf7d0bc0ad386ce65f556e4bd24618c8d0323 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Mon, 20 Nov 2023 17:40:06 +0100 Subject: [PATCH] [FIR] Fix disappeared ACTUAL_MISSING ^KT-59887 Fixed Review: https://jetbrains.team/p/kt/reviews/13244 --- .../api/fir/util/firCheckResolvedUtils.kt | 3 +- .../expectAndActualInTheSameFile.kt | 1 + .../expectAndActualInTheSameFile.txt | 2 +- .../testData/lazyResolve/classes/actual.kt | 1 + .../testData/lazyResolve/classes/actual.txt | 28 +++--- .../fir/analysis/checkers/FirKeywordUtils.kt | 2 + .../FirExpectActualDeclarationChecker.kt | 87 ++++++++++++++----- .../mpp/FirExpectActualMatcherTransformer.kt | 3 +- .../k2/expectValInInlineClass.kt | 2 +- .../k2/expectValInInlineClassJVM.kt | 2 +- .../skippedAnnotations.ll.kt | 2 +- ...unctionTypeParameterNamesInOverride.fir.kt | 4 +- ...FunctionTypeParameterNamesInOverride.ll.kt | 4 +- .../changeLateinitInOverride.fir.kt | 6 +- .../changeLateinitInOverride.ll.kt | 6 +- ...dalityFromAbstractToFinalInOverride.fir.kt | 4 +- ...odalityFromAbstractToFinalInOverride.ll.kt | 4 +- ...odalityFromAbstractToOpenInOverride.fir.kt | 4 +- ...ModalityFromAbstractToOpenInOverride.ll.kt | 4 +- ...odalityFromOpenToAbstractInOverride.fir.kt | 4 +- ...ModalityFromOpenToAbstractInOverride.ll.kt | 4 +- ...geModalityFromOpenToFinalInOverride.fir.kt | 4 +- ...ngeModalityFromOpenToFinalInOverride.ll.kt | 4 +- ...geModalityOfSubstitutedFakeOverride.fir.kt | 4 +- ...ngeModalityOfSubstitutedFakeOverride.ll.kt | 4 +- .../changeModalityOfToStringInOverride.fir.kt | 4 +- .../changeModalityOfToStringInOverride.ll.kt | 4 +- .../changeParameterNameInOverride.fir.kt | 4 +- .../changeParameterNameInOverride.ll.kt | 4 +- .../changeVarargModifierInOverride.fir.kt | 4 +- .../changeVarargModifierInOverride.ll.kt | 4 +- .../changeVisibilityInOverride.fir.kt | 4 +- .../changeVisibilityInOverride.ll.kt | 4 +- .../covariantFunctionOverride.fir.kt | 4 +- .../covariantFunctionOverride.ll.kt | 4 +- .../covariantOverrideGenericUpperBound.fir.kt | 4 +- .../covariantOverrideGenericUpperBound.ll.kt | 4 +- .../covariantOverrideGenerics.fir.kt | 4 +- .../covariantOverrideGenerics.ll.kt | 4 +- .../covariantPropertyOverride.fir.kt | 4 +- .../covariantPropertyOverride.ll.kt | 4 +- .../flexibleTypesMatching.fir.kt | 4 +- .../flexibleTypesMatching.ll.kt | 4 +- .../injectContextReceiverOverload.fir.kt | 2 +- .../propertyKindOverride.fir.kt | 4 +- .../propertyKindOverride.ll.kt | 4 +- .../severalMismatches.fir.kt | 10 +-- .../severalMismatches.ll.kt | 10 +-- .../annotationArgArrayVsOutArray.fir.kt | 6 +- .../annotationArgArrayVsOutArray.kt | 4 + .../annotationArgArrayVsVararg.fir.kt | 6 +- .../annotationArgArrayVsVararg.kt | 4 + .../annotationArgArrayVsVararg.ll.kt | 6 +- .../expectCtorlessFinalToActualObject.fir.kt | 4 +- .../expectCtorlessFinalToActualObject.ll.kt | 4 +- ...ctualClassWithDifferentConstructors.fir.kt | 4 +- ...actualClassWithDifferentConstructors.ll.kt | 6 +- .../headerClass/actualMissing.fir.kt | 13 --- .../headerClass/actualMissing.kt | 1 + .../equalsOverrideInActualInterface.fir.kt | 4 +- .../equalsOverrideInActualInterface.ll.kt | 4 +- ...eclarationWithWeakIncompatibilities.fir.kt | 6 +- ...lassWithoutExplicitOverrideOfMethod.fir.kt | 2 +- ...CheckForExplicitAndImplicitOverride.fir.kt | 34 -------- ...lityCheckForExplicitAndImplicitOverride.kt | 1 + .../nestedClassesWithErrors.fir.kt | 2 +- .../headerClass/nestedClassesWithErrors.ll.kt | 2 +- .../headerClass/noImplKeywordOnMember.fir.kt | 6 +- .../headerClass/noImplKeywordOnMember.ll.kt | 6 +- .../headerClass/privateMembers.fir.kt | 4 +- .../expectActualInlineClass.fir.kt | 2 +- ...itJavaActualization_multipleActuals.fir.kt | 4 +- ...citJavaActualization_multipleActuals.ll.kt | 4 +- ...VsGenericsUpperBoundIncompatibility.fir.kt | 2 +- ...eVsGenericsUpperBoundIncompatibility.ll.kt | 2 +- .../widerVisibilityInActualClassifier.fir.kt | 4 +- .../output.txt | 5 +- .../output.txt | 6 +- .../depends/b_jvm_dep(a-common)/jvm.kt | 4 +- .../derived_jvm_dep(base-common)/impl.kt | 4 +- 80 files changed, 244 insertions(+), 217 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.fir.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt index be49ba13eaf..ed543973601 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/firCheckResolvedUtils.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription import org.jetbrains.kotlin.fir.contracts.impl.FirEmptyContractDescription import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isActual +import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirResolvable @@ -108,7 +109,7 @@ internal fun checkStatementsAreResolved(script: FirScript) { } internal fun checkExpectForActualIsResolved(memberDeclaration: FirMemberDeclaration) { - if (!memberDeclaration.isActual) return + if (memberDeclaration.isExpect) return checkWithAttachment( condition = memberDeclaration.expectForActual != null, diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.kt b/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.kt index fbb03fc7ac0..ddcff0c0447 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.kt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +MultiPlatformProjects fun main() { println("Hello, Kotlin/Native!") } diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.txt index 5f453eba481..ddd4d9603d3 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/invalidCode/expectAndActualInTheSameFile.txt @@ -10,6 +10,6 @@ FILE: [ResolvedTo(IMPORTS)] expectAndActualInTheSameFile.kt public? final? [ResolvedTo(RAW_FIR)] fun main(): R|kotlin/Unit| { LAZY_BLOCK } public? final? expect [ResolvedTo(RAW_FIR)] fun f(): R|kotlin/Unit| public? final? [ResolvedTo(RAW_FIR)] fun test(): R|kotlin/Unit| { LAZY_BLOCK } - public final actual [ResolvedTo(BODY_RESOLVE)] fun f(): R|kotlin/Unit| { + public final actual [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] fun f(): R|kotlin/Unit| { #(String(Hello)) } diff --git a/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.kt b/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.kt index 74537b1d33f..6e6e3279fd8 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.kt +++ b/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.kt @@ -1,3 +1,4 @@ +// LANGUAGE: +MultiPlatformProjects actual class Actual { fun memberFun() {} val a = 1 diff --git a/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.txt b/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.txt index 1daf4245496..fcf49d9221a 100644 --- a/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.txt +++ b/analysis/low-level-api-fir/testData/lazyResolve/classes/actual.txt @@ -161,7 +161,7 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt EXPECT_ACTUAL_MATCHING: FILE: [ResolvedTo(IMPORTS)] actual.kt - public final actual [ResolvedTo(EXPECT_ACTUAL_MATCHING)] class Actual : R|kotlin/Any| { + public final actual [ResolvedTo(EXPECT_ACTUAL_MATCHING)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Actual] constructor(): R|Actual| { LAZY_super } @@ -184,7 +184,7 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt CONTRACTS: FILE: [ResolvedTo(IMPORTS)] actual.kt - public final actual [ResolvedTo(CONTRACTS)] class Actual : R|kotlin/Any| { + public final actual [ResolvedTo(CONTRACTS)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Actual] constructor(): R|Actual| { LAZY_super } @@ -207,7 +207,7 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt IMPLICIT_TYPES_BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] actual.kt - public final actual [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] class Actual : R|kotlin/Any| { + public final actual [ResolvedTo(IMPLICIT_TYPES_BODY_RESOLVE)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Actual] constructor(): R|Actual| { LAZY_super } @@ -230,7 +230,7 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt ANNOTATION_ARGUMENTS: FILE: [ResolvedTo(IMPORTS)] actual.kt - public final actual [ResolvedTo(ANNOTATION_ARGUMENTS)] class Actual : R|kotlin/Any| { + public final actual [ResolvedTo(ANNOTATION_ARGUMENTS)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { public? [ResolvedTo(RAW_FIR)] [ContainingClassKey=Actual] constructor(): R|Actual| { LAZY_super } @@ -253,14 +253,14 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt BODY_RESOLVE: FILE: [ResolvedTo(IMPORTS)] actual.kt - public final actual [ResolvedTo(BODY_RESOLVE)] class Actual : R|kotlin/Any| { - public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual] constructor(): R|Actual| { + public final actual [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual, ExpectForActualAttributeKey={}] constructor(): R|Actual| { super() } public final [ResolvedTo(STATUS)] fun memberFun(): R|kotlin/Unit| { LAZY_BLOCK } - public final [ResolvedTo(BODY_RESOLVE)] val a: R|kotlin/Int| = Int(1) + public final [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] val a: R|kotlin/Int| = Int(1) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual] get(): R|kotlin/Int| public? final? actual [ResolvedTo(RAW_FIR)] class NestedActual : R|kotlin/Any| { @@ -276,23 +276,23 @@ FILE: [ResolvedTo(IMPORTS)] actual.kt FILE RAW TO BODY: FILE: [ResolvedTo(BODY_RESOLVE)] actual.kt - public final actual [ResolvedTo(BODY_RESOLVE)] class Actual : R|kotlin/Any| { - public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual] constructor(): R|Actual| { + public final actual [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] class Actual : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual, ExpectForActualAttributeKey={}] constructor(): R|Actual| { super() } - public final [ResolvedTo(BODY_RESOLVE)] fun memberFun(): R|kotlin/Unit| { + public final [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] fun memberFun(): R|kotlin/Unit| { } - public final [ResolvedTo(BODY_RESOLVE)] val a: R|kotlin/Int| = Int(1) + public final [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] val a: R|kotlin/Int| = Int(1) public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=Actual] get(): R|kotlin/Int| - public final actual [ResolvedTo(BODY_RESOLVE)] class NestedActual : R|kotlin/Any| { - public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=NestedActual] constructor(): R|Actual.NestedActual| { + public final actual [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] class NestedActual : R|kotlin/Any| { + public [ResolvedTo(BODY_RESOLVE)] [ContainingClassKey=NestedActual, ExpectForActualAttributeKey={}] constructor(): R|Actual.NestedActual| { super() } - public final [ResolvedTo(BODY_RESOLVE)] fun member2(): R|kotlin/Boolean| { + public final [ResolvedTo(BODY_RESOLVE)] [ExpectForActualAttributeKey={}] fun member2(): R|kotlin/Boolean| { ^member2 Boolean(false) } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt index d4a02e1753f..3595898581a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt @@ -87,6 +87,8 @@ sealed class FirModifier(val node: Node, val token: KtModifierKeywor fun KtSourceElement?.getModifierList(): FirModifierList? { return when (this) { null -> null + // todo this code is buggy. psi for fake declarations (e.g. ImplicitConstructor, EnumGeneratedDeclaration) means a completely different thing + // KT-63751 is KtPsiSourceElement -> (psi as? KtModifierListOwner)?.modifierList?.let { FirModifierList.FirPsiModifierList(it) } is KtLightSourceElement -> { val modifierListNode = lighterASTNode.getChildren(treeStructure).find { it.tokenType == KtNodeTypes.MODIFIER_LIST } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt index 7da024f2775..ac7651bcc4d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt @@ -12,18 +12,13 @@ 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.FirExpectActualMatchingContext -import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList +import org.jetbrains.kotlin.fir.analysis.checkers.hasModifier import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.isActual -import org.jetbrains.kotlin.fir.declarations.utils.isExpect -import org.jetbrains.kotlin.fir.declarations.utils.isExternal -import org.jetbrains.kotlin.fir.declarations.utils.isTailRec -import org.jetbrains.kotlin.fir.expectActualMatchingContextFactory -import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.fir.symbols.impl.* @@ -51,12 +46,24 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { } return } + + // This checker performs a more high level checking. It speaks in terms of "properties" and "functions". + // It doesn't make sense to check: + // - backing fields (fields can't be declared in expect declaration) + // - property accessors (they will be checked as part of the properties checking) + // - functions and setters parameters (they will be checked as part of the properties/functions checking) + // This if is added because hasModifier(KtTokens.ACTUAL_KEYWORD) mistakenly returns `true` for these declarations (KT-63751) + if (declaration is FirBackingField || declaration is FirPropertyAccessor || declaration is FirValueParameter) return + if (declaration.isExpect) { checkExpectDeclarationModifiers(declaration, context, reporter) checkOptInAnnotation(declaration, declaration.symbol, context, reporter) } - if (declaration.isActual) { - checkActualDeclarationHasExpected(declaration, context, reporter) + val matchingCompatibilityToMembersMap = declaration.symbol.expectForActual.orEmpty() + if ((ExpectActualMatchingCompatibility.MatchedSuccessfully in matchingCompatibilityToMembersMap || declaration.hasActualModifier()) && + !declaration.isLocalMember // Reduce verbosity. WRONG_MODIFIER_TARGET will be reported anyway. + ) { + checkActualDeclarationHasExpected(declaration, context, reporter, matchingCompatibilityToMembersMap) } } @@ -120,10 +127,9 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { declaration: FirMemberDeclaration, context: CheckerContext, reporter: DiagnosticReporter, - checkActual: Boolean = true, + matchingCompatibilityToMembersMap: ExpectForActualMatchingData, ) { val symbol = declaration.symbol - val matchingCompatibilityToMembersMap = symbol.expectForActual ?: return val expectedSingleCandidate = matchingCompatibilityToMembersMap[ExpectActualMatchingCompatibility.MatchedSuccessfully]?.singleOrNull() val expectActualMatchingContext = context.session.expectActualMatchingContextFactory.create( @@ -146,10 +152,15 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { checkAmbiguousExpects(symbol, matchingCompatibilityToMembersMap, symbol, context, reporter) val source = declaration.source - if (!declaration.isActual) { - if (checkActual && ExpectActualMatchingCompatibility.MatchedSuccessfully in matchingCompatibilityToMembersMap) { - reporter.reportOn(source, FirErrors.ACTUAL_MISSING, context) - } + if (!declaration.hasActualModifier() && + ExpectActualMatchingCompatibility.MatchedSuccessfully in matchingCompatibilityToMembersMap && + (actualContainingClass == null || requireActualModifier(symbol, actualContainingClass, context.session)) && + expectedSingleCandidate != null && + // Don't require 'actual' keyword on fake-overrides actualizations. + // It's an inconsistency in the language design, but it's the way it works right now + !expectedSingleCandidate.isFakeOverride(expectContainingClass, expectActualMatchingContext) + ) { + reporter.reportOn(source, FirErrors.ACTUAL_MISSING, context) return } @@ -158,8 +169,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { reportClassScopesIncompatibility(symbol, expectedSingleCandidate, declaration, checkingCompatibility, reporter, source, context) } - ExpectActualMatchingCompatibility.MatchedSuccessfully !in matchingCompatibilityToMembersMap && - requireActualModifier(declaration.symbol, context.session) -> { + ExpectActualMatchingCompatibility.MatchedSuccessfully !in matchingCompatibilityToMembersMap -> { reporter.reportOn( source, FirErrors.ACTUAL_WITHOUT_EXPECT, @@ -174,7 +184,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { // A nicer diagnostic for functions with default params if (declaration is FirFunction && checkingCompatibility == ExpectActualCheckingCompatibility.ActualFunctionWithDefaultParameters) { reporter.reportOn(declaration.source, FirErrors.ACTUAL_FUNCTION_WITH_DEFAULT_ARGUMENTS, context) - } else if (requireActualModifier(declaration.symbol, context.session)) { + } else { reporter.reportOn( source, FirErrors.ACTUAL_WITHOUT_EXPECT, @@ -254,6 +264,13 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { } } + private fun FirBasedSymbol<*>.isFakeOverride( + expectContainingClass: FirRegularClassSymbol?, + expectActualMatchingContext: FirExpectActualMatchingContext, + ): Boolean = expectContainingClass != null && + this@isFakeOverride is FirCallableSymbol<*> && + with(expectActualMatchingContext) { this@isFakeOverride.isFakeOverride(expectContainingClass) } + private fun getCheckingCompatibility( actualSymbol: FirBasedSymbol<*>, expectSymbol: FirBasedSymbol<*>, @@ -309,14 +326,40 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { } // we don't require `actual` modifier on + // - implicit primary constructors + // - data class fake members // - annotation constructors, because annotation classes can only have one constructor // - value class primary constructors, because value class must have primary constructor // - value parameter inside primary constructor of inline class, because inline class must have one value parameter - private fun requireActualModifier(declaration: FirBasedSymbol<*>, session: FirSession): Boolean { - return !declaration.isAnnotationConstructor(session) && - !declaration.isPrimaryConstructorOfInlineOrValueClass(session) + private fun requireActualModifier( + declaration: FirBasedSymbol<*>, + actualContainingClass: FirRegularClassSymbol, + platformSession: FirSession + ): Boolean { + return declaration.source?.kind != KtFakeSourceElementKind.ImplicitConstructor && + declaration.origin != FirDeclarationOrigin.Synthetic.DataClassMember && + !declaration.isAnnotationConstructor(platformSession) && + !declaration.isPrimaryConstructorOfInlineOrValueClass(platformSession) && + !isUnderlyingPropertyOfInlineClass(declaration, actualContainingClass, platformSession) } + // Ideally, this function shouldn't exist KT-63751 + private fun FirElement.hasActualModifier(): Boolean = when (source?.kind) { + KtFakeSourceElementKind.DataClassGeneratedMembers -> false + KtFakeSourceElementKind.EnumGeneratedDeclaration -> false + KtFakeSourceElementKind.ImplicitConstructor -> false + else -> hasModifier(KtTokens.ACTUAL_KEYWORD) || hasModifier(KtTokens.IMPL_KEYWORD) + } + + private fun isUnderlyingPropertyOfInlineClass( + symbol: FirBasedSymbol<*>, + actualContainingClass: FirRegularClassSymbol, + platformSession: FirSession + ): Boolean = actualContainingClass.isInline && + symbol is FirPropertySymbol && + symbol.receiverParameter == null && + actualContainingClass.primaryConstructorSymbol(platformSession)?.valueParameterSymbols?.singleOrNull()?.name == symbol.name + private fun checkOptInAnnotation( declaration: FirMemberDeclaration, expectDeclarationSymbol: FirBasedSymbol<*>, diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt index 27b488229ac..8d0c00e9631 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatcherTransformer.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isActual +import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.expectActualMatchingContextFactory import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.languageVersionSettings @@ -93,7 +94,7 @@ open class FirExpectActualMatcherTransformer( // ------------------------------------------------------ fun transformMemberDeclaration(memberDeclaration: FirMemberDeclaration) { - if (!memberDeclaration.isActual) return + if (memberDeclaration.isExpect) return val actualSymbol = memberDeclaration.symbol // Regardless of whether any `expect` symbols are found for `memberDeclaration`, it must be assigned an `expectForActual` map. diff --git a/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClass.kt b/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClass.kt index 173ab442ff6..bcd83bec13c 100644 --- a/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClass.kt +++ b/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClass.kt @@ -14,7 +14,7 @@ expect value class Wrapper(val obj: Any) { // FILE: test.kt actual value class Wrapper(val obj: Any) { - val prop: String + actual val prop: String get() = "OK" } diff --git a/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClassJVM.kt b/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClassJVM.kt index 8783d592cf1..c9ed6aaeaf8 100644 --- a/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClassJVM.kt +++ b/compiler/testData/codegen/box/multiplatform/k2/expectValInInlineClassJVM.kt @@ -15,7 +15,7 @@ expect value class Wrapper(val obj: Any) { @JvmInline actual value class Wrapper(val obj: Any) { - val prop: String + actual val prop: String get() = "OK" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/skippedAnnotations.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/skippedAnnotations.ll.kt index 1a13546f973..a48d375a440 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/skippedAnnotations.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualAnnotationsNotMatchExpect/skippedAnnotations.ll.kt @@ -32,7 +32,7 @@ expect class ImplicitlyActualizedByJvmDeclarationOnExpectOnly package kotlin @OptIn(ExperimentalMultiplatform::class) -actual annotation class OptionalExpectationOnExpectOnly +actual annotation class OptionalExpectationOnExpectOnly actual fun skippedAnnotationsOnExpectOnly() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.fir.kt index da3763e56d9..e3b125b7db3 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.fir.kt @@ -10,6 +10,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(t: R) {} +actual open class Foo : Base() { + override fun foo(t: R) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.ll.kt index 52a42d06611..2e8d06d4522 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeFunctionTypeParameterNamesInOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(t: R) {} +actual open class Foo : Base() { + override fun foo(t: R) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.fir.kt index 826a7c01909..0b377bb59a6 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.fir.kt @@ -13,8 +13,8 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override lateinit var red1: String - override var red2: String = "" +actual open class Foo : Base() { + override lateinit var red1: String + override var red2: String = "" override lateinit var green: String } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.ll.kt index f86d922c82d..e8ecb82ee59 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeLateinitInOverride.ll.kt @@ -13,8 +13,8 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override lateinit var red1: String - override var red2: String = "" +actual open class Foo : Base() { + override lateinit var red1: String + override var red2: String = "" override lateinit var green: String } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.fir.kt index 2a8d316d932..36bf0ef6a78 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.fir.kt @@ -10,6 +10,6 @@ interface Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base { - final override fun foo() {} +actual open class Foo : Base { + final override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.ll.kt index 6d2f7135e69..d30683a55e6 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToFinalInOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base { - final override fun foo() {} +actual open class Foo : Base { + final override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.fir.kt index bb2ff8f7337..8ff2f3cc41a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.fir.kt @@ -12,6 +12,6 @@ interface Base { // Mismatched scope must be reported here. But it's false negative checker in K1. // For some reason, K1 says that modality of `exect_Foo.foo` is `abstract`. // https://youtrack.jetbrains.com/issue/KT-59739 -actual open class Foo : Base { - override fun foo() {} +actual open class Foo : Base { + override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.ll.kt index ca65742a582..44a8809f154 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromAbstractToOpenInOverride.ll.kt @@ -12,6 +12,6 @@ expect open class Foo() : Base // Mismatched scope must be reported here. But it's false negative checker in K1. // For some reason, K1 says that modality of `exect_Foo.foo` is `abstract`. // https://youtrack.jetbrains.com/issue/KT-59739 -actual open class Foo : Base { - override fun foo() {} +actual open class Foo : Base { + override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.fir.kt index e2d521b0c69..193dfc41116 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.fir.kt @@ -9,6 +9,6 @@ interface Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual abstract class Foo : Base { - abstract override fun foo() +actual abstract class Foo : Base { + abstract override fun foo() } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.ll.kt index 80c2a8b8943..c017824771a 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToAbstractInOverride.ll.kt @@ -9,6 +9,6 @@ expect abstract class Foo() : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual abstract class Foo : Base { - abstract override fun foo() +actual abstract class Foo : Base { + abstract override fun foo() } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.fir.kt index 37a86b6915b..32cd66e539f 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.fir.kt @@ -10,6 +10,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - final override fun foo() {} +actual open class Foo : Base() { + final override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.ll.kt index 5397ccf17b6..c652d9e1ab9 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityFromOpenToFinalInOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - final override fun foo() {} +actual open class Foo : Base() { + final override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.fir.kt index f024f365461..5fa54448d2f 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.fir.kt @@ -10,6 +10,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - final override fun foo(t: String) {} +actual open class Foo : Base() { + final override fun foo(t: String) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.ll.kt index 12871c31a97..9ce90208ac8 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfSubstitutedFakeOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - final override fun foo(t: String) {} +actual open class Foo : Base() { + final override fun foo(t: String) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.fir.kt index 2de117e7d9d..e526bb4efcf 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.fir.kt @@ -6,6 +6,6 @@ // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo { - final override fun toString() = "Foo" +actual open class Foo { + final override fun toString() = "Foo" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.ll.kt index a21c39af526..9ffa8e625be 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeModalityOfToStringInOverride.ll.kt @@ -6,6 +6,6 @@ expect open class Foo // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo { - final override fun toString() = "Foo" +actual open class Foo { + final override fun toString() = "Foo" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.fir.kt index 365711bc9fa..b05f168b56b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.fir.kt @@ -14,8 +14,8 @@ expect open class Foo3 { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo1 : Base() { - override fun foo(paramNameChanged: Int) {} +actual open class Foo1 : Base() { + override fun foo(paramNameChanged: Int) {} } actual typealias Foo2 = Foo2Java diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.ll.kt index 2ac82ecce9e..7c3f529db38 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeParameterNameInOverride.ll.kt @@ -14,8 +14,8 @@ expect open class Foo3 { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo1 : Base() { - override fun foo(paramNameChanged: Int) {} +actual open class Foo1 : Base() { + override fun foo(paramNameChanged: Int) {} } actual typealias Foo2 = Foo2Java diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.fir.kt index 4a3cca52bb1..abd828a0874 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.fir.kt @@ -11,6 +11,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(bar: IntArray) {} +actual open class Foo : Base() { + override fun foo(bar: IntArray) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.ll.kt index ee968020e0a..8dcaf196b27 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVarargModifierInOverride.ll.kt @@ -11,6 +11,6 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(bar: IntArray) {} +actual open class Foo : Base() { + override fun foo(bar: IntArray) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.fir.kt index bcf47c17ed9..de9ea1dba24 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.fir.kt @@ -10,6 +10,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - public override fun foo() {} +actual open class Foo : Base() { + public override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.ll.kt index 276ced5628b..9cef44d2757 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/changeVisibilityInOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - public override fun foo() {} +actual open class Foo : Base() { + public override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.fir.kt index 19f3153d1d8..f8fe1b977bf 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.fir.kt @@ -12,6 +12,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): String = "" +actual open class Foo : Base() { + override fun foo(): String = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.ll.kt index 6f974698eb8..378b9e27402 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantFunctionOverride.ll.kt @@ -12,6 +12,6 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): String = "" +actual open class Foo : Base() { + override fun foo(): String = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.fir.kt index 64a95d47c7f..1d15702910e 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.fir.kt @@ -13,6 +13,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): T = null!! +actual open class Foo : Base() { + override fun foo(): T = null!! } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.ll.kt index 1d940d71c8c..3fc54339d2c 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenericUpperBound.ll.kt @@ -13,6 +13,6 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): T = null!! +actual open class Foo : Base() { + override fun foo(): T = null!! } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.fir.kt index d5e95aae690..adb870b2f57 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.fir.kt @@ -11,6 +11,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): F = null!! +actual open class Foo : Base() { + override fun foo(): F = null!! } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.ll.kt index 804a46fcd56..c0159015158 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantOverrideGenerics.ll.kt @@ -11,6 +11,6 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override fun foo(): F = null!! +actual open class Foo : Base() { + override fun foo(): F = null!! } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.fir.kt index 6a8fb817d5d..a211422d752 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.fir.kt @@ -11,6 +11,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override val foo: String = "" +actual open class Foo : Base() { + override val foo: String = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.ll.kt index 3757539525f..43ccf8ea108 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/covariantPropertyOverride.ll.kt @@ -11,6 +11,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override val foo: String = "" +actual open class Foo : Base() { + override val foo: String = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.fir.kt index cfa7ded6e31..3e232e9491d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.fir.kt @@ -14,11 +14,11 @@ expect open class Base { actual typealias Base = BaseJava -actual open class Foo : Base() { +actual open class Foo : Base() { // K1 doesn't report a diagnostic here because when it compares scopes it sees flexible type // K2 will likely report a diagnostic here // I don't think we can fix this 'K1 green -> K2 red'. It must be a rare case anyway. - override fun foo(): List { + override fun foo(): List { return super.foo() } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.ll.kt index 51f48c3301b..c669f64741c 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/flexibleTypesMatching.ll.kt @@ -14,11 +14,11 @@ expect open class Foo : Base { actual typealias Base = BaseJava -actual open class Foo : Base() { +actual open class Foo : Base() { // K1 doesn't report a diagnostic here because when it compares scopes it sees flexible type // K2 will likely report a diagnostic here // I don't think we can fix this 'K1 green -> K2 red'. It must be a rare case anyway. - override fun foo(): List { + override fun foo(): List { return super.foo() } } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt index 9540ea991a3..a7f8b22e43e 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/injectContextReceiverOverload.fir.kt @@ -15,5 +15,5 @@ actual open class Foo { // Expected: NON_ACTUAL_MEMBER_DECLARED_IN_EXPECT_NON_FINAL_CLASSIFIER_ACTUALIZATION_WARNING. // But it doesn't work because context receivers are not yet supported in expect actual matcher KT-61447 context(Int) - fun foo() {} + fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.fir.kt index 3cc168f5573..34d0b539779 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.fir.kt @@ -10,6 +10,6 @@ open class Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override var foo: Int = 1 +actual open class Foo : Base() { + override var foo: Int = 1 } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.ll.kt index 2aceb5f6914..8ca982487fa 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/propertyKindOverride.ll.kt @@ -10,6 +10,6 @@ expect open class Foo : Base // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { - override var foo: Int = 1 +actual open class Foo : Base() { + override var foo: Int = 1 } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.fir.kt index da6eca7a2eb..6a04696b71e 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.fir.kt @@ -16,14 +16,14 @@ open class Base() { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { +actual open class Foo : Base() { actual fun existingMethod() {} actual val existingParam: Int = 904 fun injectedMethod() {} val injectedProperty: Int = 42 - override fun overrideReturnType(): String = "" - final override fun overrideModality1(): Any = "" - final override fun overrideModality2(): Any = "" - public override fun overrideVisibility(): Any = "" + override fun overrideReturnType(): String = "" + final override fun overrideModality1(): Any = "" + final override fun overrideModality2(): Any = "" + public override fun overrideVisibility(): Any = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.ll.kt index 34d48a99aa3..cec9cdce670 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/actualClassifierMustHasTheSameMembersAsNonFinalExpectClassifierChecker/severalMismatches.ll.kt @@ -16,14 +16,14 @@ expect open class Foo : Base { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual open class Foo : Base() { +actual open class Foo : Base() { actual fun existingMethod() {} actual val existingParam: Int = 904 fun injectedMethod() {} val injectedProperty: Int = 42 - override fun overrideReturnType(): String = "" - final override fun overrideModality1(): Any = "" - final override fun overrideModality2(): Any = "" - public override fun overrideVisibility(): Any = "" + override fun overrideReturnType(): String = "" + final override fun overrideModality1(): Any = "" + final override fun overrideModality2(): Any = "" + public override fun overrideVisibility(): Any = "" } diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.fir.kt index e919503569c..04993faece9 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.fir.kt @@ -9,7 +9,11 @@ fun test() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt -actual annotation class A(val x: Array) +// return types are different in expect and actual (Array in expect vs Array in actual). +// In K1, different return types are mistakenly considered as expect-actual mismatch ("strong incompatibility" in old terminology) +// In K2, different return types are considered as expect-actual incompatibility ("weak incompatibility" in old terminology) +// ACTUAL_MISSING is not reported only when there is a mismatch => K2 is correct +actual annotation class A(val x: Array) @A("abc", "foo", "bar") fun test2() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.kt index 9ea7834456f..1779bb12f6d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsOutArray.kt @@ -9,6 +9,10 @@ fun test() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt +// return types are different in expect and actual (Array in expect vs Array in actual). +// In K1, different return types are mistakenly considered as expect-actual mismatch ("strong incompatibility" in old terminology) +// In K2, different return types are considered as expect-actual incompatibility ("weak incompatibility" in old terminology) +// ACTUAL_MISSING is not reported only when there is a mismatch => K2 is correct actual annotation class A(val x: Array) @A("abc", "foo", "bar") diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.fir.kt index 45cfd950feb..f1a7723bdaa 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.fir.kt @@ -9,7 +9,11 @@ fun test() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt -actual annotation class A(val x: Array) +// return types are different in expect and actual (Array in expect vs Array in actual). +// In K1, different return types are mistakenly considered as expect-actual mismatch ("strong incompatibility" in old terminology) +// In K2, different return types are considered as expect-actual incompatibility ("weak incompatibility" in old terminology) +// ACTUAL_MISSING is not reported only when there is a mismatch => K2 is correct +actual annotation class A(val x: Array) @A("abc", "foo", "bar") fun test2() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.kt index 4157f8947e8..fde47ca562b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.kt @@ -9,6 +9,10 @@ fun test() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt +// return types are different in expect and actual (Array in expect vs Array in actual). +// In K1, different return types are mistakenly considered as expect-actual mismatch ("strong incompatibility" in old terminology) +// In K2, different return types are considered as expect-actual incompatibility ("weak incompatibility" in old terminology) +// ACTUAL_MISSING is not reported only when there is a mismatch => K2 is correct actual annotation class A(val x: Array) @A("abc", "foo", "bar") diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.ll.kt index f56d9436a06..598f018b0da 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationArgArrayVsVararg.ll.kt @@ -9,7 +9,11 @@ fun test() {} // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt -actual annotation class A(val x: Array) +// return types are different in expect and actual (Array in expect vs Array in actual). +// In K1, different return types are mistakenly considered as expect-actual mismatch ("strong incompatibility" in old terminology) +// In K2, different return types are considered as expect-actual incompatibility ("weak incompatibility" in old terminology) +// ACTUAL_MISSING is not reported only when there is a mismatch => K2 is correct +actual annotation class A(val x: Array) @A("abc", "foo", "bar") fun test2() {} diff --git a/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.fir.kt index 445277cc495..844aaf8c6bb 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.fir.kt @@ -28,10 +28,10 @@ expect class M01 { // FILE: jvm.kt actual object E01 -actual object E02 +actual object E02 actual object E03 -actual object E04 +actual object E04 actual object E05 actual object E06 diff --git a/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.ll.kt index 2822c5796ec..606b39508d1 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/complexMatchings/expectCtorlessFinalToActualObject.ll.kt @@ -28,10 +28,10 @@ expect annotation class ANNO01 // FILE: jvm.kt actual object E01 -actual object E02 +actual object E02 actual object E03 -actual object E04 +actual object E04 actual object E05 actual object E06 diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.fir.kt index e7e31564b6a..381af2921ca 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.fir.kt @@ -37,7 +37,7 @@ actual class Bar1(val s: String) actual class Bar2(val p: String = "value", i: Int) actual typealias Bar3 = JavaBar actual class Bar4(val s: String) { - constructor() : this("") + constructor() : this("") } actual class Bar5 { @@ -45,7 +45,7 @@ actual class Bar5 { constructor(s: String) } -class Bar6 { +class Bar6 { actual constructor() } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.ll.kt index 42f73391273..8ba55f667dd 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualClassWithDifferentConstructors.ll.kt @@ -37,7 +37,7 @@ actual class Bar1(val s: String) actual class Bar2(val p: String = "value", i: Int) actual typealias Bar3 = JavaBar actual class Bar4(val s: String) { - constructor() : this("") + constructor() : this("") } actual class Bar5 { @@ -45,8 +45,8 @@ actual class Bar5 { constructor(s: String) } -class Bar6 { - actual constructor() +class Bar6 { + actual constructor() } actual class Bar7 actual constructor(s: String) { diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.fir.kt deleted file mode 100644 index a0d2ee32076..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.fir.kt +++ /dev/null @@ -1,13 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -expect class A { - fun foo() -} - -// MODULE: m1-jvm()()(m1-common) -// FILE: jvm.kt - -class A { - actual fun foo() {} -} diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt index fdcd296eceb..5b4840c202f 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/actualMissing.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.fir.kt index b0f076249c9..8fc0a1a2718 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.fir.kt @@ -2,6 +2,6 @@ expect interface Base // MODULE: m1-jvm()()(m1-common) -actual interface Base { - override fun equals(other: Any?): Boolean +actual interface Base { + override fun equals(other: Any?): Boolean } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.ll.kt index 2ec7ceac1b7..d86e9cbd755 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/equalsOverrideInActualInterface.ll.kt @@ -2,6 +2,6 @@ expect interface Base // MODULE: m1-jvm()()(m1-common) -actual interface Base { - override fun equals(other: Any?): Boolean +actual interface Base { + override fun equals(other: Any?): Boolean } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.fir.kt index c632c74dc2c..e5ee4c200ba 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/expectDeclarationWithWeakIncompatibilities.fir.kt @@ -15,13 +15,13 @@ expect open class Foo3 // FILE: jvm.kt -interface Foo1 +interface Foo1 actual interface Foo2 actual var s: String = "value" -fun foo2(): Int = 0 +fun foo2(): Int = 0 actual class Foo3 -class Foo3 +class Foo3 diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/extendExpectedClassWithoutExplicitOverrideOfMethod.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/extendExpectedClassWithoutExplicitOverrideOfMethod.fir.kt index d8defb79fdd..4b4f42f8e6d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/extendExpectedClassWithoutExplicitOverrideOfMethod.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/extendExpectedClassWithoutExplicitOverrideOfMethod.fir.kt @@ -31,5 +31,5 @@ actual class DerivedExplicit : Base() { } actual class DerivedExplicitCheck : Base() { - override fun foo() {} + override fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.fir.kt deleted file mode 100644 index e87cad7da82..00000000000 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.fir.kt +++ /dev/null @@ -1,34 +0,0 @@ -// MODULE: m1-common -// FILE: common.kt - -expect class Foo1 { - val x: String -} - -expect class Foo2 { - val x: String -} - -expect class Foo3 { - val x: String -} - -// MODULE: m2-jvm()()(m1-common) - -// FILE: jvm.kt - -open class Open { - open val x = "42" -} - -actual open class Foo1 : Open() { - override val x = super.x -} - -actual open class Foo2 : Open() - -open class WithFinal { - val x = "42" -} - -actual open class Foo3 : WithFinal() diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.kt index 1855e214da3..39a72e17042 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/modalityCheckForExplicitAndImplicitOverride.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // MODULE: m1-common // FILE: common.kt diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.fir.kt index 5990a0538bf..f1febdfb85b 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.fir.kt @@ -41,5 +41,5 @@ actual class C { actual class D actual class E { - class N + class N } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.ll.kt index 73044e2c9cd..df3029ab95d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/nestedClassesWithErrors.ll.kt @@ -41,5 +41,5 @@ actual class C { actual class D actual class E { - class N + class N } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.fir.kt index 538fbf91710..59cf2719ac3 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.fir.kt @@ -9,7 +9,7 @@ // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual class Foo { - fun bar(): String = "bar" - fun bas(g: Int) {} +actual class Foo { + fun bar(): String = "bar" + fun bas(g: Int) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.ll.kt index bd34df5eb05..ee9c8ea77ed 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/noImplKeywordOnMember.ll.kt @@ -9,7 +9,7 @@ expect class Foo { // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -actual class Foo { - fun bar(): String = "bar" - fun bas(g: Int) {} +actual class Foo { + fun bar(): String = "bar" + fun bas(g: Int) {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/headerClass/privateMembers.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/headerClass/privateMembers.fir.kt index a15edc42525..b8434a698f5 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/headerClass/privateMembers.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/headerClass/privateMembers.fir.kt @@ -16,8 +16,8 @@ expect class A private constructor() { // FILE: jvm.kt actual class A actual private constructor() { - private fun foo() {} - private val bar: String = "" + private fun foo() {} + private val bar: String = "" actual private fun Int.memExt(): Any = 0 actual private class Nested diff --git a/compiler/testData/diagnostics/tests/multiplatform/inlineClasses/expectActualInlineClass.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/inlineClasses/expectActualInlineClass.fir.kt index b4afdf26ba3..cc8ff8654b9 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/inlineClasses/expectActualInlineClass.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/inlineClasses/expectActualInlineClass.fir.kt @@ -20,7 +20,7 @@ expect inline class NonInlineActual(val x: Int) actual inline class Foo1(val x: Int) { actual fun bar(): String = "Hello" } -actual inline class Foo2(val x: String) +actual inline class Foo2(val x: String) actual inline class Foo3 actual inline class NonInlineExpect(val x: Int) diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.fir.kt index ac55ed4f888..34a97c26231 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.fir.kt @@ -15,6 +15,6 @@ public class Foo { // FILE: jvm.kt -class Foo(t: T) { - fun foo() {} +class Foo(t: T) { + fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.ll.kt index 6e1bfbcf4fb..9571341ab3d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/java/implicitJavaActualization_multipleActuals.ll.kt @@ -15,6 +15,6 @@ public class Foo { // FILE: jvm.kt -class Foo(t: T) { - fun foo() {} +class Foo(t: T) { + fun foo() {} } diff --git a/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.fir.kt index a9e38c6b9e6..0af428abee0 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.fir.kt @@ -7,5 +7,5 @@ interface A // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -fun foo(t: T): T = TODO() +fun foo(t: T): T = TODO() fun foo(t: T): String = TODO() diff --git a/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.ll.kt b/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.ll.kt index d5b21998b18..a74c7b5f3e8 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.ll.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/returnTypeVsGenericsUpperBoundIncompatibility.ll.kt @@ -7,5 +7,5 @@ expect fun foo(t: T): String // MODULE: m2-jvm()()(m1-common) // FILE: jvm.kt -fun foo(t: T): T = TODO() +fun foo(t: T): T = TODO() fun foo(t: T): String = TODO() diff --git a/compiler/testData/diagnostics/tests/multiplatform/widerVisibilityInActualClassifier.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/widerVisibilityInActualClassifier.fir.kt index 3b4468d6aa4..b45cdb88f2d 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/widerVisibilityInActualClassifier.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/widerVisibilityInActualClassifier.fir.kt @@ -18,8 +18,8 @@ internal expect open class Other { // MODULE: platform-jvm()()(common) public actual open class Some { // should be allowed - public class ProtectedNested // should be allowed - public class InternalNested // should be allowed + public class ProtectedNested // should be allowed + public class InternalNested // should be allowed public actual fun publicFun() {} // should be allowed public actual fun internalFun() {} // should be allowed diff --git a/compiler/testData/multiplatform/simpleNoImplKeywordOnTopLevelFunction/output.txt b/compiler/testData/multiplatform/simpleNoImplKeywordOnTopLevelFunction/output.txt index b08950d503d..1a79524b6bb 100644 --- a/compiler/testData/multiplatform/simpleNoImplKeywordOnTopLevelFunction/output.txt +++ b/compiler/testData/multiplatform/simpleNoImplKeywordOnTopLevelFunction/output.txt @@ -3,5 +3,8 @@ Exit code: OK Output: -- JVM -- -Exit code: OK +Exit code: COMPILATION_ERROR Output: +compiler/testData/multiplatform/simpleNoImplKeywordOnTopLevelFunction/jvm.kt:3:5: error: declaration must be marked with 'actual'. +fun foo(s: String): Array = arrayOf(s) + ^ diff --git a/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt index f3324b8b770..9a802d88bae 100644 --- a/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt +++ b/compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/output.txt @@ -5,6 +5,6 @@ Output: -- JVM -- Exit code: COMPILATION_ERROR Output: -compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/common.kt:1:1: error: expect declaration `Foo` is incompatible with actual `Foo` because class kinds are different (class, interface, object, enum, annotation) -expect class Foo -^ +compiler/testData/multiplatform/weakIncompatibilityWithoutActualModifier/jvm.kt:1:11: error: declaration must be marked with 'actual'. +interface Foo + ^ diff --git a/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt b/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt index 01aabd94c4c..c6c6794f2fd 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/depends/b_jvm_dep(a-common)/jvm.kt @@ -1,2 +1,2 @@ -class My -fun bar() {} \ No newline at end of file +actual class My +actual fun bar() {} \ No newline at end of file diff --git a/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt b/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt index f473934d4a0..3394c20ca2c 100644 --- a/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt +++ b/idea/testData/multiModuleHighlighting/multiplatform/triangle/derived_jvm_dep(base-common)/impl.kt @@ -1,5 +1,5 @@ -class My -fun bar() { +actual class My +actual fun bar() { }