Android Extensions: Do not upcast ViewStub to View (KT-10321)

This commit is contained in:
Yan Zhulanow
2016-03-25 17:58:56 +03:00
parent 6e14c11280
commit 371e80bcba
6 changed files with 17 additions and 19 deletions
@@ -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
}
}
@@ -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)
}
}
}
@@ -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
@@ -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