Skip to content

Commit

Permalink
Added resolution for actual modifiers that takes deprecation annotati…
Browse files Browse the repository at this point in the history
…on into account.
  • Loading branch information
Rafael Winterhalter committed Jan 25, 2016
1 parent 20ba73c commit da70d7a
Show file tree
Hide file tree
Showing 7 changed files with 62 additions and 32 deletions.
Expand Up @@ -7,6 +7,7 @@
import net.bytebuddy.description.annotation.AnnotationList; import net.bytebuddy.description.annotation.AnnotationList;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.signature.SignatureWriter; import org.objectweb.asm.signature.SignatureWriter;


import java.lang.reflect.Field; import java.lang.reflect.Field;
Expand Down Expand Up @@ -35,6 +36,14 @@ public interface FieldDescription extends ByteCodeElement,
*/ */
TypeDescription.Generic getType(); TypeDescription.Generic getType();


/**
* Returns the field's actual modifiers as it is present in a class file, i.e. its modifiers including
* a flag if this field is deprecated.
*
* @return The field's actual modifiers.
*/
int getActualModifiers();

/** /**
* Returns a signature token representing this field. * Returns a signature token representing this field.
* *
Expand Down Expand Up @@ -112,6 +121,13 @@ public boolean isVisibleTo(TypeDescription typeDescription) {
|| (!isPrivate() && typeDescription.isSamePackage(getDeclaringType().asErasure()))); || (!isPrivate() && typeDescription.isSamePackage(getDeclaringType().asErasure())));
} }


@Override
public int getActualModifiers() {
return getModifiers() | (getDeclaredAnnotations().isAnnotationPresent(Deprecated.class)
? Opcodes.ACC_DEPRECATED
: EMPTY_MASK);
}

@Override @Override
public FieldDescription.Token asToken(ElementMatcher<? super TypeDescription> matcher) { public FieldDescription.Token asToken(ElementMatcher<? super TypeDescription> matcher) {
return new FieldDescription.Token(getName(), return new FieldDescription.Token(getName(),
Expand Down
Expand Up @@ -86,12 +86,21 @@ public interface MethodDescription extends TypeVariableSource,
TypeList.Generic getExceptionTypes(); TypeList.Generic getExceptionTypes();


/** /**
* Returns this method modifier but adjusts its state of being abstract. * Returns this method's actual modifiers as it is present in a class file, i.e. includes a flag if this method
* is marked {@link Deprecated}.
*
* @return The method's actual modifiers.
*/
int getActualModifiers();

/**
* Returns this method's actual modifiers as it is present in a class file, i.e. includes a flag if this method
* is marked {@link Deprecated} and adjusts the modifiers for being abstract or not.
* *
* @param nonAbstract {@code true} if the method should be treated as non-abstract. * @param nonAbstract {@code true} if the method should be treated as non-abstract.
* @return The adjusted modifiers. * @return The method's actual modifiers.
*/ */
int getAdjustedModifiers(boolean nonAbstract); int getActualModifiers(boolean nonAbstract);


/** /**
* Checks if this method description represents a constructor. * Checks if this method description represents a constructor.
Expand Down Expand Up @@ -410,10 +419,18 @@ public String getGenericSignature() {
} }


@Override @Override
public int getAdjustedModifiers(boolean nonAbstract) { public int getActualModifiers() {
return getActualModifiers(!isAbstract());
}

@Override
public int getActualModifiers(boolean nonAbstract) {
int actualModifiers = getModifiers() | (getDeclaredAnnotations().isAnnotationPresent(Deprecated.class)
? Opcodes.ACC_DEPRECATED
: EMPTY_MASK);
return nonAbstract return nonAbstract
? getModifiers() & ~(Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE) ? actualModifiers & ~(Opcodes.ACC_ABSTRACT | Opcodes.ACC_NATIVE)
: getModifiers() & ~Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT; : actualModifiers & ~Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT;
} }


@Override @Override
Expand Down
Expand Up @@ -52,7 +52,7 @@ interface ForType extends ModifierContributor {
*/ */
int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC
| Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE | Opcodes.ACC_ANNOTATION | Opcodes.ACC_DEPRECATED | Opcodes.ACC_ABSTRACT | Opcodes.ACC_INTERFACE | Opcodes.ACC_ANNOTATION | Opcodes.ACC_DEPRECATED
| Opcodes.ACC_ENUM | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC | Opcodes.ACC_DEPRECATED; | Opcodes.ACC_ENUM | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC;
} }


