diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java index d76b72ece12..9998a2e1de5 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java @@ -100,14 +100,14 @@ public class SingleAbstractMethodUtils { if (substitute == null) return null; - JetType fixedProjections = fixProjections(substitute); - if (fixedProjections == null) return null; + JetType type = fixProjections(substitute); + if (type == null) return null; - if (JvmPackage.getPLATFORM_TYPES() && !isSamConstructor) { - return LazyJavaTypeResolver.FlexibleJavaClassifierTypeCapabilities.create(fixedProjections, TypeUtils.makeNullable(fixedProjections)); + if (JvmPackage.getPLATFORM_TYPES() && !isSamConstructor && TypesPackage.isNullabilityFlexible(samType)) { + return LazyJavaTypeResolver.FlexibleJavaClassifierTypeCapabilities.create(type, TypeUtils.makeNullable(type)); } - return TypeUtils.makeNullableAsSpecified(fixedProjections, !isSamConstructor && samType.isMarkedNullable()); + return TypeUtils.makeNullableAsSpecified(type, !isSamConstructor && samType.isMarkedNullable()); } } return null; diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt index 5549b62496d..1a5292b0695 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/SamAdapterFunctionsScope.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl import org.jetbrains.kotlin.load.java.sam.SingleAbstractMethodUtils +import org.jetbrains.kotlin.load.java.typeEnhacement.enhanceSignature import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.parentsWithSelf @@ -46,8 +47,10 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet if (function.visibility == Visibilities.PRIVATE || function.visibility == Visibilities.PRIVATE_TO_THIS || function.visibility == Visibilities.INVISIBLE_FAKE) return null if (!function.hasJavaOriginInHierarchy()) return null //TODO: should we go into base at all? if (!SingleAbstractMethodUtils.isSamAdapterNecessary(function)) return null - val returnType = function.returnType ?: return null - return MyFunctionDescriptor(function, returnType) + if (function.returnType == null) return null + //TODO: it's a temporary hack while original returns a function with platform types + val enhancedFunction = function.enhanceSignature() + return MyFunctionDescriptor(enhancedFunction) } override fun getSyntheticExtensionFunctions(receiverTypes: Collection, name: Name): Collection { @@ -71,8 +74,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet } private class MyFunctionDescriptor( - override val originalFunction: FunctionDescriptor, - originalReturnType: JetType + override val originalFunction: FunctionDescriptor ) : SamAdapterExtensionFunctionDescriptor, SimpleFunctionDescriptorImpl( DescriptorUtils.getContainingModule(originalFunction), null, @@ -94,7 +96,7 @@ class SamAdapterFunctionsScope(storageManager: StorageManager) : JetScope by Jet val typeParameters = ArrayList(typeParamsSum.size()) val typeSubstitutor = DescriptorSubstitutor.substituteTypeParameters(typeParamsSum, TypeSubstitution.EMPTY, this, typeParameters) - val returnType = typeSubstitutor.safeSubstitute(originalReturnType, Variance.OUT_VARIANCE) + val returnType = typeSubstitutor.safeSubstitute(originalFunction.returnType!!, Variance.OUT_VARIANCE) val receiverType = typeSubstitutor.safeSubstitute(ownerClass.defaultType, Variance.INVARIANT) val valueParameters = SingleAbstractMethodUtils.createValueParametersForSamAdapter(originalFunction, this, typeSubstitutor) initialize(receiverType, null, typeParameters, valueParameters, returnType, Modality.FINAL, Visibilities.PUBLIC) diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.kt new file mode 100644 index 00000000000..9e8e420de96 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.kt @@ -0,0 +1,13 @@ +// FILE: KotlinFile.kt +fun foo(javaClass: JavaClass) { + javaClass.getSomething().length() + javaClass.something.length() +} + +// FILE: JavaClass.java +import org.jetbrains.annotations.*; + +public class JavaClass { + @Nullable + public String getSomething() { return null; } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.txt new file mode 100644 index 00000000000..d1bc206bcea --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.txt @@ -0,0 +1,11 @@ +package + +internal fun foo(/*0*/ javaClass: JavaClass): kotlin.Unit + +public open class JavaClass { + public constructor JavaClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + org.jetbrains.annotations.Nullable() public open fun getSomething(): 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/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.kt new file mode 100644 index 00000000000..c52da3235d0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.kt @@ -0,0 +1,12 @@ +// FILE: KotlinFile.kt +fun foo(javaInterface: JavaInterface) { + javaInterface.doIt(null) { } + javaInterface.doIt("", null) +} + +// FILE: JavaInterface.java +import org.jetbrains.annotations.*; + +public interface JavaInterface { + void doIt(@NotNull String s, @NotNull Runnable runnable); +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.txt new file mode 100644 index 00000000000..9535e187912 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.txt @@ -0,0 +1,11 @@ +package + +public /*synthesized*/ fun JavaInterface(/*0*/ function: (kotlin.String!, java.lang.Runnable!) -> kotlin.Unit): JavaInterface +internal fun foo(/*0*/ javaInterface: JavaInterface): kotlin.Unit + +public interface JavaInterface { + public abstract fun doIt(/*0*/ org.jetbrains.annotations.NotNull() s: kotlin.String, /*1*/ org.jetbrains.annotations.NotNull() runnable: java.lang.Runnable): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.kt new file mode 100644 index 00000000000..1bda1a5b3c0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.kt @@ -0,0 +1,10 @@ +// FILE: KotlinFile.kt +fun foo(javaInterface: JavaInterface) { + javaInterface.doIt(null, null) { } + javaInterface.doIt("", { }, null) +} + +// FILE: JavaInterface.java +public interface JavaInterface { + void doIt(String s, Runnable runnable1, Runnable runnable2); +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.txt new file mode 100644 index 00000000000..01b31d1b5b9 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.txt @@ -0,0 +1,11 @@ +package + +public /*synthesized*/ fun JavaInterface(/*0*/ function: (kotlin.String!, java.lang.Runnable!, java.lang.Runnable!) -> kotlin.Unit): JavaInterface +internal fun foo(/*0*/ javaInterface: JavaInterface): kotlin.Unit + +public interface JavaInterface { + public abstract fun doIt(/*0*/ s: kotlin.String!, /*1*/ runnable1: java.lang.Runnable!, /*2*/ runnable2: java.lang.Runnable!): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.kt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.kt new file mode 100644 index 00000000000..2181ef23087 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.kt @@ -0,0 +1,19 @@ +// FILE: KotlinFile.kt +fun foo(javaInterface: JavaInterface) { + val value: String? + value = javaInterface.compute { "" } + value.length() +} + +// FILE: JavaInterface.java +import org.jetbrains.annotations.*; + +public interface JavaInterface { + @Nullable + String compute(@NotNull Provider provider); +} + +// FILE: Provider.java +public interface Provider { + public T compute(); +} diff --git a/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.txt b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.txt new file mode 100644 index 00000000000..59735a19182 --- /dev/null +++ b/compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.txt @@ -0,0 +1,18 @@ +package + +public /*synthesized*/ fun Provider(/*0*/ function: () -> T!): Provider +internal fun foo(/*0*/ javaInterface: JavaInterface): kotlin.Unit + +public interface JavaInterface { + org.jetbrains.annotations.Nullable() public abstract fun compute(/*0*/ org.jetbrains.annotations.NotNull() provider: Provider): kotlin.String? + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public interface Provider { + public abstract fun compute(): T! + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index be814772306..4f2af6ddc20 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -14384,6 +14384,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("TypeAnnotation.kt") + public void testTypeAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeAnnotation.kt"); + doTest(fileName); + } + @TestMetadata("TypeParameterReceiver.kt") public void testTypeParameterReceiver() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/javaProperties/TypeParameterReceiver.kt"); @@ -14429,6 +14435,24 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("ParameterTypeAnnotation.kt") + public void testParameterTypeAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ParameterTypeAnnotation.kt"); + doTest(fileName); + } + + @TestMetadata("PassNull.kt") + public void testPassNull() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/PassNull.kt"); + doTest(fileName); + } + + @TestMetadata("ReturnTypeAnnotation.kt") + public void testReturnTypeAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/ReturnTypeAnnotation.kt"); + doTest(fileName); + } + @TestMetadata("Simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/syntheticExtensions/samAdapters/Simple.kt"); diff --git a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt index fdce10f2176..8ce45937608 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt +++ b/core/descriptor.loader.java/src/org/jetbrains/kotlin/load/java/typeEnhacement/signatureEnhancement.kt @@ -16,23 +16,17 @@ package org.jetbrains.kotlin.load.java.typeEnhacement -import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.ParameterDescriptor -import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor -import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor -import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl -import org.jetbrains.kotlin.load.java.typeEnhacement.computeIndexedQualifiersForOverride import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor import org.jetbrains.kotlin.types.JetType public fun enhanceSignatures(platformSignatures: Collection): Collection { return platformSignatures.map { - it.enhance() + it.enhanceSignature() } } -private fun D.enhance(): D { +public fun D.enhanceSignature(): D { // TODO type parameters // TODO use new type parameters while enhancing other types // TODO Propagation into generic type arguments