From 700159987b5734675b2e38f84e9ccdfda3e848eb Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 10 Feb 2016 18:50:28 +0300 Subject: [PATCH] [KT-4124] Fix bug when inner A.B extends inner A.C not passing outer reference there --- .../initializer/ClassInitializerTranslator.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java index 580e38a836d..2d9ed12a71d 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/initializer/ClassInitializerTranslator.java @@ -30,6 +30,8 @@ import org.jetbrains.kotlin.js.translate.reference.CallArgumentTranslator; import org.jetbrains.kotlin.js.translate.utils.jsAstUtils.AstUtilsKt; import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.psi.*; +import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; +import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.types.KotlinType; @@ -94,7 +96,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { // for properties declared as constructor parameters initFunction.getParameters().addAll(translatePrimaryConstructorParameters()); - mayBeAddCallToSuperMethod(initFunction); + mayBeAddCallToSuperMethod(initFunction, classDescriptor); } delegationTranslator.addInitCode(initializerStatements); @@ -143,7 +145,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator { return CallTranslator.translate(context(), superCall); } - private void mayBeAddCallToSuperMethod(JsFunction initializer) { + private void mayBeAddCallToSuperMethod(JsFunction initializer, @NotNull ClassDescriptor descriptor) { if (classDeclaration.hasModifier(KtTokens.ENUM_KEYWORD)) { addCallToSuperMethod(Collections.emptyList(), initializer); return; @@ -159,6 +161,13 @@ public final class ClassInitializerTranslator extends AbstractTranslator { } else { List arguments = CallArgumentTranslator.translate(superCall, null, context()).getTranslateArguments(); + ClassDescriptor superDescriptor = DescriptorUtils.getSuperClassDescriptor(descriptor); + assert superDescriptor != null : "This class is expected to have super class: " + + PsiUtilsKt.getTextWithLocation(classDeclaration); + if (superDescriptor.isInner() && descriptor.isInner()) { + arguments = new ArrayList(arguments); + arguments.add(0, new JsNameRef("$outer", JsLiteral.THIS)); + } addCallToSuperMethod(arguments, initializer); } }