diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 8e38c8e9e1e..3e8dbab9d51 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -372,6 +372,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { DelegationFieldsInfo delegationFieldsInfo = getDelegationFieldsInfo(myClass.getDelegationSpecifiers()); try { + lookupConstructorExpressionsInClosureIfPresent(); generatePrimaryConstructor(delegationFieldsInfo); } catch (CompilationException e) { @@ -1076,10 +1077,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ConstructorContext constructorContext = context.intoConstructor(constructorDescriptor); - if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { - lookupConstructorExpressionsInClosureIfPresent(constructorContext); - } - functionCodegen.generateMethod(OtherOrigin(myClass, constructorDescriptor), constructorDescriptor, constructorContext, new FunctionGenerationStrategy.CodegenBased(state, constructorDescriptor) { @Override @@ -1256,7 +1253,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } } - private void lookupConstructorExpressionsInClosureIfPresent(final ConstructorContext constructorContext) { + private void lookupConstructorExpressionsInClosureIfPresent() { + if (state.getClassBuilderMode() != ClassBuilderMode.FULL || descriptor.getConstructors().isEmpty()) return; + JetVisitorVoid visitor = new JetVisitorVoid() { @Override public void visitJetElement(@NotNull JetElement e) { @@ -1275,15 +1274,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { toLookup = descriptor.getContainingDeclaration(); } else if (descriptor instanceof VariableDescriptor) { - ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) constructorContext.getContextDescriptor(); - for (ValueParameterDescriptor parameterDescriptor : constructorDescriptor.getValueParameters()) { - if (descriptor.equals(parameterDescriptor)) return; + if (descriptor.getContainingDeclaration() instanceof ConstructorDescriptor) { + ClassDescriptor classDescriptor = + (ClassDescriptor) descriptor.getContainingDeclaration().getContainingDeclaration(); + if (classDescriptor == ImplementationBodyCodegen.this.descriptor) return; } toLookup = descriptor; } else return; - constructorContext.lookupInContext(toLookup, StackValue.LOCAL_0, state, true); + context.lookupInContext(toLookup, StackValue.LOCAL_0, state, true); } @Override @@ -1296,7 +1296,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { } if (descriptor instanceof CallableDescriptor) { - constructorContext.generateReceiver((CallableDescriptor) descriptor, state, true); + ReceiverParameterDescriptor parameter = ((CallableDescriptor) descriptor).getExtensionReceiverParameter(); + if (parameter != null) { + context.lookupInContext(parameter, StackValue.LOCAL_0, state, true); + } } } }; @@ -1326,7 +1329,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ClassDescriptor superClass = DescriptorUtilPackage.getSuperClassNotAny(descriptor); if (superClass != null) { if (superClass.isInner()) { - constructorContext.lookupInContext(superClass.getContainingDeclaration(), StackValue.LOCAL_0, state, true); + context.lookupInContext(superClass.getContainingDeclaration(), StackValue.LOCAL_0, state, true); } if (!isAnonymousObject(descriptor)) {