Skip to content

Commit 1b4792b

Browse files
committed
#438 hasSameParameter() uses template parameter
1 parent a54a58d commit 1b4792b

File tree

2 files changed

+42
-5
lines changed

2 files changed

+42
-5
lines changed

japicmp/src/main/java/japicmp/model/JApiBehavior.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,20 @@ protected JApiAttribute<SyntheticAttribute> extractSyntheticAttribute(Optional<?
267267

268268
public boolean hasSameParameter(JApiMethod method) {
269269
boolean hasSameParameter = true;
270-
List<JApiParameter> parameters1 = getParameters();
271-
List<JApiParameter> parameters2 = method.getParameters();
272-
if (parameters1.size() != parameters2.size()) {
270+
List<JApiParameter> thisParams = getParameters();
271+
List<JApiParameter> otherParams = method.getParameters();
272+
if (thisParams.size() != otherParams.size()) {
273273
hasSameParameter = false;
274274
}
275275
if (hasSameParameter) {
276-
for (int i = 0; i < parameters1.size(); i++) {
277-
if (!parameters1.get(i).getType().equals(parameters2.get(i).getType())) {
276+
for (int i = 0; i < thisParams.size(); i++) {
277+
JApiParameter thisParam = thisParams.get(i);
278+
JApiParameter otherParam = otherParams.get(i);
279+
if (!thisParam.getTemplateNameOptional().isPresent() && // template parameter means java.lang.Object (that matches anyway)
280+
!otherParam.getTemplateNameOptional().isPresent() &&
281+
!thisParam.getType().equals(otherParam.getType())) {
278282
hasSameParameter = false;
283+
break;
279284
}
280285
}
281286
}

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2546,6 +2546,38 @@ public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
25462546
assertThat(jApiMethod.getCompatibilityChanges(), hasItem(new JApiCompatibilityChange(JApiCompatibilityChangeType.CLASS_GENERIC_TEMPLATE_CHANGED)));
25472547
}
25482548

2549+
@Test
2550+
void testNewMethodWithGenericsImplemented() throws Exception {
2551+
JarArchiveComparatorOptions jarArchiveComparatorOptions = new JarArchiveComparatorOptions();
2552+
jarArchiveComparatorOptions.setAccessModifier(AccessModifier.PRIVATE);
2553+
List<JApiClass> jApiClasses = ClassesHelper.compareClasses(jarArchiveComparatorOptions, new ClassesHelper.ClassesGenerator() {
2554+
@Override
2555+
public List<CtClass> createOldClasses(ClassPool classPool) {
2556+
CtClass ctClassC = CtClassBuilder.create().name("C").addToClassPool(classPool);
2557+
return Collections.singletonList(ctClassC);
2558+
}
2559+
2560+
@Override
2561+
public List<CtClass> createNewClasses(ClassPool classPool) throws Exception {
2562+
CtClass ctInterface = CtInterfaceBuilder.create().name("I").addToClassPool(classPool);
2563+
CtMethodBuilder.create()
2564+
.abstractMethod()
2565+
.returnType(CtClass.voidType)
2566+
.name("newMethod")
2567+
.parameter(classPool.get("java.lang.Object"))
2568+
.signature("<T:Ljava/lang/Object;>(TT;)TT;")
2569+
.addToClass(ctInterface);
2570+
CtClass ctClassC = CtClassBuilder.create().name("C").implementsInterface(ctInterface).addToClassPool(classPool);
2571+
CtMethodBuilder.create().publicAccess().returnType(CtClass.voidType).name("newMethod")
2572+
.parameter(classPool.get("java.lang.String")).addToClass(ctClassC);
2573+
return Collections.singletonList(ctClassC);
2574+
}
2575+
});
2576+
JApiClass jApiClass = getJApiClass(jApiClasses, "C");
2577+
assertThat(jApiClass.getChangeStatus(), is(JApiChangeStatus.MODIFIED));
2578+
assertThat(jApiClass.getCompatibilityChanges().size(), is(1));
2579+
}
2580+
25492581
@Test
25502582
void testMethodWithByteArrayAndArrayOfByteArrays() throws Exception {
25512583
JarArchiveComparatorOptions jarArchiveComparatorOptions = new JarArchiveComparatorOptions();

0 commit comments

Comments
 (0)