Skip to content

Commit

Permalink
#132 Moving protected field to superclass is no longer marked as bina…
Browse files Browse the repository at this point in the history
…ry incompatible
  • Loading branch information
siom79 committed May 27, 2016
1 parent 713b8e5 commit dbd3ef4
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 1 deletion.
23 changes: 22 additions & 1 deletion japicmp/src/main/java/japicmp/compat/CompatibilityChanges.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,28 @@ private void checkIfFieldsHaveChangedIncompatible(JApiClass jApiClass, Map<Strin
for (final JApiField field : jApiClass.getFields()) {
// section 13.4.6 of "Java Language Specification" SE7
if (isNotPrivate(field) && field.getChangeStatus() == JApiChangeStatus.REMOVED) {
addCompatibilityChange(field, JApiCompatibilityChange.FIELD_REMOVED);
ArrayList<Integer> returnValues = new ArrayList<>();
forAllSuperclasses(jApiClass, classMap, returnValues, new OnSuperclassCallback<Integer>() {
@Override
public Integer callback(JApiClass superclass, Map<String, JApiClass> classMap, JApiChangeStatus changeStatusOfSuperclass) {
int movedToSuperclass = 0;
for (JApiField superclassField : superclass.getFields()) {
if (superclassField.getName().equals(field.getName()) && fieldTypeMatches(superclassField, field) && isNotPrivate(superclassField)) {
movedToSuperclass = 1;
}
}
return movedToSuperclass;
}
});
boolean movedToSuperclass = false;
for (Integer returnValue : returnValues) {
if (returnValue == 1) {
movedToSuperclass = true;
}
}
if (!movedToSuperclass) {
addCompatibilityChange(field, JApiCompatibilityChange.FIELD_REMOVED);
}
}
// section 13.4.7 of "Java Language Specification" SE7
if (hasModifierLevelDecreased(field)) {
Expand Down
25 changes: 25 additions & 0 deletions japicmp/src/test/java/japicmp/compat/CompatibilityChangesTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -1088,4 +1088,29 @@ public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
assertThat(method.isSourceCompatible(), is(false));
assertThat(method.getCompatibilityChanges(), hasItem(JApiCompatibilityChange.METHOD_NOW_THROWS_CHECKED_EXCEPTION));
}

@Test
public void testMemberVariableMovedToSuperclass() throws Exception {
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(options, new ClassesHelper.ClassesGenerator() {
@Override
public List<CtClass> createOldClasses(ClassPool classPool) throws Exception {
CtClass superClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
CtClass ctClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(superClass).addToClassPool(classPool);
CtFieldBuilder.create().protectedAccess().type(CtClass.intType).name("test").addToClass(ctClass);
return Arrays.asList(superClass, ctClass);
}

@Override
public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
CtClass superClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
CtFieldBuilder.create().protectedAccess().type(CtClass.intType).name("test").addToClass(superClass);
CtClass ctClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(superClass).addToClassPool(classPool);
return Arrays.asList(superClass, ctClass);
}
});
JApiClass jApiClass = getJApiClass(jApiClasses, "japicmp.Test");
assertThat(jApiClass.isBinaryCompatible(), is(true));
assertThat(jApiClass.isSourceCompatible(), is(true));
}
}
5 changes: 5 additions & 0 deletions japicmp/src/test/java/japicmp/util/CtFieldBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,11 @@ public CtFieldBuilder packageProtectedAccess() {
return this;
}

public CtFieldBuilder protectedAccess() {
this.modifier = this.modifier & ~Modifier.PROTECTED;
return this;
}

public CtFieldBuilder finalAccess() {
this.modifier = this.modifier | Modifier.FINAL;
return this;
Expand Down

0 comments on commit dbd3ef4

Please sign in to comment.