minor ObjectIntrinsics refactoring

This commit is contained in:
Anton Bannykh
2018-03-01 15:43:32 +03:00
committed by Anton Bannykh
parent 60e487dcec
commit 2352dc3d1c
3 changed files with 12 additions and 14 deletions
@@ -43,7 +43,7 @@ class Intrinsics {
return functionIntrinsics.getIntrinsic(descriptor)
}
fun getObjectIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic {
fun getObjectIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic? {
return objectIntrinsics.getIntrinsic(classDescriptor)
}
}
@@ -30,15 +30,21 @@ class DefaultClassObjectIntrinsic( val fqName: FqName): ObjectIntrinsic {
}
class ObjectIntrinsics {
private val cache = mutableMapOf<ClassDescriptor, ObjectIntrinsic>()
private val cache = mutableMapOf<ClassDescriptor, ObjectIntrinsic?>()
fun getIntrinsic(classDescriptor: ClassDescriptor) = cache.getOrPut(classDescriptor) { createIntrinsic(classDescriptor) }
fun getIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic? {
if (classDescriptor in cache) return cache[classDescriptor]
private fun createIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic {
return createIntrinsic(classDescriptor).also {
cache[classDescriptor] = it
}
}
private fun createIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic? {
if (classDescriptor.fqNameUnsafe == KotlinBuiltIns.FQ_NAMES._enum ||
!CompanionObjectMapping.isMappedIntrinsicCompanionObject(classDescriptor)
) {
return NO_OBJECT_INTRINSIC
return null
}
val containingDeclaration = classDescriptor.containingDeclaration
@@ -50,12 +56,4 @@ class ObjectIntrinsics {
interface ObjectIntrinsic {
fun apply(context: TranslationContext): JsExpression
fun exists(): Boolean = true
}
object NO_OBJECT_INTRINSIC : ObjectIntrinsic {
override fun apply(context: TranslationContext): JsExpression =
throw UnsupportedOperationException("ObjectIntrinsic#NO_OBJECT_INTRINSIC_#apply")
override fun exists(): Boolean = false
}
@@ -44,7 +44,7 @@ public class CompanionObjectIntrinsicAccessTranslator extends AbstractTranslator
@NotNull TranslationContext context
) {
DeclarationDescriptor descriptor = getDescriptorForReferenceExpression(context.bindingContext(), expression);
return descriptor instanceof ClassDescriptor && context.intrinsics().getObjectIntrinsic((ClassDescriptor) descriptor).exists();
return descriptor instanceof ClassDescriptor && context.intrinsics().getObjectIntrinsic((ClassDescriptor) descriptor) != null;
}
@NotNull