Skip to content

Commit 9a176c7

Browse files
committed
#426 CompatibilityChanges.hasToBeEvaluated() includes accessModifier and synthetic filter
1 parent e5bb118 commit 9a176c7

4 files changed

Lines changed: 80 additions & 27 deletions

File tree

japicmp/src/main/java/japicmp/cmp/JarArchiveComparator.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ public String getNewClassPathAsString() {
166166
return newClassPathAsString;
167167
}
168168

169-
private void checkBinaryCompatibility(List<JApiClass> classList) {
170-
CompatibilityChanges compatibilityChanges = new CompatibilityChanges(this);
169+
private void checkBinaryCompatibility(List<JApiClass> classList, JarArchiveComparatorOptions options) {
170+
CompatibilityChanges compatibilityChanges = new CompatibilityChanges(this, options);
171171
compatibilityChanges.evaluate(classList);
172172
}
173173

@@ -204,7 +204,7 @@ List<JApiClass> compareClassLists(JarArchiveComparatorOptions options, List<CtCl
204204
LOGGER.fine(jApiClass.toString());
205205
}
206206
}
207-
checkBinaryCompatibility(classList);
207+
checkBinaryCompatibility(classList, options);
208208
checkJavaObjectSerializationCompatibility(classList);
209209
OutputFilter.sortClassesAndMethods(classList);
210210
return classList;

japicmp/src/main/java/japicmp/compat/CompatibilityChanges.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,11 @@
1717

