diff --git a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt index 28d4c3a64c6..f3ac8071c8e 100644 --- a/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt +++ b/plugins/kapt3/kapt3-compiler/src/org/jetbrains/kotlin/kapt3/stubs/ClassFileToSourceStubConverter.kt @@ -56,6 +56,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall +import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.resolve.calls.model.DefaultValueArgument import org.jetbrains.kotlin.resolve.calls.model.ResolvedValueArgument import org.jetbrains.kotlin.resolve.constants.* @@ -704,20 +705,31 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati return null } + fun typeFromAsm() = signatureParser.parseFieldSignature(field.signature, treeMaker.Type(type)) + // Enum type must be an identifier (Javac requirement) - val typeExpression = if (isEnum(field.access)) + val typeExpression = if (isEnum(field.access)) { treeMaker.SimpleName(treeMaker.getQualifiedName(type).substringAfterLast('.')) - else + } else if (descriptor is PropertyDescriptor && descriptor.isDelegated) { getNonErrorType( - (descriptor as? CallableDescriptor)?.returnType, RETURN_TYPE, + (origin.element as? KtProperty)?.delegateExpression?.getType(kaptContext.bindingContext), + RETURN_TYPE, + ktTypeProvider = { null }, + ifNonError = ::typeFromAsm + ) + } else { + getNonErrorType( + (descriptor as? CallableDescriptor)?.returnType, + RETURN_TYPE, ktTypeProvider = { val fieldOrigin = (kaptContext.origins[field]?.element as? KtCallableDeclaration) ?.takeIf { it !is KtFunction } fieldOrigin?.typeReference }, - ifNonError = { signatureParser.parseFieldSignature(field.signature, treeMaker.Type(type)) } + ifNonError = ::typeFromAsm ) + } lineMappings.registerField(containingClass, field) diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java index da291216b2b..e866010a85d 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/ClassFileToSourceStubConverterTestGenerated.java @@ -119,6 +119,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi runTest("plugins/kapt3/kapt3-compiler/testData/converter/defaultParameterValueOn.kt"); } + @TestMetadata("delegateCorrectErrorTypes.kt") + public void testDelegateCorrectErrorTypes() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.kt"); + } + @TestMetadata("deprecated.kt") public void testDeprecated() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/deprecated.kt"); diff --git a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java index 1273f9ded3e..e4b1d2135b6 100644 --- a/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java +++ b/plugins/kapt3/kapt3-compiler/test/org/jetbrains/kotlin/kapt3/test/IrClassFileToSourceStubConverterTestGenerated.java @@ -120,6 +120,11 @@ public class IrClassFileToSourceStubConverterTestGenerated extends AbstractIrCla runTest("plugins/kapt3/kapt3-compiler/testData/converter/defaultParameterValueOn.kt"); } + @TestMetadata("delegateCorrectErrorTypes.kt") + public void testDelegateCorrectErrorTypes() throws Exception { + runTest("plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.kt"); + } + @TestMetadata("deprecated.kt") public void testDeprecated() throws Exception { runTest("plugins/kapt3/kapt3-compiler/testData/converter/deprecated.kt"); diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.kt b/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.kt new file mode 100644 index 00000000000..bd6bd55143d --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.kt @@ -0,0 +1,13 @@ +// CORRECT_ERROR_TYPES + +@file:Suppress("UNRESOLVED_REFERENCE") + +package test + +class Delegate { + operator fun getValue(thisRef: Any, property: KProperty<*>): Any {return Any()} +} + +class Bar(delegate: Delegate) { + private val unknown: Unknown by delegate +} diff --git a/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.txt b/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.txt new file mode 100644 index 00000000000..f9a898802ce --- /dev/null +++ b/plugins/kapt3/kapt3-compiler/testData/converter/delegateCorrectErrorTypes.txt @@ -0,0 +1,38 @@ +package test; + +import java.lang.System; + +@kotlin.Metadata() +public final class Bar { + private final test.Delegate unknown$delegate = null; + + public Bar(@org.jetbrains.annotations.NotNull() + test.Delegate delegate) { + super(); + } + + private final Unknown getUnknown() { + return null; + } +} + +//////////////////// + +package test; + +import java.lang.System; + +@kotlin.Metadata() +public final class Delegate { + + public Delegate() { + super(); + } + + @org.jetbrains.annotations.NotNull() + public final java.lang.Object getValue(@org.jetbrains.annotations.NotNull() + java.lang.Object thisRef, @org.jetbrains.annotations.NotNull() + KProperty property) { + return null; + } +}