ParameterBuilder refactoring

This commit is contained in:
Michael Bogdanov
2015-09-29 10:30:14 +03:00
parent 85f7c174cd
commit 03158ed9c3
4 changed files with 22 additions and 30 deletions
@@ -82,15 +82,6 @@ public class AnonymousObjectTransformer {
typeRemapper = new TypeRemapper(inliningContext.typeMapping);
}
private void buildInvokeParamsFor(@NotNull ParametersBuilder builder, @NotNull MethodNode node) {
builder.addThis(oldObjectType, false);
Type[] types = Type.getArgumentTypes(node.desc);
for (Type type : types) {
builder.addNextParameter(type, false, null);
}
}
@NotNull
public InlineResult doTransform(@NotNull AnonymousObjectGeneration anonymousObjectGen, @NotNull FieldRemapper parentRemapper) {
ClassBuilder classBuilder = createClassBuilder();
@@ -346,8 +337,7 @@ public class AnonymousObjectTransformer {
@NotNull ParametersBuilder capturedBuilder,
@NotNull MethodNode sourceNode
) {
ParametersBuilder builder = ParametersBuilder.newBuilder();
buildInvokeParamsFor(builder, sourceNode);
ParametersBuilder builder = ParametersBuilder.initializeBuilderFrom(oldObjectType, sourceNode.desc);
for (CapturedParamInfo param : capturedBuilder.listCaptured()) {
builder.addCapturedParamCopy(param);
}
@@ -24,12 +24,11 @@ import org.jetbrains.kotlin.codegen.context.EnclosedValueDescriptor;
import org.jetbrains.kotlin.codegen.state.JetTypeMapper;
import org.jetbrains.kotlin.descriptors.ClassDescriptor;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.psi.JetExpression;
import org.jetbrains.kotlin.psi.JetFunctionLiteralExpression;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.resolve.jvm.AsmTypes;
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature;
import org.jetbrains.org.objectweb.asm.Type;
import org.jetbrains.org.objectweb.asm.tree.FieldInsnNode;
@@ -152,22 +151,9 @@ public class LambdaInfo implements CapturedParamOwner, LabelOwner {
@NotNull
public Parameters addAllParameters(FieldRemapper remapper) {
ParametersBuilder builder = ParametersBuilder.newBuilder();
//add skipped this cause inlined lambda doesn't have it
builder.addThis(AsmTypes.OBJECT_TYPE, true).setLambda(this);
FunctionDescriptor lambdaDescriptor = getFunctionDescriptor();
ReceiverParameterDescriptor extensionParameter = lambdaDescriptor.getExtensionReceiverParameter();
if (extensionParameter != null) {
Type type = typeMapper.mapType(extensionParameter.getType());
builder.addNextParameter(type, false, null);
}
List<ValueParameterDescriptor> valueParameters = lambdaDescriptor.getValueParameters();
for (ValueParameterDescriptor parameter : valueParameters) {
Type type = typeMapper.mapType(parameter.getType());
builder.addNextParameter(type, false, null);
}
JvmMethodSignature signature = typeMapper.mapSignature(getFunctionDescriptor());
ParametersBuilder builder =
ParametersBuilder.initializeBuilderFrom(AsmTypes.OBJECT_TYPE, signature.getAsmMethod().getDescriptor(), this);
for (CapturedParamDesc info : getCapturedVars()) {
CapturedParamInfo field = remapper.findField(new FieldInsnNode(0, info.getContainingLambdaName(), info.getFieldName(), ""));
@@ -82,7 +82,7 @@ class ParameterInfo {
return lambda;
}
public void setLambda(LambdaInfo lambda) {
public void setLambda(@Nullable LambdaInfo lambda) {
this.lambda = lambda;
}
@@ -141,4 +141,20 @@ public class ParametersBuilder {
public int getNextValueParameterIndex() {
return nextIndex;
}
public static ParametersBuilder initializeBuilderFrom(@NotNull Type objectType, @NotNull String descriptor) {
return initializeBuilderFrom(objectType, descriptor, null);
}
public static ParametersBuilder initializeBuilderFrom(@NotNull Type objectType, @NotNull String descriptor, @Nullable LambdaInfo inlineLambda) {
ParametersBuilder builder = newBuilder();
//skipped this for inlined lambda cause it will be removed
builder.addThis(objectType, inlineLambda != null).setLambda(inlineLambda);
Type[] types = Type.getArgumentTypes(descriptor);
for (Type type : types) {
builder.addNextParameter(type, false, null);
}
return builder;
}
}