1818
public class CompatibilityChanges {
1919
private final JarArchiveComparator jarArchiveComparator;
20+
private final JarArchiveComparatorOptions options;
2021

21-
public CompatibilityChanges(JarArchiveComparator jarArchiveComparator) {
22+
public CompatibilityChanges(JarArchiveComparator jarArchiveComparator, JarArchiveComparatorOptions options) {
2223
this.jarArchiveComparator = jarArchiveComparator;
24+
this.options = options;
2325
}
2426

2527
public void evaluate(List<JApiClass> classes) {
@@ -1033,22 +1035,28 @@ private JApiCompatibilityChange addCompatibilityChange(JApiCompatibility binaryC
10331035
}
10341036

10351037
private boolean hasToBeEvaluated(JApiMethod jApiMethod) {
1036-
boolean notPrivate = ModifierHelper.isNotPrivate(jApiMethod);
1038+
boolean hasToBeEvaluated = ModifierHelper.matchesModifierLevel(jApiMethod, options.getAccessModifier());
10371039
if (!jApiMethod.getjApiClass().isNewClassExtendable()) {
1038-
notPrivate = ModifierHelper.matchesModifierLevel(jApiMethod, AccessModifier.PUBLIC);
1040+
hasToBeEvaluated = ModifierHelper.matchesModifierLevel(jApiMethod, AccessModifier.PUBLIC);
10391041
}
1040-
return notPrivate;
1042+
if (hasToBeEvaluated) {
1043+
hasToBeEvaluated = ModifierHelper.includeSynthetic(jApiMethod, options);
1044+
}
1045+
return hasToBeEvaluated;
10411046
}
10421047

10431048
private boolean hasToBeEvaluated(JApiField jApiField) {
1044-
boolean hasToBeEvaluated = ModifierHelper.isNotPrivate(jApiField);
1049+
boolean hasToBeEvaluated = ModifierHelper.matchesModifierLevel(jApiField, options.getAccessModifier());
10451050
if (!jApiField.getjApiClass().isNewClassExtendable()) {
10461051
JApiModifier<AccessModifier> accessModifier = jApiField.getAccessModifier();
10471052
if (accessModifier.getNewModifier().isPresent()) {
10481053
AccessModifier newModifier = accessModifier.getNewModifier().get();
10491054
hasToBeEvaluated = matchesModifierLevel(newModifier, AccessModifier.PUBLIC);
10501055
}
10511056
}
1057+
if (hasToBeEvaluated) {
1058+
hasToBeEvaluated = ModifierHelper.includeSynthetic(jApiField, options);
1059+
}
10521060
return hasToBeEvaluated;
10531061
}
10541062
}

japicmp/src/main/java/japicmp/util/ModifierHelper.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,15 @@
22

33
import japicmp.cmp.JarArchiveComparatorOptions;
44
import japicmp.config.Options;
5-
import japicmp.model.AbstractModifier;
6-
import japicmp.model.AccessModifier;
7-
import japicmp.model.BridgeModifier;
8-
import japicmp.model.FinalModifier;
9-
import japicmp.model.JApiAttribute;
10-
import japicmp.model.JApiCanBeSynthetic;
11-
import japicmp.model.JApiChangeStatus;
12-
import japicmp.model.JApiHasAccessModifier;
13-
import japicmp.model.JApiModifier;
14-
import japicmp.model.JApiModifierBase;
15-
import japicmp.model.StaticModifier;
16-
import japicmp.model.SyntheticAttribute;
17-
import japicmp.model.SyntheticModifier;
18-
import japicmp.model.TransientModifier;
19-
import japicmp.model.VolatileModifier;
20-
import java.util.Arrays;
21-
import java.util.List;
22-
import java.util.Optional;
5+
import japicmp.model.*;
236
import javassist.CtBehavior;
247
import javassist.CtClass;
258
import javassist.CtField;
269

2710
import java.lang.reflect.Modifier;
11+
import java.util.Arrays;
12+
import java.util.List;
13+
import java.util.Optional;
2814

2915
public class ModifierHelper {
3016
public static final int ACC_BRIDGE = 0x00000040;
@@ -218,7 +204,7 @@ public static boolean isSynthetic(int modifier) {
218204
}
219205

220206
public static boolean includeSynthetic(JApiCanBeSynthetic jApiCanBeSynthetic, JarArchiveComparatorOptions options) {
221-
return options.isIncludeSynthetic() || !isSynthetic(jApiCanBeSynthetic);
207+
return !isSynthetic(jApiCanBeSynthetic) || options.isIncludeSynthetic();
222208
}
223209

224210
public static boolean includeSynthetic(JApiCanBeSynthetic jApiCanBeSynthetic, Options options) {

japicmp/src/test/java/japicmp/compat/CompatibilityChangesTest.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2895,4 +2895,63 @@ public List<CtClass> createNewClasses(ClassPool classPool) {
28952895
assertThat(jApiClass.isBinaryCompatible(), is(true));
28962896
assertThat(jApiClass.isSourceCompatible(), is(true));
28972897
}
2898+
2899+
@Test
2900+
void testPackagePrivateMethodRemovedInSuperclass() throws Exception {
2901+
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
2902+
options.setAccessModifier(AccessModifier.PROTECTED);
2903+
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(options, new ClassesHelper.ClassesGenerator() {
2904+
@Override
2905+
public List<CtClass> createOldClasses(ClassPool classPool) throws Exception {
2906+
CtClass aSuperClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
2907+
CtMethodBuilder.create().packageProtectedAccess().name("method").addToClass(aSuperClass);
2908+
CtClass aClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(aSuperClass).addToClassPool(classPool);
2909+
return Arrays.asList(aSuperClass, aClass);
2910+
}
2911+
2912+
@Override
2913+
public List<CtClass> createNewClasses(ClassPool classPool) {
2914+
CtClass aSuperClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
2915+
CtClass aClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(aSuperClass).addToClassPool(classPool);
2916+
return Arrays.asList(aSuperClass, aClass);
2917+
}
2918+
});
2919+
JApiClass jApiClass = getJApiClass(jApiClasses, "japicmp.Superclass");
2920+
JApiMethod jApiMethod = getJApiMethod(jApiClass.getMethods(), "method");
2921+
assertThat(jApiMethod.getChangeStatus(), is(JApiChangeStatus.REMOVED));
2922+
jApiClass = getJApiClass(jApiClasses, "japicmp.Test");
2923+
assertThat(jApiClass.getCompatibilityChanges(), hasSize(0));
2924+
assertThat(jApiClass.isBinaryCompatible(), is(true));
2925+
assertThat(jApiClass.isSourceCompatible(), is(true));
2926+
}
2927+
2928+
@Test
2929+
void testPackagePrivateSyntheticMethodRemovedInSuperclassIgnoreSynthetic() throws Exception {
2930+
JarArchiveComparatorOptions options = new JarArchiveComparatorOptions();
2931+
options.setAccessModifier(AccessModifier.PRIVATE);
2932+
options.setIncludeSynthetic(false);
2933+
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(options, new ClassesHelper.ClassesGenerator() {
2934+
@Override
2935+
public List<CtClass> createOldClasses(ClassPool classPool) throws Exception {
2936+
CtClass aSuperClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
2937+
CtMethodBuilder.create().packageProtectedAccess().syntheticModifier().name("method").addToClass(aSuperClass);
2938+
CtClass aClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(aSuperClass).addToClassPool(classPool);
2939+
return Arrays.asList(aSuperClass, aClass);
2940+
}
2941+
2942+
@Override
2943+
public List<CtClass> createNewClasses(ClassPool classPool) {
2944+
CtClass aSuperClass = CtClassBuilder.create().name("japicmp.Superclass").addToClassPool(classPool);
2945+
CtClass aClass = CtClassBuilder.create().name("japicmp.Test").withSuperclass(aSuperClass).addToClassPool(classPool);
2946+
return Arrays.asList(aSuperClass, aClass);
2947+
}
2948+
});
2949+
JApiClass jApiClass = getJApiClass(jApiClasses, "japicmp.Superclass");
2950+
JApiMethod jApiMethod = getJApiMethod(jApiClass.getMethods(), "method");
2951+
assertThat(jApiMethod.getChangeStatus(), is(JApiChangeStatus.REMOVED));
2952+
jApiClass = getJApiClass(jApiClasses, "japicmp.Test");
2953+
assertThat(jApiClass.getCompatibilityChanges(), hasSize(0));
2954+
assertThat(jApiClass.isBinaryCompatible(), is(true));
2955+
assertThat(jApiClass.isSourceCompatible(), is(true));
2956+
}
28982957
}

0 commit comments

Comments
 (0)