diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt index b0867f93d40..913ea8b4a4a 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticExtensionsScope.kt @@ -30,10 +30,7 @@ import org.jetbrains.kotlin.resolve.lazy.FileScopeProvider import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.JetScope import org.jetbrains.kotlin.storage.StorageManager -import org.jetbrains.kotlin.types.DescriptorSubstitutor -import org.jetbrains.kotlin.types.JetType -import org.jetbrains.kotlin.types.TypeSubstitutor -import org.jetbrains.kotlin.types.Variance +import org.jetbrains.kotlin.types.* import org.jetbrains.kotlin.types.typeUtil.isBoolean import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf import org.jetbrains.kotlin.types.typeUtil.isUnit @@ -167,9 +164,9 @@ class JavaSyntheticExtensionsScope(storageManager: StorageManager) : JetScope by override fun getSyntheticExtensionProperties(receiverTypes: Collection, name: Name): Collection { var result: SmartList? = null - val processedTypes: MutableSet? = if (receiverTypes.size() > 1) HashSet() else null + val processedTypes: MutableSet? = if (receiverTypes.size() > 1) HashSet() else null for (type in receiverTypes) { - result = collectSyntheticPropertiesByName(result, type.makeNotNullable(), name, processedTypes) + result = collectSyntheticPropertiesByName(result, type.constructor, name, processedTypes) } return when { result == null -> emptyList() @@ -178,37 +175,34 @@ class JavaSyntheticExtensionsScope(storageManager: StorageManager) : JetScope by } } - private fun collectSyntheticPropertiesByName(result: SmartList?, type: JetType, name: Name, processedTypes: MutableSet?): SmartList? { + private fun collectSyntheticPropertiesByName(result: SmartList?, type: TypeConstructor, name: Name, processedTypes: MutableSet?): SmartList? { if (processedTypes != null && !processedTypes.add(type)) return result @suppress("NAME_SHADOWING") var result = result - val typeConstructor = type.getConstructor() - val classifier = typeConstructor.getDeclarationDescriptor() + val classifier = type.declarationDescriptor if (classifier is ClassDescriptor) { result = result.add(syntheticPropertyInClass(Pair(classifier, name))) } - - typeConstructor.getSupertypes().forEach { result = collectSyntheticPropertiesByName(result, it, name, processedTypes) } + else { + type.supertypes.forEach { result = collectSyntheticPropertiesByName(result, it.constructor, name, processedTypes) } + } return result } override fun getSyntheticExtensionProperties(receiverTypes: Collection): Collection { val result = ArrayList() - val processedTypes = HashSet() - receiverTypes.forEach { - result.collectSyntheticProperties(it.makeNotNullable(), processedTypes) - } + val processedTypes = HashSet() + receiverTypes.forEach { result.collectSyntheticProperties(it.constructor, processedTypes) } return result } - private fun MutableList.collectSyntheticProperties(type: JetType, processedTypes: MutableSet) { + private fun MutableList.collectSyntheticProperties(type: TypeConstructor, processedTypes: MutableSet) { if (!processedTypes.add(type)) return - val typeConstructor = type.getConstructor() - val classifier = typeConstructor.getDeclarationDescriptor() + val classifier = type.declarationDescriptor if (classifier is ClassDescriptor) { for (descriptor in classifier.getUnsubstitutedMemberScope().getDescriptors(DescriptorKindFilter.FUNCTIONS)) { if (descriptor is FunctionDescriptor) { @@ -217,8 +211,9 @@ class JavaSyntheticExtensionsScope(storageManager: StorageManager) : JetScope by } } } - - typeConstructor.getSupertypes().forEach { collectSyntheticProperties(it, processedTypes) } + else { + type.supertypes.forEach { collectSyntheticProperties(it.constructor, processedTypes) } + } } private fun SmartList?.add(property: PropertyDescriptor?): SmartList? { diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.kt new file mode 100644 index 00000000000..c106a07c6da --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.kt @@ -0,0 +1,16 @@ +// FILE: KotlinFile.kt + +fun foo(t: T) { + t.setSomething(t.getSomething() + 1) + t.something++ +} + +// FILE: A.java +public interface A { + int getSomething(); +} + +// FILE: B.java +public interface B extends A { + void setSomething(int value); +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.txt new file mode 100644 index 00000000000..f2de8f0142f --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.txt @@ -0,0 +1,19 @@ +package + +public /*synthesized*/ fun A(/*0*/ function: () -> kotlin.Int): A +internal fun foo(/*0*/ t: T): kotlin.Unit + +public interface A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract fun getSomething(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface B : A { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract override /*1*/ /*fake_override*/ fun getSomething(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract fun setSomething(/*0*/ value: kotlin.Int): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index f566d4292aa..649dfdeb967 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -14153,6 +14153,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/SmartCastImplicitReceiver.kt"); doTest(fileName); } + + @TestMetadata("TypeParameterReceiver.kt") + public void testTypeParameterReceiver() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/TypeParameterReceiver.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/diagnostics/tests/thisAndSuper")