Skip to content

Commit 85d6191

Browse files
committed
Avoid false positives for classes defined in methods
If a class has the `EnclosingMethod` attribute, we know it was defined in the body of a method (or a val/var initializer), and is not part of the API of a class. Fixes #147
1 parent 32553b4 commit 85d6191

File tree

12 files changed

+12
-1
lines changed

12 files changed

+12
-1
lines changed

core/src/main/scala/com/typesafe/tools/mima/core/ClassInfo.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ abstract class ClassInfo(val owner: PackageInfo) extends HasDeclarationName with
5959
var _innerClasses: Seq[String] = Seq.empty
6060
def innerClasses = { ensureLoaded(); _innerClasses }
6161

62+
var _isLocalClass = false
63+
def isLocalClass = { ensureLoaded(); _isLocalClass}
64+
6265
var _isTopLevel = true
6366
def isTopLevel = { ensureLoaded(); _isTopLevel }
6467

core/src/main/scala/com/typesafe/tools/mima/core/ClassfileParser.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,8 @@ abstract class ClassfileParser(definitions: Definitions) {
278278
if (pool.getClassName(outerIndex) == c.bytecodeName) n else ""
279279
} else ""
280280
}.filterNot(_.isEmpty)
281+
} else if (attrName == "EnclosingMethod") {
282+
c._isLocalClass = true
281283
} else if (attrName == "Scala" || attrName == "ScalaSig") {
282284
this.parsedClass.isScala = true
283285
}

core/src/main/scala/com/typesafe/tools/mima/core/PackageInfo.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ abstract class PackageInfo(val owner: PackageInfo) {
7979
else if (prefix.isEmpty) clazz.isTopLevel && !clazz.bytecodeName.contains("$$")
8080
else prefix.exists(_.innerClasses contains clazz.bytecodeName)
8181
}
82-
clazz.isPublic && isReachable
82+
clazz.isPublic && !clazz.isLocalClass && isReachable
8383
}
8484

8585
accessibleClassesUnder(Set.empty, Set.empty)

reporter/functional-tests/src/test/class-added-local-class-ok/problems.txt

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { class Local } }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { } }

reporter/functional-tests/src/test/class-changed-local-class-ok/problems.txt

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { class Local { def v1 = "v1"} } }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { class Local } }

reporter/functional-tests/src/test/class-removed-local-class-ok/problems.txt

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { } }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
class A { def f() = { class Local } }

0 commit comments

Comments
 (0)