Android Extensions: Do not upcast ViewStub to View (KT-10321)
This commit is contained in:
+1
-1
@@ -96,7 +96,7 @@ class AndroidExpressionCodegenExtension : ExpressionCodegenExtension {
|
||||
fun isCacheSupported(receiverDescriptor: ClassDescriptor, descriptor: PropertyDescriptor? = null): Boolean {
|
||||
val receiverIsKotlinClass = receiverDescriptor.source is KotlinSourceElement
|
||||
return receiverIsKotlinClass && when (descriptor) {
|
||||
is AndroidSyntheticProperty -> !descriptor.alwaysCastToView
|
||||
is AndroidSyntheticProperty -> descriptor.cacheView
|
||||
else -> true
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.utils.Printer
|
||||
import java.util.*
|
||||
|
||||
class AndroidSyntheticPackageData(
|
||||
val layoutName: String,
|
||||
val moduleData: AndroidModuleData,
|
||||
val forView: Boolean,
|
||||
val isDeprecated: Boolean,
|
||||
@@ -68,7 +69,7 @@ class AndroidSyntheticPackageFragmentDescriptor(
|
||||
}
|
||||
is AndroidResource.Fragment -> if (!packageData.forView) {
|
||||
for ((receiverType, type) in fragmentTypes) {
|
||||
properties += genPropertyForFragment(packageFragmentDescriptor, receiverType, type, resource, context)
|
||||
properties += genPropertyForFragment(packageFragmentDescriptor, receiverType, type, resource)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -52,7 +52,7 @@ abstract class AndroidPackageFragmentProviderExtension : PackageFragmentProvider
|
||||
for ((layoutName, layouts) in variantData) {
|
||||
fun createPackageFragment(fqName: String, forView: Boolean, isDeprecated: Boolean = false) {
|
||||
val resources = layoutXmlFileManager.extractResources(layouts, module)
|
||||
val packageData = AndroidSyntheticPackageData(moduleData, forView, isDeprecated, resources)
|
||||
val packageData = AndroidSyntheticPackageData(layoutName, moduleData, forView, isDeprecated, resources)
|
||||
val packageDescriptor = AndroidSyntheticPackageFragmentDescriptor(
|
||||
module, FqName(fqName), packageData, lazyContext, storageManager)
|
||||
packagesToLookupInCompletion += packageDescriptor
|
||||
|
||||
+9
-12
@@ -66,30 +66,28 @@ internal fun genPropertyForWidget(
|
||||
defaultType.constructor.parameters.map { StarProjectionImpl(it) })
|
||||
} ?: context.viewType
|
||||
|
||||
return genProperty(resolvedWidget.widget.id, receiverType, type, packageFragmentDescriptor, sourceEl, context, resolvedWidget.errorType)
|
||||
return genProperty(resolvedWidget.widget.id, receiverType, type, packageFragmentDescriptor, sourceEl, resolvedWidget.errorType)
|
||||
}
|
||||
|
||||
internal fun genPropertyForFragment(
|
||||
packageFragmentDescriptor: PackageFragmentDescriptor,
|
||||
packageFragmentDescriptor: AndroidSyntheticPackageFragmentDescriptor,
|
||||
receiverType: KotlinType,
|
||||
type: KotlinType,
|
||||
fragment: AndroidResource.Fragment,
|
||||
context: SyntheticElementResolveContext
|
||||
fragment: AndroidResource.Fragment
|
||||
): PropertyDescriptor {
|
||||
val sourceElement = fragment.sourceElement?.let { XmlSourceElement(it) } ?: SourceElement.NO_SOURCE
|
||||
return genProperty(fragment.id, receiverType, type, packageFragmentDescriptor, sourceElement, context, null)
|
||||
return genProperty(fragment.id, receiverType, type, packageFragmentDescriptor, sourceElement, null)
|
||||
}
|
||||
|
||||
private fun genProperty(
|
||||
id: ResourceIdentifier,
|
||||
receiverType: KotlinType,
|
||||
type: KotlinType,
|
||||
containingDeclaration: DeclarationDescriptor,
|
||||
containingDeclaration: AndroidSyntheticPackageFragmentDescriptor,
|
||||
sourceElement: SourceElement,
|
||||
context: SyntheticElementResolveContext,
|
||||
errorType: String?
|
||||
): PropertyDescriptor {
|
||||
val alwaysCastToView = type.constructor.declarationDescriptor?.fqNameUnsafe?.asString() == AndroidConst.VIEWSTUB_FQNAME
|
||||
val cacheView = type.constructor.declarationDescriptor?.fqNameUnsafe?.asString() != AndroidConst.VIEWSTUB_FQNAME
|
||||
|
||||
val property = object : AndroidSyntheticProperty, PropertyDescriptorImpl(
|
||||
containingDeclaration,
|
||||
@@ -104,12 +102,11 @@ private fun genProperty(
|
||||
false,
|
||||
false) {
|
||||
override val errorType = errorType
|
||||
override val alwaysCastToView = alwaysCastToView
|
||||
override val cacheView = cacheView
|
||||
override val resourceId = id
|
||||
}
|
||||
|
||||
val actualType = if (alwaysCastToView) context.viewType else type
|
||||
val flexibleType = DelegatingFlexibleType.create(actualType, actualType.makeNullable(), FlexibleTypeCapabilities.NONE)
|
||||
val flexibleType = DelegatingFlexibleType.create(type, type.makeNullable(), FlexibleTypeCapabilities.NONE)
|
||||
property.setType(
|
||||
flexibleType,
|
||||
emptyList<TypeParameterDescriptor>(),
|
||||
@@ -139,7 +136,7 @@ interface AndroidSyntheticFunction
|
||||
|
||||
interface AndroidSyntheticProperty {
|
||||
val errorType: String?
|
||||
val alwaysCastToView: Boolean
|
||||
val cacheView: Boolean
|
||||
val resourceId: ResourceIdentifier
|
||||
|
||||
val isErrorType: Boolean
|
||||
|
||||
Reference in New Issue
Block a user