pull generateTraitMethods() out of generatePrimaryConstructor(), don't inappropriately reuse ExpressionCodegen
This commit is contained in:
@@ -291,6 +291,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
throw new RuntimeException("Error generating primary constructor of class " + myClass.getName() + " with kind " + kind, e);
|
throw new RuntimeException("Error generating primary constructor of class " + myClass.getName() + " with kind " + kind, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
generateTraitMethods();
|
||||||
|
|
||||||
generateAccessors();
|
generateAccessors();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -736,22 +738,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
|
|
||||||
generateInitializers(codegen, iv, myClass.getDeclarations(), bindingContext, typeMapper);
|
generateInitializers(codegen, iv, myClass.getDeclarations(), bindingContext, typeMapper);
|
||||||
|
|
||||||
generateTraitMethods(codegen);
|
|
||||||
|
|
||||||
mv.visitInsn(RETURN);
|
mv.visitInsn(RETURN);
|
||||||
FunctionCodegen.endVisit(mv, "constructor", myClass);
|
FunctionCodegen.endVisit(mv, "constructor", myClass);
|
||||||
|
|
||||||
FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor, OwnerKind.IMPLEMENTATION);
|
FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor, OwnerKind.IMPLEMENTATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void generateTraitMethods(ExpressionCodegen codegen) {
|
private void generateTraitMethods() {
|
||||||
if (myClass instanceof JetClass && (((JetClass)myClass).isTrait() || ((JetClass)myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD)))
|
if (myClass instanceof JetClass && (((JetClass)myClass).isTrait() || ((JetClass)myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (Pair<CallableMemberDescriptor, CallableMemberDescriptor> needDelegates : getTraitImplementations(descriptor)) {
|
for (Pair<CallableMemberDescriptor, CallableMemberDescriptor> needDelegates : getTraitImplementations(descriptor)) {
|
||||||
CallableMemberDescriptor callableDescriptor = needDelegates.first;
|
CallableMemberDescriptor callableDescriptor = needDelegates.first;
|
||||||
if (needDelegates.second instanceof SimpleFunctionDescriptor) {
|
if (needDelegates.second instanceof SimpleFunctionDescriptor) {
|
||||||
generateDelegationToTraitImpl(codegen, (FunctionDescriptor) needDelegates.second, (FunctionDescriptor) needDelegates.first);
|
generateDelegationToTraitImpl((FunctionDescriptor) needDelegates.second, (FunctionDescriptor) needDelegates.first);
|
||||||
}
|
}
|
||||||
else if (needDelegates.second instanceof PropertyDescriptor) {
|
else if (needDelegates.second instanceof PropertyDescriptor) {
|
||||||
PropertyDescriptor property = (PropertyDescriptor) needDelegates.second;
|
PropertyDescriptor property = (PropertyDescriptor) needDelegates.second;
|
||||||
@@ -759,7 +759,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
for (PropertyAccessorDescriptor accessor : property.getAccessors()) {
|
for (PropertyAccessorDescriptor accessor : property.getAccessors()) {
|
||||||
for (PropertyAccessorDescriptor inheritedAccessor : inheritedAccessors) {
|
for (PropertyAccessorDescriptor inheritedAccessor : inheritedAccessors) {
|
||||||
if (inheritedAccessor.getClass() == accessor.getClass()) { // same accessor kind
|
if (inheritedAccessor.getClass() == accessor.getClass()) { // same accessor kind
|
||||||
generateDelegationToTraitImpl(codegen, accessor, inheritedAccessor);
|
generateDelegationToTraitImpl(accessor, inheritedAccessor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -768,7 +768,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private void generateDelegationToTraitImpl(ExpressionCodegen codegen, FunctionDescriptor fun, @NotNull FunctionDescriptor inheritedFun) {
|
private void generateDelegationToTraitImpl(FunctionDescriptor fun, @NotNull FunctionDescriptor inheritedFun) {
|
||||||
DeclarationDescriptor containingDeclaration = fun.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = fun.getContainingDeclaration();
|
||||||
if (containingDeclaration instanceof ClassDescriptor) {
|
if (containingDeclaration instanceof ClassDescriptor) {
|
||||||
ClassDescriptor declaration = (ClassDescriptor) containingDeclaration;
|
ClassDescriptor declaration = (ClassDescriptor) containingDeclaration;
|
||||||
@@ -822,8 +822,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
|
else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
|
||||||
mv.visitCode();
|
mv.visitCode();
|
||||||
|
FrameMap frameMap = context.prepareFrame(state.getInjector().getJetTypeMapper());
|
||||||
codegen.generateThisOrOuter(descriptor);
|
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
|
||||||
|
codegen.generateThisOrOuter(descriptor); // ??? wouldn't it be a good idea to put it?
|
||||||
|
|
||||||
Type[] argTypes = function.getArgumentTypes();
|
Type[] argTypes = function.getArgumentTypes();
|
||||||
InstructionAdapter iv = new InstructionAdapter(mv);
|
InstructionAdapter iv = new InstructionAdapter(mv);
|
||||||
|
|||||||
Reference in New Issue
Block a user