diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.kt index 3e33488cb33..689397ec0fc 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/Intrinsics.kt @@ -43,7 +43,7 @@ class Intrinsics { return functionIntrinsics.getIntrinsic(descriptor) } - fun getObjectIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic { + fun getObjectIntrinsic(classDescriptor: ClassDescriptor): ObjectIntrinsic? { return objectIntrinsics.getIntrinsic(classDescriptor) } } \ No newline at end of file diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt index 877ccd61147..e9005be5726 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/objects/objectsIntrinsics.kt @@ -30,15 +30,21 @@ class DefaultClassObjectIntrinsic( val fqName: FqName): ObjectIntrinsic { } class ObjectIntrinsics { - private val cache = mutableMapOf() + private val cache = mutableMapOf() - 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 } diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CompanionObjectIntrinsicAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CompanionObjectIntrinsicAccessTranslator.java index 96fd1894027..83f439ae2e9 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CompanionObjectIntrinsicAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CompanionObjectIntrinsicAccessTranslator.java @@ -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