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 new file mode 100644 index 00000000000..eab11eb33ff --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/UnsupportedSyntheticCallableReferenceChecker.kt @@ -0,0 +1,38 @@ +/* + * Copyright 2010-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.resolve.jvm.checkers + +import org.jetbrains.kotlin.descriptors.CallableDescriptor +import org.jetbrains.kotlin.diagnostics.Errors.UNSUPPORTED +import org.jetbrains.kotlin.psi.KtCallableReferenceExpression +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.resolve.calls.checkers.CallChecker +import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext +import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall +import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor + +class UnsupportedSyntheticCallableReferenceChecker : CallChecker { + override fun check(resolvedCall: ResolvedCall, context: BasicCallResolutionContext) { + val expression = context.call.callElement + if (expression !is KtNameReferenceExpression || expression.parent !is KtCallableReferenceExpression) return + + // TODO: support references to synthetic Java extension properties (KT-8575) + if (resolvedCall.resultingDescriptor is SyntheticJavaPropertyDescriptor) { + context.trace.report(UNSUPPORTED.on(expression, "reference to the synthetic extension property for a Java get/set method")) + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index 6c4ef922a7c..ee9e616e851 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -46,7 +46,8 @@ public object JvmPlatformConfigurator : PlatformConfigurator( JavaAnnotationCallChecker(), TraitDefaultMethodCallChecker(), JavaClassOnCompanionChecker(), - ProtectedInSuperClassCompanionCallChecker() + ProtectedInSuperClassCompanionCallChecker(), + UnsupportedSyntheticCallableReferenceChecker() ), additionalTypeCheckers = listOf( diff --git a/compiler/testData/diagnostics/tests/callableReference/property/syntheticProperties.kt b/compiler/testData/diagnostics/tests/callableReference/property/syntheticProperties.kt index 1fd83f1c2a1..a60dd528911 100644 --- a/compiler/testData/diagnostics/tests/callableReference/property/syntheticProperties.kt +++ b/compiler/testData/diagnostics/tests/callableReference/property/syntheticProperties.kt @@ -16,4 +16,4 @@ public class Customer { } // FILE: test.kt -val customerName = Customer::name +val customerName = Customer::name diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt new file mode 100644 index 00000000000..3db13325d46 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt @@ -0,0 +1,9 @@ +// FILE: KotlinFile.kt + +fun bar() = JavaClass::foo + +// FILE: JavaClass.java + +public class JavaClass { + public String getFoo() {} +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.txt new file mode 100644 index 00000000000..939781dbe26 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.txt @@ -0,0 +1,11 @@ +package + +public fun bar(): kotlin.reflect.KProperty1 + +public open class JavaClass { + public constructor JavaClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun getFoo(): kotlin.String! + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 6232d24dc0b..4c75901db86 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -17198,6 +17198,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("SyntheticJavaPropertyReference.kt") + public void testSyntheticJavaPropertyReference() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/SyntheticJavaPropertyReference.kt"); + doTest(fileName); + } + @TestMetadata("TypeAnnotation.kt") public void testTypeAnnotation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.kt");