From 02e9598327f0b6ddabcf8fea681a69912e39a812 Mon Sep 17 00:00:00 2001 From: Stefan Zeiger Date: Wed, 23 Nov 2016 13:13:22 +0100 Subject: [PATCH] Treat default value getters as accessible. They are called from other compilation units and their names can change when a new overload is added to a method with default values. Fixes #136. --- .../main/scala/com/typesafe/tools/mima/core/MemberInfo.scala | 4 +++- .../problems.txt | 2 ++ .../v1/A.scala | 3 +++ .../v2/A.scala | 4 ++++ 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/problems.txt create mode 100644 reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v1/A.scala create mode 100644 reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v2/A.scala diff --git a/core/src/main/scala/com/typesafe/tools/mima/core/MemberInfo.scala b/core/src/main/scala/com/typesafe/tools/mima/core/MemberInfo.scala index 6f5541f6..d7ea2df3 100644 --- a/core/src/main/scala/com/typesafe/tools/mima/core/MemberInfo.scala +++ b/core/src/main/scala/com/typesafe/tools/mima/core/MemberInfo.scala @@ -74,7 +74,9 @@ class MemberInfo(val owner: ClassInfo, val bytecodeName: String, override val fl decodedName.substring(0, i+1).endsWith("$extension") } - def isAccessible: Boolean = isPublic && !isSynthetic && (!hasSyntheticName || isExtensionMethod) + def isDefaultGetter: Boolean = decodedName.contains("$default$") + + def isAccessible: Boolean = isPublic && !isSynthetic && (!hasSyntheticName || isExtensionMethod || isDefaultGetter) def nonAccessible: Boolean = !isAccessible diff --git a/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/problems.txt b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/problems.txt new file mode 100644 index 00000000..815017c4 --- /dev/null +++ b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/problems.txt @@ -0,0 +1,2 @@ +synthetic method copy$default$2()java.lang.String in class A has a different result type in new version, where it is Int rather than java.lang.String +synthetic method copy$default$1()Int in class A has a different result type in new version, where it is Boolean rather than Int diff --git a/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v1/A.scala b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v1/A.scala new file mode 100644 index 00000000..96318139 --- /dev/null +++ b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v1/A.scala @@ -0,0 +1,3 @@ +final class A { + def copy(x: Int = 0, y: String = "") = () +} diff --git a/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v2/A.scala b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v2/A.scala new file mode 100644 index 00000000..c5f06352 --- /dev/null +++ b/reporter/functional-tests/src/test/class-method-overload-with-default-parameters-nok/v2/A.scala @@ -0,0 +1,4 @@ +final class A { + def copy(x: Int, y: String) = () + def copy(z: Boolean = true, x: Int = 0, y: String = "") = () +}