From 6c274cecff370775eeb490b2049f489997964014 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 28 Jun 2017 16:40:27 +0300 Subject: [PATCH] Protect getSingleAbstractMethodOrNull from data binding deadlock Now it cannot cause resolve re-entrance Probably #KT-18687 Fixed --- .../kotlin/load/java/sam/SingleAbstractMethodUtils.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java index 6a0ccd97509..bec9f365b7c 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/java/sam/SingleAbstractMethodUtils.java @@ -129,12 +129,16 @@ public class SingleAbstractMethodUtils { @Nullable public static FunctionDescriptor getSingleAbstractMethodOrNull(@NotNull JavaClassDescriptor klass) { - if (klass.isDefinitelyNotSamInterface()) return null; - + // NB: this check MUST BE at start. Please do not touch until following to-do is resolved + // Otherwise android data binding can cause resolve re-entrance + // For details see KT-18687, KT-16149 + // TODO: prevent resolve re-entrance on architecture level, or (alternatively) ask data binding owners not to do it if (DescriptorUtilsKt.getFqNameSafe(klass).asString().equals("android.databinding.DataBindingComponent")) { return null; } + if (klass.isDefinitelyNotSamInterface()) return null; + List abstractMembers = getAbstractMembers(klass.getDefaultType()); if (abstractMembers.size() == 1) { CallableMemberDescriptor member = abstractMembers.get(0);