[KAPT+IR] Use ErrorType for unresolved delegate class.
^KT-57946
This commit is contained in:
committed by
Alexander Udalov
parent
1801277a0c
commit
699ad87be2
@@ -53,6 +53,8 @@ import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
|||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import org.jetbrains.kotlin.types.TypeProjectionImpl
|
import org.jetbrains.kotlin.types.TypeProjectionImpl
|
||||||
import org.jetbrains.kotlin.types.TypeSubstitutor
|
import org.jetbrains.kotlin.types.TypeSubstitutor
|
||||||
|
import org.jetbrains.kotlin.types.error.ErrorTypeKind
|
||||||
|
import org.jetbrains.kotlin.types.error.ErrorUtils.createErrorType
|
||||||
import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize
|
import org.jetbrains.kotlin.utils.newHashMapWithExpectedSize
|
||||||
|
|
||||||
@ObsoleteDescriptorBasedAPI
|
@ObsoleteDescriptorBasedAPI
|
||||||
@@ -199,7 +201,11 @@ internal class ClassGenerator(
|
|||||||
delegateNumber: Int
|
delegateNumber: Int
|
||||||
) {
|
) {
|
||||||
val ktDelegateExpression = ktEntry.delegateExpression!!
|
val ktDelegateExpression = ktEntry.delegateExpression!!
|
||||||
val delegateType = getTypeInferredByFrontendOrFail(ktDelegateExpression)
|
val delegateType = if (context.configuration.generateBodies) {
|
||||||
|
getTypeInferredByFrontendOrFail(ktDelegateExpression)
|
||||||
|
} else {
|
||||||
|
getTypeInferredByFrontend(ktDelegateExpression) ?: createErrorType(ErrorTypeKind.UNRESOLVED_TYPE, ktDelegateExpression.text)
|
||||||
|
}
|
||||||
val superType = getOrFail(BindingContext.TYPE, ktEntry.typeReference!!)
|
val superType = getOrFail(BindingContext.TYPE, ktEntry.typeReference!!)
|
||||||
|
|
||||||
val superTypeConstructorDescriptor = superType.constructor.declarationDescriptor
|
val superTypeConstructorDescriptor = superType.constructor.declarationDescriptor
|
||||||
@@ -212,11 +218,16 @@ internal class ClassGenerator(
|
|||||||
irClass.properties.first { it.descriptor == propertyDescriptor }.backingField!!
|
irClass.properties.first { it.descriptor == propertyDescriptor }.backingField!!
|
||||||
} else {
|
} else {
|
||||||
val delegateDescriptor = IrImplementingDelegateDescriptorImpl(irClass.descriptor, delegateType, superType, delegateNumber)
|
val delegateDescriptor = IrImplementingDelegateDescriptorImpl(irClass.descriptor, delegateType, superType, delegateNumber)
|
||||||
|
val initializer = if (context.configuration.generateBodies) {
|
||||||
|
createBodyGenerator(irClass.symbol).generateExpressionBody(ktDelegateExpression)
|
||||||
|
} else {
|
||||||
|
null
|
||||||
|
}
|
||||||
context.symbolTable.declareField(
|
context.symbolTable.declareField(
|
||||||
ktDelegateExpression.startOffsetSkippingComments, ktDelegateExpression.endOffset,
|
ktDelegateExpression.startOffsetSkippingComments, ktDelegateExpression.endOffset,
|
||||||
IrDeclarationOrigin.DELEGATE,
|
IrDeclarationOrigin.DELEGATE,
|
||||||
delegateDescriptor, delegateDescriptor.type.toIrType(),
|
delegateDescriptor, delegateDescriptor.type.toIrType(),
|
||||||
createBodyGenerator(irClass.symbol).generateExpressionBody(ktDelegateExpression)
|
initializer
|
||||||
).apply {
|
).apply {
|
||||||
irClass.addMember(this)
|
irClass.addMember(this)
|
||||||
}
|
}
|
||||||
|
|||||||
+31
@@ -33,6 +33,37 @@ public class C {
|
|||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE"})
|
||||||
|
public final class D implements I {
|
||||||
|
|
||||||
|
public D() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE", "DELEGATION_NOT_TO_INTERFACE"})
|
||||||
|
public final class E implements NonExisting {
|
||||||
|
|
||||||
|
public E() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
public abstract interface I {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
@kotlin.Metadata()
|
@kotlin.Metadata()
|
||||||
public final class UnresolvedDelegateExpressionKt {
|
public final class UnresolvedDelegateExpressionKt {
|
||||||
|
|
||||||
|
|||||||
+8
@@ -9,4 +9,12 @@ class B : NonExisting {
|
|||||||
val a: String by flaf()
|
val a: String by flaf()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface I
|
||||||
|
|
||||||
|
@Suppress("UNRESOLVED_REFERENCE")
|
||||||
|
class D : I by NonExisting
|
||||||
|
|
||||||
fun C.flaf() = "OK"
|
fun C.flaf() = "OK"
|
||||||
|
|
||||||
|
@Suppress("UNRESOLVED_REFERENCE", "DELEGATION_NOT_TO_INTERFACE")
|
||||||
|
class E : NonExisting by NonExisting
|
||||||
|
|||||||
+31
@@ -33,6 +33,37 @@ public class C {
|
|||||||
////////////////////
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE"})
|
||||||
|
public final class D implements I {
|
||||||
|
|
||||||
|
public D() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
@kotlin.Suppress(names = {"UNRESOLVED_REFERENCE", "DELEGATION_NOT_TO_INTERFACE"})
|
||||||
|
public final class E implements NonExisting {
|
||||||
|
|
||||||
|
public E() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
|
@kotlin.Metadata()
|
||||||
|
public abstract interface I {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////
|
||||||
|
|
||||||
|
|
||||||
@kotlin.Metadata()
|
@kotlin.Metadata()
|
||||||
public final class UnresolvedDelegateExpressionKt {
|
public final class UnresolvedDelegateExpressionKt {
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user