package org.jf.dexlib2.immutable.reference;
import com.google.common.collect.ImmutableList;
import org.jf.dexlib2.base.reference.BaseCallSiteReference;
import org.jf.dexlib2.iface.reference.CallSiteReference;
import org.jf.dexlib2.iface.reference.MethodHandleReference;
import org.jf.dexlib2.iface.reference.MethodProtoReference;
import org.jf.dexlib2.iface.value.EncodedValue;
import org.jf.dexlib2.immutable.value.ImmutableEncodedValue;
import org.jf.dexlib2.immutable.value.ImmutableEncodedValueFactory;
import org.jf.util.ImmutableUtils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.List;
public class ImmutableCallSiteReference extends BaseCallSiteReference implements ImmutableReference {
@Nonnull protected final String name;
@Nonnull protected final ImmutableMethodHandleReference methodHandle;
@Nonnull protected final String methodName;
@Nonnull protected final ImmutableMethodProtoReference methodProto;
@Nonnull protected final ImmutableList<? extends ImmutableEncodedValue> ;
public ImmutableCallSiteReference(@Nonnull String name, @Nonnull MethodHandleReference methodHandle,
@Nonnull String methodName, @Nonnull MethodProtoReference methodProto,
@Nonnull Iterable<? extends EncodedValue> extraArguments) {
this.name = name;
this.methodHandle = ImmutableMethodHandleReference.of(methodHandle);
this.methodName = methodName;
this.methodProto = ImmutableMethodProtoReference.of(methodProto);
this.extraArguments = ImmutableEncodedValueFactory.immutableListOf(extraArguments);
}
public ImmutableCallSiteReference(@Nonnull String name, @Nonnull ImmutableMethodHandleReference methodHandle,
@Nonnull String methodName, @Nonnull ImmutableMethodProtoReference methodProto,
@Nullable ImmutableList<? extends ImmutableEncodedValue> extraArguments) {
this.name = name;
this.methodHandle = methodHandle;
this.methodName = methodName;
this.methodProto = methodProto;
this.extraArguments = ImmutableUtils.nullToEmptyList(extraArguments);
}
@Nonnull
public static ImmutableCallSiteReference of(@Nonnull CallSiteReference callSiteReference) {
if (callSiteReference instanceof ImmutableCallSiteReference) {
return (ImmutableCallSiteReference) callSiteReference;
}
return new ImmutableCallSiteReference(callSiteReference.getName(),
ImmutableMethodHandleReference.of(callSiteReference.getMethodHandle()),
callSiteReference.getMethodName(),
ImmutableMethodProtoReference.of(callSiteReference.getMethodProto()),
ImmutableEncodedValueFactory.immutableListOf(callSiteReference.getExtraArguments()));
}
@Nonnull @Override public String getName() { return name; }
@Nonnull @Override public MethodHandleReference getMethodHandle() { return methodHandle; }
@Nonnull @Override public String getMethodName() { return methodName; }
@Nonnull @Override public MethodProtoReference getMethodProto() { return methodProto; }
@Nonnull @Override public List<? extends EncodedValue> () { return extraArguments; }
}