Kapt: Fix stubs for delegated properties with anonymous types (KT-27910)

This commit is contained in:
Yan Zhulanow
2018-11-07 17:44:45 +09:00
parent 5fd070a9b9
commit 69633e6686
5 changed files with 87 additions and 3 deletions
@@ -143,7 +143,10 @@ class VariableTypeAndInitializerResolver(
variableDescriptor, delegateExpression, type, trace, scopeForInitializer, dataFlowInfo
)
getterReturnType?.let { approximateType(it, local) } ?: ErrorUtils.createErrorType("Type from delegate")
val delegatedType = getterReturnType?.let { approximateType(it, local) }
?: ErrorUtils.createErrorType("Type from delegate")
transformAnonymousTypeIfNeeded(variableDescriptor, property, delegatedType, trace, anonymousTypeTransformers)
}
private fun resolveInitializerType(
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
import org.jetbrains.kotlin.resolve.DeclarationSignatureAnonymousTypeTransformer
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils.*
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeProjectionImpl
@@ -37,9 +38,9 @@ class KaptAnonymousTypeTransformer : DeclarationSignatureAnonymousTypeTransforme
}
val actualType = when {
isAnonymousObject(declaration) -> {
isAnonymousObject(declaration) || DescriptorUtils.isLocal(declaration) -> {
if (type.constructor.supertypes.size == 1) {
type.constructor.supertypes.iterator().next()
convertPossiblyAnonymousType(type.constructor.supertypes.iterator().next())
} else {
/*
Frontend reports an error on public properties in this case,
@@ -264,6 +264,11 @@ public class ClassFileToSourceStubConverterTestGenerated extends AbstractClassFi
runTest("plugins/kapt3/kapt3-compiler/testData/converter/kt27126.kt");
}
@TestMetadata("lazyProperty.kt")
public void testLazyProperty() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/lazyProperty.kt");
}
@TestMetadata("leadingDollars.kt")
public void testLeadingDollars() throws Exception {
runTest("plugins/kapt3/kapt3-compiler/testData/converter/leadingDollars.kt");
@@ -0,0 +1,28 @@
// WITH_RUNTIME
interface Intf
interface GenericIntf<T>
class Foo {
private val foo by lazy {
object : Runnable {
override fun run() {}
}
}
private val bar by lazy {
object : Runnable, Intf {
override fun run() {}
}
}
private val baz by lazy {
abstract class LocalIntf
object : LocalIntf() {}
}
private val generic1 by lazy {
abstract class LocalIntf : GenericIntf<CharSequence>
object : LocalIntf() {}
}
}
@@ -0,0 +1,47 @@
import java.lang.System;
@kotlin.Metadata()
public final class Foo {
private final kotlin.Lazy foo$delegate = null;
private final kotlin.Lazy bar$delegate = null;
private final kotlin.Lazy baz$delegate = null;
private final kotlin.Lazy generic1$delegate = null;
private final java.lang.Runnable getFoo() {
return null;
}
private final java.lang.Object getBar() {
return null;
}
private final java.lang.Object getBaz() {
return null;
}
private final GenericIntf<java.lang.CharSequence> getGeneric1() {
return null;
}
public Foo() {
super();
}
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public abstract interface GenericIntf<T extends java.lang.Object> {
}
////////////////////
import java.lang.System;
@kotlin.Metadata()
public abstract interface Intf {
}