/** /**
Expand All @@ -65,7 +65,7 @@ interface ForField extends ModifierContributor {
*/ */
int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC
| Opcodes.ACC_DEPRECATED | Opcodes.ACC_ENUM | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC | Opcodes.ACC_DEPRECATED | Opcodes.ACC_ENUM | Opcodes.ACC_FINAL | Opcodes.ACC_STATIC
| Opcodes.ACC_SYNTHETIC | Opcodes.ACC_TRANSIENT | Opcodes.ACC_VOLATILE | Opcodes.ACC_DEPRECATED; | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_TRANSIENT | Opcodes.ACC_VOLATILE;
} }


/** /**
Expand All @@ -79,7 +79,7 @@ interface ForMethod extends ModifierContributor {
int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC int MASK = Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED | Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC
| Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL | Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT | Opcodes.ACC_BRIDGE | Opcodes.ACC_FINAL | Opcodes.ACC_NATIVE | Opcodes.ACC_ABSTRACT
| Opcodes.ACC_STATIC | Opcodes.ACC_STRICT | Opcodes.ACC_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_STATIC | Opcodes.ACC_STRICT | Opcodes.ACC_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC
| Opcodes.ACC_VARARGS | Opcodes.ACC_DEPRECATED; | Opcodes.ACC_VARARGS;
} }


/** /**
Expand Down
Expand Up @@ -168,16 +168,11 @@ public interface TypeDescription extends TypeDefinition, TypeVariableSource {
TypeDescription getEnclosingType(); TypeDescription getEnclosingType();


/** /**
* <p>
* Returns the type's actual modifiers as present in the class file. For example, a type cannot be {@code private}. * Returns the type's actual modifiers as present in the class file. For example, a type cannot be {@code private}.
* but it modifiers might reflect this property nevertheless if a class was defined as a private inner class. * but it modifiers might reflect this property nevertheless if a class was defined as a private inner class. The
* </p> * returned modifiers take also into account if the type is marked as {@link Deprecated}.
* <p>
* Unfortunately, the modifier for marking a {@code static} class collides with the {@code SUPER} modifier such
* that these flags are indistinguishable. Therefore, the flag must be specified manually.
* </p>
* *
* @param superFlag {@code true} if the super flag should be set. * @param superFlag {@code true} if the modifier's super flag should be set.
* @return The type's actual modifiers. * @return The type's actual modifiers.
*/ */
int getActualModifiers(boolean superFlag); int getActualModifiers(boolean superFlag);
Expand Down Expand Up @@ -6877,13 +6872,15 @@ public String getInternalName() {


@Override @Override
public int getActualModifiers(boolean superFlag) { public int getActualModifiers(boolean superFlag) {
int actualModifiers; int actualModifiers = getModifiers() | (getDeclaredAnnotations().isAnnotationPresent(Deprecated.class)
? Opcodes.ACC_DEPRECATED
: EMPTY_MASK);
if (isPrivate()) { if (isPrivate()) {
actualModifiers = getModifiers() & ~(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC); actualModifiers = actualModifiers & ~(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC);
} else if (isProtected()) { } else if (isProtected()) {
actualModifiers = getModifiers() & ~(Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC) | Opcodes.ACC_PUBLIC; actualModifiers = actualModifiers & ~(Opcodes.ACC_PROTECTED | Opcodes.ACC_STATIC) | Opcodes.ACC_PUBLIC;
} else { } else {
actualModifiers = getModifiers() & ~Opcodes.ACC_STATIC; actualModifiers = actualModifiers & ~Opcodes.ACC_STATIC;
} }
return superFlag ? (actualModifiers | Opcodes.ACC_SUPER) : actualModifiers; return superFlag ? (actualModifiers | Opcodes.ACC_SUPER) : actualModifiers;
} }
Expand Down
Expand Up @@ -159,7 +159,7 @@ public Object resolveDefault(Object defaultValue) {


@Override @Override
public void apply(ClassVisitor classVisitor, AnnotationValueFilter.Factory annotationValueFilterFactory) { public void apply(ClassVisitor classVisitor, AnnotationValueFilter.Factory annotationValueFilterFactory) {
FieldVisitor fieldVisitor = classVisitor.visitField(fieldDescription.getModifiers(), FieldVisitor fieldVisitor = classVisitor.visitField(fieldDescription.getActualModifiers(),
fieldDescription.getInternalName(), fieldDescription.getInternalName(),
fieldDescription.getDescriptor(), fieldDescription.getDescriptor(),
fieldDescription.getGenericSignature(), fieldDescription.getGenericSignature(),
Expand Down Expand Up @@ -251,7 +251,7 @@ public Object resolveDefault(Object defaultValue) {


@Override @Override
public void apply(ClassVisitor classVisitor, AnnotationValueFilter.Factory annotationValueFilterFactory) { public void apply(ClassVisitor classVisitor, AnnotationValueFilter.Factory annotationValueFilterFactory) {
FieldVisitor fieldVisitor = classVisitor.visitField(fieldDescription.getModifiers(), FieldVisitor fieldVisitor = classVisitor.visitField(fieldDescription.getActualModifiers(),
fieldDescription.getInternalName(), fieldDescription.getInternalName(),
fieldDescription.getDescriptor(), fieldDescription.getDescriptor(),
fieldDescription.getGenericSignature(), fieldDescription.getGenericSignature(),
Expand Down Expand Up @@ -483,7 +483,7 @@ abstract class ForDefinedMethod implements Record {


@Override @Override
public void apply(ClassVisitor classVisitor, Implementation.Context implementationContext, AnnotationValueFilter.Factory annotationValueFilterFactory) { public void apply(ClassVisitor classVisitor, Implementation.Context implementationContext, AnnotationValueFilter.Factory annotationValueFilterFactory) {
MethodVisitor methodVisitor = classVisitor.visitMethod(getMethod().getAdjustedModifiers(getSort().isImplemented()), MethodVisitor methodVisitor = classVisitor.visitMethod(getMethod().getActualModifiers(getSort().isImplemented()),
getMethod().getInternalName(), getMethod().getInternalName(),
getMethod().getDescriptor(), getMethod().getDescriptor(),
getMethod().getGenericSignature(), getMethod().getGenericSignature(),
Expand Down Expand Up @@ -1068,7 +1068,7 @@ public void apply(ClassVisitor classVisitor,
if (!bridgeMethod.getReturnType().asErasure().isAssignableFrom(bridgeTarget.getReturnType().asErasure())) { if (!bridgeMethod.getReturnType().asErasure().isAssignableFrom(bridgeTarget.getReturnType().asErasure())) {
throw new IllegalStateException("Cannot implement bridge " + bridgeMethod + " to " + bridgeTarget); throw new IllegalStateException("Cannot implement bridge " + bridgeMethod + " to " + bridgeTarget);
} }
MethodVisitor methodVisitor = classVisitor.visitMethod(bridgeMethod.getAdjustedModifiers(true), MethodVisitor methodVisitor = classVisitor.visitMethod(bridgeMethod.getActualModifiers(true),
bridgeMethod.getInternalName(), bridgeMethod.getInternalName(),
bridgeMethod.getDescriptor(), bridgeMethod.getDescriptor(),
MethodDescription.NON_GENERIC_SIGNATURE, MethodDescription.NON_GENERIC_SIGNATURE,
Expand Down Expand Up @@ -3017,7 +3017,7 @@ public FieldVisitor visitField(int modifiers,
*/ */
protected FieldVisitor redefine(FieldPool.Record record, Object defaultValue) { protected FieldVisitor redefine(FieldPool.Record record, Object defaultValue) {
FieldDescription instrumentedField = record.getField(); FieldDescription instrumentedField = record.getField();
return new AttributeObtainingFieldVisitor(super.visitField(instrumentedField.getModifiers(), return new AttributeObtainingFieldVisitor(super.visitField(instrumentedField.getActualModifiers(),
instrumentedField.getInternalName(), instrumentedField.getInternalName(),
instrumentedField.getDescriptor(), instrumentedField.getDescriptor(),
instrumentedField.getGenericSignature(), instrumentedField.getGenericSignature(),
Expand All @@ -3036,7 +3036,7 @@ public MethodVisitor visitMethod(int modifiers,
} else { } else {
TypeInitializerInjection injectedCode = new TypeInitializerInjection(new TypeInitializerDelegate(instrumentedType, RandomString.make())); TypeInitializerInjection injectedCode = new TypeInitializerInjection(new TypeInitializerDelegate(instrumentedType, RandomString.make()));
this.injectedCode = injectedCode; this.injectedCode = injectedCode;
return super.visitMethod(injectedCode.getInjectorProxyMethod().getModifiers(), return super.visitMethod(injectedCode.getInjectorProxyMethod().getActualModifiers(),
injectedCode.getInjectorProxyMethod().getInternalName(), injectedCode.getInjectorProxyMethod().getInternalName(),
injectedCode.getInjectorProxyMethod().getDescriptor(), injectedCode.getInjectorProxyMethod().getDescriptor(),
injectedCode.getInjectorProxyMethod().getGenericSignature(), injectedCode.getInjectorProxyMethod().getGenericSignature(),
Expand All @@ -3061,14 +3061,14 @@ public MethodVisitor visitMethod(int modifiers,
protected MethodVisitor redefine(MethodDescription methodDescription, boolean abstractOrigin) { protected MethodVisitor redefine(MethodDescription methodDescription, boolean abstractOrigin) {
MethodPool.Record record = methodPool.target(methodDescription); MethodPool.Record record = methodPool.target(methodDescription);
if (!record.getSort().isDefined()) { if (!record.getSort().isDefined()) {
return super.visitMethod(methodDescription.getModifiers(), return super.visitMethod(methodDescription.getActualModifiers(),
methodDescription.getInternalName(), methodDescription.getInternalName(),
methodDescription.getDescriptor(), methodDescription.getDescriptor(),
methodDescription.getGenericSignature(), methodDescription.getGenericSignature(),
methodDescription.getExceptionTypes().asErasures().toInternalNames()); methodDescription.getExceptionTypes().asErasures().toInternalNames());
} }
MethodDescription implementedMethod = record.getMethod(); MethodDescription implementedMethod = record.getMethod();
MethodVisitor methodVisitor = super.visitMethod(implementedMethod.getAdjustedModifiers(record.getSort().isImplemented()), MethodVisitor methodVisitor = super.visitMethod(implementedMethod.getActualModifiers(record.getSort().isImplemented()),
implementedMethod.getInternalName(), implementedMethod.getInternalName(),
implementedMethod.getDescriptor(), implementedMethod.getDescriptor(),
implementedMethod.getGenericSignature(), implementedMethod.getGenericSignature(),
Expand Down Expand Up @@ -3221,7 +3221,7 @@ public void visitCode() {
record.applyBody(actualMethodVisitor, implementationContext, annotationValueFilterFactory); record.applyBody(actualMethodVisitor, implementationContext, annotationValueFilterFactory);
actualMethodVisitor.visitEnd(); actualMethodVisitor.visitEnd();
mv = resolution.isRebased() mv = resolution.isRebased()
? cv.visitMethod(resolution.getResolvedMethod().getModifiers(), ? cv.visitMethod(resolution.getResolvedMethod().getActualModifiers(),
resolution.getResolvedMethod().getInternalName(), resolution.getResolvedMethod().getInternalName(),
resolution.getResolvedMethod().getDescriptor(), resolution.getResolvedMethod().getDescriptor(),
resolution.getResolvedMethod().getGenericSignature(), resolution.getResolvedMethod().getGenericSignature(),
Expand Down
Expand Up @@ -67,7 +67,7 @@ public class TypeWriterFieldPoolRecordTest {
@Before @Before
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void setUp() throws Exception { public void setUp() throws Exception {
when(fieldDescription.getModifiers()).thenReturn(MODIFIER); when(fieldDescription.getActualModifiers()).thenReturn(MODIFIER);
when(fieldDescription.getInternalName()).thenReturn(FOO); when(fieldDescription.getInternalName()).thenReturn(FOO);
when(fieldDescription.getDescriptor()).thenReturn(BAR); when(fieldDescription.getDescriptor()).thenReturn(BAR);
when(fieldDescription.getGenericSignature()).thenReturn(QUX); when(fieldDescription.getGenericSignature()).thenReturn(QUX);
Expand Down
Expand Up @@ -91,7 +91,7 @@ public void setUp() throws Exception {
when(methodDescription.getDescriptor()).thenReturn(BAR); when(methodDescription.getDescriptor()).thenReturn(BAR);
when(methodDescription.getGenericSignature()).thenReturn(QUX); when(methodDescription.getGenericSignature()).thenReturn(QUX);
when(methodDescription.getExceptionTypes()).thenReturn(exceptionTypes); when(methodDescription.getExceptionTypes()).thenReturn(exceptionTypes);
when(methodDescription.getAdjustedModifiers(anyBoolean())).thenReturn(MODIFIERS); when(methodDescription.getActualModifiers(anyBoolean())).thenReturn(MODIFIERS);
when(exceptionTypes.asErasures()).thenReturn(rawExceptionTypes); when(exceptionTypes.asErasures()).thenReturn(rawExceptionTypes);
when(rawExceptionTypes.toInternalNames()).thenReturn(new String[]{BAZ}); when(rawExceptionTypes.toInternalNames()).thenReturn(new String[]{BAZ});
when(classVisitor.visitMethod(MODIFIERS, FOO, BAR, QUX, new String[]{BAZ})).thenReturn(methodVisitor); when(classVisitor.visitMethod(MODIFIERS, FOO, BAR, QUX, new String[]{BAZ})).thenReturn(methodVisitor);
Expand Down

0 comments on commit da70d7a

Please sign in to comment.