From 5a96754aec0e552c4f194c3f2bec82ccf00d8c68 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Thu, 13 Apr 2023 14:36:39 +0200 Subject: [PATCH] Shift ReferencesToSyntheticJavaProperties feature release from 1.9 to 2.1 Other related tests: - testGenericJavaProperty - testFunInterfaceConstructorReference Meta issue: KT-8575 Review: https://jetbrains.team/p/kt/reviews/9595 UnsupportedSyntheticCallableReferenceChecker only existed for K1, because we wanted to release the feature for 1.9 and the feature should have been working for K2 unconditionally. But since, we're postponing the release until 2.1, we also need to port the checker from K1 to K2 --- ...tractSymbolLightClassesEqualityTestBase.kt | 8 ++-- ...ceToSyntheticJavaPropertyWithProjection.kt | 1 + .../jvm/checkers/JvmExpressionCheckers.kt | 1 + ...portedSyntheticCallableReferenceChecker.kt | 45 +++++++++++++++++++ ...portedSyntheticCallableReferenceChecker.kt | 6 ++- .../referenceToGenericSyntheticProperty.kt | 1 + .../box/syntheticExtensions/kt56072.kt | 1 + .../overrideKotlinPropertyByJavaMethod.kt | 1 + .../unsupported/syntheticProperties.fir.kt | 21 --------- .../unsupported/syntheticProperties.kt | 1 + .../SyntheticJavaPropertyReference.fir.kt | 17 ------- .../SyntheticJavaPropertyReference.kt | 1 + .../kotlin/config/LanguageVersionSettings.kt | 3 +- 13 files changed, 63 insertions(+), 44 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirUnsupportedSyntheticCallableReferenceChecker.kt delete mode 100644 compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.fir.kt diff --git a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesEqualityTestBase.kt b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesEqualityTestBase.kt index 9d367c90c04..4ff01c13dc4 100644 --- a/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesEqualityTestBase.kt +++ b/analysis/symbol-light-classes/tests/org/jetbrains/kotlin/light/classes/symbol/base/AbstractSymbolLightClassesEqualityTestBase.kt @@ -51,15 +51,15 @@ abstract class AbstractSymbolLightClassesEqualityTestBase( assertions: AssertionsService, ): PsiElementVisitor = object : JavaElementVisitor() { override fun visitClass(aClass: PsiClass) { - compareArrayElementsWithInvalidation(aClass, PsiClass::methods) - compareArrayElementsWithInvalidation(aClass, PsiClass::fields) - compareArrayElementsWithInvalidation(aClass, PsiClass::innerClasses) + compareArrayElementsWithInvalidation(aClass, PsiClass::getMethods) + compareArrayElementsWithInvalidation(aClass, PsiClass::getFields) + compareArrayElementsWithInvalidation(aClass, PsiClass::getInnerClasses) super.visitClass(aClass) } override fun visitEnumConstant(enumConstant: PsiEnumConstant) { - compareElementsWithInvalidation(enumConstant, PsiEnumConstant::initializingClass) + compareElementsWithInvalidation(enumConstant, PsiEnumConstant::getInitializingClass) super.visitEnumConstant(enumConstant) } diff --git a/compiler/fir/analysis-tests/testData/resolve/references/referenceToSyntheticJavaPropertyWithProjection.kt b/compiler/fir/analysis-tests/testData/resolve/references/referenceToSyntheticJavaPropertyWithProjection.kt index d8fd8f5c1ff..6d3fdbf399c 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/referenceToSyntheticJavaPropertyWithProjection.kt +++ b/compiler/fir/analysis-tests/testData/resolve/references/referenceToSyntheticJavaPropertyWithProjection.kt @@ -1,4 +1,5 @@ // ISSUE: KT-56243 +// !LANGUAGE: +ReferencesToSyntheticJavaProperties // FILE: JavaInv.java public class JavaInv { diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt index b2634f739c9..92c1dde36ce 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmExpressionCheckers.kt @@ -23,6 +23,7 @@ object JvmExpressionCheckers : ExpressionCheckers() { override val callableReferenceAccessCheckers: Set get() = setOf( FirJavaShadowedFieldReferenceChecker, + FirUnsupportedSyntheticCallableReferenceChecker, ) override val functionCallCheckers: Set diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirUnsupportedSyntheticCallableReferenceChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirUnsupportedSyntheticCallableReferenceChecker.kt new file mode 100644 index 00000000000..895674de644 --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/expression/FirUnsupportedSyntheticCallableReferenceChecker.kt @@ -0,0 +1,45 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression + +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirExpressionChecker +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirProperty +import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess +import org.jetbrains.kotlin.fir.expressions.toResolvedCallableReference +import org.jetbrains.kotlin.fir.languageVersionSettings +import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol + +/** + * This is K2 implementation. + * For K1 implementation see: [org.jetbrains.kotlin.resolve.jvm.checkers.UnsupportedSyntheticCallableReferenceChecker] + */ +object FirUnsupportedSyntheticCallableReferenceChecker : FirExpressionChecker() { + override fun check(expression: FirCallableReferenceAccess, context: CheckerContext, reporter: DiagnosticReporter) { + val parent = context.containingElements.let { + check(it.last() === expression) + it[it.lastIndex - 1] + } + // We allow resolution of top-level callable references to synthetic Java extension properties in the delegate position. See KT-47299 + if (parent is FirProperty && parent.delegate === expression) return + + if (!context.session.languageVersionSettings.supportsFeature(LanguageFeature.ReferencesToSyntheticJavaProperties) && + expression.toResolvedCallableReference()?.resolvedSymbol is FirSyntheticPropertySymbol + ) { + reporter.reportOn( + expression.calleeReference.source, + FirErrors.UNSUPPORTED_FEATURE, + LanguageFeature.ReferencesToSyntheticJavaProperties to context.session.languageVersionSettings, + context + ) + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker.kt index ca9e06a553a..31ed36bc435 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker.kt @@ -27,12 +27,16 @@ import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.util.extractCallableReferenceExpression import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor +/** + * This is K1 implementation. + * For K2 implementation see: [org.jetbrains.kotlin.fir.analysis.jvm.checkers.expression.FirUnsupportedSyntheticCallableReferenceChecker] + */ class UnsupportedSyntheticCallableReferenceChecker : CallChecker { override fun check(resolvedCall: ResolvedCall<*>, reportOn: PsiElement, context: CallCheckerContext) { // TODO: support references to synthetic Java extension properties (KT-8575) val callableReferenceExpression = resolvedCall.call.extractCallableReferenceExpression() ?: return - // We allow resolve of top-level callable reference to synthetic Java extension properties in delegate position + // We allow resolution of top-level callable references to synthetic Java extension properties in the delegate position. See KT-47299 if (callableReferenceExpression.unwrapParenthesesLabelsAndAnnotationsDeeply() is KtPropertyDelegate) return if (resolvedCall.resultingDescriptor is SyntheticJavaPropertyDescriptor) { diff --git a/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt b/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt index 2e3a073c8c9..eb2bc2daaae 100644 --- a/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt +++ b/compiler/testData/codegen/box/callableReference/referenceToGenericSyntheticProperty.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JVM +// !LANGUAGE: +ReferencesToSyntheticJavaProperties // FILE: J.java diff --git a/compiler/testData/codegen/box/syntheticExtensions/kt56072.kt b/compiler/testData/codegen/box/syntheticExtensions/kt56072.kt index 64902109682..449decc0cdc 100644 --- a/compiler/testData/codegen/box/syntheticExtensions/kt56072.kt +++ b/compiler/testData/codegen/box/syntheticExtensions/kt56072.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JVM +// !LANGUAGE: +ReferencesToSyntheticJavaProperties // FILE: SuperClass.java public class SuperClass { diff --git a/compiler/testData/codegen/box/syntheticExtensions/overrideKotlinPropertyByJavaMethod.kt b/compiler/testData/codegen/box/syntheticExtensions/overrideKotlinPropertyByJavaMethod.kt index c96ccb62703..989107b33a7 100644 --- a/compiler/testData/codegen/box/syntheticExtensions/overrideKotlinPropertyByJavaMethod.kt +++ b/compiler/testData/codegen/box/syntheticExtensions/overrideKotlinPropertyByJavaMethod.kt @@ -1,4 +1,5 @@ // TARGET_BACKEND: JVM +// !LANGUAGE: +ReferencesToSyntheticJavaProperties // WITH_STDLIB // FILE: J.java diff --git a/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.fir.kt b/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.fir.kt deleted file mode 100644 index e7708239797..00000000000 --- a/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.fir.kt +++ /dev/null @@ -1,21 +0,0 @@ -// !LANGUAGE: -ReferencesToSyntheticJavaProperties - -// FILE: Customer.java -public class Customer { - private String name; - - public Customer(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } -} - -// FILE: test.kt -val customerName = Customer::name diff --git a/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.kt b/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.kt index 05a705f07fa..a0a05ad8103 100644 --- a/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.kt +++ b/compiler/testData/diagnostics/tests/callableReference/unsupported/syntheticProperties.kt @@ -1,4 +1,5 @@ // !LANGUAGE: -ReferencesToSyntheticJavaProperties +// FIR_IDENTICAL // FILE: Customer.java public class Customer { diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.fir.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.fir.kt deleted file mode 100644 index b79144e3f60..00000000000 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// !LANGUAGE: -ReferencesToSyntheticJavaProperties -// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION - -// FILE: KotlinFile.kt - -fun call(c: Any) {} - -fun test() { - JavaClass::foo - call(JavaClass::foo) -} - -// FILE: JavaClass.java - -public class JavaClass { - public String getFoo() {} -} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt index 2e0b6b04157..35413005f68 100644 --- a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt @@ -1,5 +1,6 @@ // !LANGUAGE: -ReferencesToSyntheticJavaProperties // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_EXPRESSION +// FIR_IDENTICAL // FILE: KotlinFile.kt diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 2e9768ae29c..4251c9cd454 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -273,7 +273,6 @@ enum class LanguageFeature( DataObjects(KOTLIN_1_9), // KT-4107 ProhibitAccessToEnumCompanionMembersInEnumConstructorCall(KOTLIN_1_9, kind = BUG_FIX), // KT-49110 RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_9, kind = BUG_FIX), // KT-46727 - ReferencesToSyntheticJavaProperties(KOTLIN_1_9), // KT-8575 ValueClassesSecondaryConstructorWithBody(sinceVersion = KOTLIN_1_9, kind = UNSTABLE_FEATURE), // KT-55333 NativeJsProhibitLateinitIsInitializedIntrinsicWithoutPrivateAccess(KOTLIN_1_9, kind = BUG_FIX), // KT-27002 @@ -291,6 +290,8 @@ enum class LanguageFeature( // 2.1 + ReferencesToSyntheticJavaProperties(KOTLIN_2_1), // KT-8575 + // End of 2.* language features -------------------------------------------------- // This feature effectively might be removed because we decided to disable it until K2 and there it will be unconditionally enabled.