Please sign in to comment.
SI-6138 Centralize and refine detection of `getClass` calls
`getClass` is special cased in the compiler; this is described in in the comments on `Definitions.Any_getClass`. Part of this happens in `Typer#stabilize`. This was trying to determine if an Ident or Select node was a call to `getClass` by merits of the name of the tree's symbol and by checking that the its type (if it was a MethodType or PolyType) had no parameters in the primary parameter list. Overloaded user defined `getClass` methods confused this check. In the enclosed test case, the tree `definitions.this.getClass` had an `OverloadedType`, and such types always report an empty list of `params`. This commit: - changes `stabilize` to use `isGetClass`, rather than the homebrew check - changes `isGetClass` to consider a `Set[Symbol]` containing all `getClass` variants. This moves some similar code from `Erasure` to `Definitions` - keeps a fast negative path in `isGetClass` based on the symbol's name
- Loading branch information...
Showing with 39 additions and 9 deletions.
- +8 −0 bincompat-backward.whitelist.conf
- +8 −0 bincompat-forward.whitelist.conf
- +0 −5 src/compiler/scala/tools/nsc/transform/Erasure.scala
- +1 −2 src/compiler/scala/tools/nsc/typechecker/Typers.scala
- +10 −2 src/reflect/scala/reflect/internal/Definitions.scala
- +7 −0 test/files/neg/t6138.check
- +5 −0 test/files/neg/t6138.scala
|@@ -0,0 +1,7 @@|
|+t6138.scala:4: error: ambiguous reference to overloaded definition,|
|+both method getClass in object definitions of type (s: Int)Any|
|+and method getClass in object definitions of type (s: String)Any|
|+match argument types (Nothing)|
|+ getClass(???): String|
|+one error found|