[KT-4124] Fix bug when inner A.B extends inner A.C not passing outer reference there

This commit is contained in:
Alexey Andreev
2016-02-10 18:50:28 +03:00
parent 8f74720973
commit 700159987b
@@ -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.js.translate.utils.jsAstUtils.AstUtilsKt;
import org.jetbrains.kotlin.lexer.KtTokens; import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.*; 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.callUtil.CallUtilKt;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
@@ -94,7 +96,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator {
// for properties declared as constructor parameters // for properties declared as constructor parameters
initFunction.getParameters().addAll(translatePrimaryConstructorParameters()); initFunction.getParameters().addAll(translatePrimaryConstructorParameters());
mayBeAddCallToSuperMethod(initFunction); mayBeAddCallToSuperMethod(initFunction, classDescriptor);
} }
delegationTranslator.addInitCode(initializerStatements); delegationTranslator.addInitCode(initializerStatements);
@@ -143,7 +145,7 @@ public final class ClassInitializerTranslator extends AbstractTranslator {
return CallTranslator.translate(context(), superCall); return CallTranslator.translate(context(), superCall);
} }
private void mayBeAddCallToSuperMethod(JsFunction initializer) { private void mayBeAddCallToSuperMethod(JsFunction initializer, @NotNull ClassDescriptor descriptor) {
if (classDeclaration.hasModifier(KtTokens.ENUM_KEYWORD)) { if (classDeclaration.hasModifier(KtTokens.ENUM_KEYWORD)) {
addCallToSuperMethod(Collections.<JsExpression>emptyList(), initializer); addCallToSuperMethod(Collections.<JsExpression>emptyList(), initializer);
return; return;
@@ -159,6 +161,13 @@ public final class ClassInitializerTranslator extends AbstractTranslator {
} }
else { else {
List<JsExpression> arguments = CallArgumentTranslator.translate(superCall, null, context()).getTranslateArguments(); List<JsExpression> 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<JsExpression>(arguments);
arguments.add(0, new JsNameRef("$outer", JsLiteral.THIS));
}
addCallToSuperMethod(arguments, initializer); addCallToSuperMethod(arguments, initializer);
} }
} }