diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index c10ef5b387a..27d71186619 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -1358,14 +1358,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { @Override public void visitThisExpression(JetThisExpression expression) { DeclarationDescriptor descriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getInstanceReference()); - if (descriptor instanceof ClassDescriptor) { - // @todo for now all our classes are inner so no need to lookup this. change it when we have real inners - } - else { - assert descriptor instanceof CallableDescriptor; - if (context.getCallableDescriptorWithReceiver() != descriptor) { - context.lookupInContext(descriptor, null, state, true); - } + assert descriptor instanceof CallableDescriptor || + descriptor instanceof ClassDescriptor : "'This' reference target should be class or callable descriptor but was " + descriptor; + if (context.getCallableDescriptorWithReceiver() != descriptor) { + context.lookupInContext(descriptor, null, state, true); } } }; diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java index 64355ed58cd..9841af9ba65 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/CodegenContext.java @@ -338,7 +338,13 @@ public abstract class CodegenContext { result = result == null || myOuter == null ? myOuter : StackValue.composed(result, myOuter); } - StackValue resultValue = parentContext != null ? parentContext.lookupInContext(d, result, state, ignoreNoOuter) : null; + StackValue resultValue; + if (myOuter != null && getEnclosingClass() == d) { + resultValue = result; + } else { + resultValue = parentContext != null ? parentContext.lookupInContext(d, result, state, ignoreNoOuter) : null; + } + if (myOuter != null && resultValue != null) { closure.setCaptureThis(); } diff --git a/compiler/testData/codegen/box/objects/kt4086.kt b/compiler/testData/codegen/box/objects/kt4086.kt new file mode 100644 index 00000000000..e28c8e5fca4 --- /dev/null +++ b/compiler/testData/codegen/box/objects/kt4086.kt @@ -0,0 +1,12 @@ +trait N + +open class Base(n: N) + +class Derived : Base(object: N{}) { + +} + +fun box() : String { + Derived() + return "OK" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 714cfbc3e8e..a2e37e0f4ad 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3466,6 +3466,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/objects/kt3684.kt"); } + @TestMetadata("kt4086.kt") + public void testKt4086() throws Exception { + doTest("compiler/testData/codegen/box/objects/kt4086.kt"); + } + @TestMetadata("kt535.kt") public void testKt535() throws Exception { doTest("compiler/testData/codegen/box/objects/kt535.kt");