Skip to content

Commit

Permalink
Added specific classes for synthetic methods to seperate responsibili…
Browse files Browse the repository at this point in the history
…ties better.
  • Loading branch information
Rafael Winterhalter committed Jul 7, 2015
1 parent b952921 commit 762a06f
Show file tree
Hide file tree
Showing 8 changed files with 393 additions and 147 deletions.
Expand Up @@ -294,6 +294,7 @@ public GenericTypeDescription onRawType(TypeDescription typeDescription) {
int arity = 0; int arity = 0;
while (typeDescription.isArray()) { while (typeDescription.isArray()) {
typeDescription = typeDescription.getComponentType(); typeDescription = typeDescription.getComponentType();
arity++;
} }
return TypeDescription.ArrayProjection.of(onComponentType(typeDescription), arity); return TypeDescription.ArrayProjection.of(onComponentType(typeDescription), arity);
} }
Expand Down Expand Up @@ -363,9 +364,7 @@ public GenericTypeDescription onTypeVariable(GenericTypeDescription genericTypeD
} }
GenericTypeDescription typeVariable = detachedVariables.get(genericTypeDescription.getSymbol()); GenericTypeDescription typeVariable = detachedVariables.get(genericTypeDescription.getSymbol());
if (typeVariable == null) { if (typeVariable == null) {
typeVariable = new DetachedTypeVariable(genericTypeDescription.getSymbol(), typeVariable = new DetachedTypeVariable(genericTypeDescription.getSymbol(), genericTypeDescription.getUpperBounds(), this);
genericTypeDescription.getUpperBounds(),
this);
} }
return typeVariable; return typeVariable;
} }
Expand Down
@@ -1,10 +1,13 @@
package net.bytebuddy.dynamic.scaffold.inline; package net.bytebuddy.dynamic.scaffold.inline;


