diff options
Diffstat (limited to 'src/main/java/ftbsc/lll/proxies/MethodProxy.java')
-rw-r--r-- | src/main/java/ftbsc/lll/proxies/MethodProxy.java | 86 |
1 files changed, 65 insertions, 21 deletions
diff --git a/src/main/java/ftbsc/lll/proxies/MethodProxy.java b/src/main/java/ftbsc/lll/proxies/MethodProxy.java index 5f80c08..5d014e9 100644 --- a/src/main/java/ftbsc/lll/proxies/MethodProxy.java +++ b/src/main/java/ftbsc/lll/proxies/MethodProxy.java @@ -4,6 +4,7 @@ import org.objectweb.asm.Type; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import static ftbsc.lll.tools.DescriptorBuilder.nameToDescriptor; @@ -16,39 +17,43 @@ import static ftbsc.lll.tools.DescriptorBuilder.nameToDescriptor; public class MethodProxy extends AbstractProxy { /** - * The parameters of the method. + * An array of {@link ClassProxy} each representing the parameters of the method. */ - public final Type[] parameters; + public final ClassProxy[] parameters; /** - * The return type of the method. + * The {@link ClassProxy} for the return type of the method. */ - public final Type returnType; - - /** - * A public constructor, builds a proxy from a {@link Method} - * obtained from reflection. - * @param m the {@link Method} object corresponding to this. - */ - public MethodProxy(Method m) { - super(m.getName(), Type.getType(m), m.getModifiers(), Type.getInternalName(m.getDeclaringClass())); - Type mt = Type.getType(m); - this.parameters = mt.getArgumentTypes(); - this.returnType = mt.getReturnType(); - } + public final ClassProxy returnType; /** * A protected constructor, called only from the builder. * @param name the name of the method * @param modifiers the modifiers of the method - * @param parent the FQN of the parent class of the method + * @param parent the {@link QualifiableProxy} for the parent * @param parameters the parameters of the method * @param returnType the return type of the method */ - protected MethodProxy(String name, int modifiers, String parent, Type[] parameters, Type returnType) { + protected MethodProxy(String name, int modifiers, QualifiableProxy parent, Type[] parameters, Type returnType) { super(name, Type.getMethodType(returnType, parameters), modifiers, parent); - this.parameters = parameters; - this.returnType = returnType; + this.parameters = Arrays.stream(parameters) + .map(t -> ClassProxy.from(t, 0)) + .toArray(ClassProxy[]::new); + this.returnType = ClassProxy.from(returnType, 0); + } + + /** + * A public constructor, builds a proxy from a {@link Method} + * obtained from reflection. + * @param m the {@link Method} object corresponding to this. + */ + public MethodProxy(Method m) { + this(m.getName(), + m.getModifiers(), + ClassProxy.from(m.getDeclaringClass()), + Type.getArgumentTypes(m), + Type.getReturnType(m) + ); } /** @@ -61,6 +66,19 @@ public class MethodProxy extends AbstractProxy { } /** + * Indicates whether the given object is a proxy for the same element as this. + * @param obj the object to perform + * @return true if it's equal + */ + @Override + public boolean equals(Object obj) { + if(obj instanceof MethodProxy) { + MethodProxy m = (MethodProxy) obj; + return super.equals(obj) && m.returnType.equals(this.returnType) && Arrays.equals(m.parameters, this.parameters); + } else return false; + } + + /** * A builder object for {@link MethodProxy}. */ public static class Builder extends AbstractProxy.Builder<MethodProxy> { @@ -118,6 +136,27 @@ public class MethodProxy extends AbstractProxy { } /** + * Sets the parent class of this method to the one described by the + * fully qualified name and with the given modifiers. + * @param parentFQN the fully qualified name of the parent + * @return the builder's state after the change + */ + public Builder setParent(String parentFQN, int modifiers) { + super.setParent(ClassProxy.from(parentFQN, 0, modifiers)); + return this; + } + + /** + * Sets the parent class of this method to the one described by the + * fully qualified name. + * @param parentFQN the fully qualified name of the parent + * @return the builder's state after the change + */ + public Builder setParent(String parentFQN) { + return this.setParent(parentFQN, 0); + } + + /** * Sets the return type to the given type. * @param returnType the {@link Class} object corresponding to * the return type @@ -134,7 +173,12 @@ public class MethodProxy extends AbstractProxy { */ @Override public MethodProxy build() { - return new MethodProxy(name, modifiers, parent, parameters.toArray(new Type[0]), returnType); + return new MethodProxy( + this.name, + this.modifiers, + this.parent, + this.parameters.toArray(new Type[0]), + this.returnType); } } } |