import net.bytebuddy.ClassFileVersion; import net.bytebuddy.ClassFileVersion;
import net.bytebuddy.description.annotation.AnnotationList;
import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.method.MethodList; import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.method.ParameterList;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.description.type.generic.GenericTypeDescription;
import net.bytebuddy.description.type.generic.GenericTypeList;
import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.DynamicType;
import net.bytebuddy.implementation.auxiliary.AuxiliaryType; import net.bytebuddy.implementation.auxiliary.AuxiliaryType;
import net.bytebuddy.implementation.auxiliary.TrivialType; import net.bytebuddy.implementation.auxiliary.TrivialType;
Expand Down Expand Up @@ -289,31 +292,17 @@ public String toString() {
*/ */
class ForRebasedMethod implements Resolution { class ForRebasedMethod implements Resolution {


public static Resolution of(MethodDescription methodDescription, MethodNameTransformer methodNameTransformer) {
return new ForRebasedMethod(new RebasedMethod(methodDescription, methodNameTransformer));
}

/** /**
* The rebased method. * The rebased method.
*/ */
private final MethodDescription methodDescription; private final MethodDescription methodDescription;


/** protected ForRebasedMethod(MethodDescription methodDescription) {
* Creates a {@link MethodRebaseResolver.Resolution} for a this.methodDescription = methodDescription;
* rebased method.
*
* @param methodDescription The original method that should be rebased.
* @param methodNameTransformer A transformer for renaming a rebased method.
*/
public ForRebasedMethod(MethodDescription methodDescription, MethodNameTransformer methodNameTransformer) {
// TODO: Proper transformation.
this.methodDescription = new MethodDescription.Latent(methodDescription.getDeclaringType(),
methodNameTransformer.transform(methodDescription),
REBASED_METHOD_MODIFIER
| (methodDescription.isStatic() ? Opcodes.ACC_STATIC : 0)
| (methodDescription.isNative() ? Opcodes.ACC_NATIVE : 0),
methodDescription.getTypeVariables(),
methodDescription.getReturnType(),
methodDescription.getParameters().asTokens(),
methodDescription.getExceptionTypes(),
methodDescription.getDeclaredAnnotations(),
MethodDescription.NO_DEFAULT_VALUE);
} }


@Override @Override
Expand Down Expand Up @@ -346,36 +335,83 @@ public int hashCode() {
public String toString() { public String toString() {
return "MethodRebaseResolver.Resolution.ForRebasedMethod{methodDescription=" + methodDescription + '}'; return "MethodRebaseResolver.Resolution.ForRebasedMethod{methodDescription=" + methodDescription + '}';
} }

protected static class RebasedMethod extends MethodDescription.AbstractMethodDescription {

private final MethodDescription methodDescription;

private final MethodNameTransformer methodNameTransformer;

public RebasedMethod(MethodDescription methodDescription, MethodNameTransformer methodNameTransformer) {
this.methodDescription = methodDescription;
this.methodNameTransformer = methodNameTransformer;
}

@Override
public GenericTypeDescription getReturnType() {
return methodDescription.getReturnType().asRawType();
}

@Override
public ParameterList getParameters() {
return ParameterList.Explicit.latent(this, methodDescription.getParameters().asTypeList().asRawTypes());
}

@Override
public GenericTypeList getExceptionTypes() {
return methodDescription.getExceptionTypes().asRawTypes().asGenericTypes();
}

@Override
public Object getDefaultValue() {
return MethodDescription.NO_DEFAULT_VALUE;
}

@Override
public GenericTypeList getTypeVariables() {
return new GenericTypeList.Empty();
}

@Override
public AnnotationList getDeclaredAnnotations() {
return new AnnotationList.Empty();
}

@Override
public TypeDescription getDeclaringType() {
return methodDescription.getDeclaringType();
}

@Override
public int getModifiers() {
return REBASED_METHOD_MODIFIER
| (methodDescription.isStatic() ? Opcodes.ACC_STATIC : 0)
| (methodDescription.isNative() ? Opcodes.ACC_NATIVE : 0);
}

@Override
public String getInternalName() {
return methodNameTransformer.transform(methodDescription);
}
}
} }


/** /**
* A {@link MethodRebaseResolver.Resolution} of a rebased constructor. * A {@link MethodRebaseResolver.Resolution} of a rebased constructor.
*/ */
class ForRebasedConstructor implements Resolution { class ForRebasedConstructor implements Resolution {


public static Resolution of(MethodDescription methodDescription, TypeDescription placeholderType) {
return new ForRebasedConstructor(new RebasedConstructor(methodDescription, placeholderType));
}

/** /**
* The rebased constructor. * The rebased constructor.
*/ */
private final MethodDescription methodDescription; private final MethodDescription methodDescription;


/** public ForRebasedConstructor(MethodDescription methodDescription) {
* Creates a {@link MethodRebaseResolver.Resolution} for a this.methodDescription = methodDescription;
* rebased method.
*
* @param methodDescription The constructor to rebase.
* @param placeholderType A placeholder type which is added to a rebased constructor.
*/
public ForRebasedConstructor(MethodDescription methodDescription, TypeDescription placeholderType) {
// TODO: Proper modification!
this.methodDescription = new MethodDescription.Latent(methodDescription.getDeclaringType(),
methodDescription.getInternalName(),
REBASED_METHOD_MODIFIER,
methodDescription.getTypeVariables(),
methodDescription.getReturnType(),
join(methodDescription.getParameters().asTokens(), new ParameterDescription.Token(placeholderType)),
methodDescription.getExceptionTypes(),
methodDescription.getDeclaredAnnotations(),
MethodDescription.NO_DEFAULT_VALUE);
} }


@Override @Override
Expand Down Expand Up @@ -408,6 +444,63 @@ public int hashCode() {
public String toString() { public String toString() {
return "MethodRebaseResolver.Resolution.ForRebasedConstructor{methodDescription=" + methodDescription + '}'; return "MethodRebaseResolver.Resolution.ForRebasedConstructor{methodDescription=" + methodDescription + '}';
} }

protected static class RebasedConstructor extends MethodDescription.AbstractMethodDescription {

private final MethodDescription methodDescription;

private final TypeDescription placeholderType;

public RebasedConstructor(MethodDescription methodDescription, TypeDescription placeholderType) {
this.methodDescription = methodDescription;
this.placeholderType = placeholderType;
}

@Override
public GenericTypeDescription getReturnType() {
return TypeDescription.VOID;
}

@Override
public ParameterList getParameters() {
return ParameterList.Explicit.latent(this, join(methodDescription.getParameters().asTypeList().asRawTypes(), placeholderType));
}

@Override
public GenericTypeList getExceptionTypes() {
return methodDescription.getExceptionTypes().asRawTypes().asGenericTypes();
}

@Override
public Object getDefaultValue() {
return MethodDescription.NO_DEFAULT_VALUE;
}

@Override
public GenericTypeList getTypeVariables() {
return new GenericTypeList.Empty();
}

@Override
public AnnotationList getDeclaredAnnotations() {
return new AnnotationList.Empty();
}

@Override
public TypeDescription getDeclaringType() {
return methodDescription.getDeclaringType();
}

@Override
public int getModifiers() {
return REBASED_METHOD_MODIFIER;
}

@Override
public String getInternalName() {
return MethodDescription.CONSTRUCTOR_INTERNAL_NAME;
}
}
} }
} }


Expand Down Expand Up @@ -494,7 +587,7 @@ protected Resolution rebase(MethodDescription methodDescription) {
if (methodDescription.isConstructor()) { if (methodDescription.isConstructor()) {
throw new IllegalArgumentException(); throw new IllegalArgumentException();
} }
return new Resolution.ForRebasedMethod(methodDescription, methodNameTransformer); return Resolution.ForRebasedMethod.of(methodDescription, methodNameTransformer);
} }


@Override @Override
Expand Down Expand Up @@ -592,8 +685,8 @@ protected static MethodRebaseResolver of(MethodList instrumentedMethods, Dynamic
@Override @Override
protected Resolution rebase(MethodDescription methodDescription) { protected Resolution rebase(MethodDescription methodDescription) {
return methodDescription.isConstructor() return methodDescription.isConstructor()
? new Resolution.ForRebasedConstructor(methodDescription, placeholderType.getTypeDescription()) ? Resolution.ForRebasedConstructor.of(methodDescription, placeholderType.getTypeDescription())
: new Resolution.ForRebasedMethod(methodDescription, methodNameTransformer); : Resolution.ForRebasedMethod.of(methodDescription, methodNameTransformer);
} }


@Override @Override
Expand Down

0 comments on commit 762a06f

Please sign in to comment.