summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/Global.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-11-30 17:45:59 -0800
committerGitHub <noreply@github.com>2016-11-30 17:45:59 -0800
commitc2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b (patch)
treeb184b8e08dc9077a39b4f48e86e5e4959ffb3c01 /src/compiler/scala/tools/nsc/Global.scala
parent038c15e405b9498863a2236707686a7933748c60 (diff)
parentdde13b56f421a6f956abebc58f041acec8744149 (diff)
downloadscala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.tar.gz
scala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.tar.bz2
scala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.zip
Merge pull request #5284 from milessabin/topic/si-7046
SI-7046 reflection doesn't see all knownDirectSubclasses This appears to do the right thing in the most typical scenarios in which `knownDirectSubclasses` would be used. The missing 5% is that subclasses defined in local scopes might not be seen by `knownDirectSubclasses` (see `Local` and `Riddle` in the test below). In mitigation, though, it is almost certain that a local subclass would represent an error in any scenario where `knownDirectSubclasses` might be used. Errors for such situations are reported by recording (via a symbol attachment) that `knownDirectSubclasses` has been called and reporting an error if any additional children are added subsequently. Despite these limitations and caveats, I believe that this represents a huge improvement over the status quo, and would eliminate 100% of the failures that I've seen in practice with people using shapeless for type class derivation.
Diffstat (limited to 'src/compiler/scala/tools/nsc/Global.scala')
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 9c9be4eb4d..464fa1ad18 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -185,6 +185,19 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
}
}
+ private var propCnt = 0
+ @inline final def withPropagateCyclicReferences[T](t: => T): T = {
+ try {
+ propCnt = propCnt+1
+ t
+ } finally {
+ propCnt = propCnt-1
+ assert(propCnt >= 0)
+ }
+ }
+
+ def propagateCyclicReferences: Boolean = propCnt > 0
+
/** Representing ASTs as graphs */
object treeBrowsers extends {
val global: Global.this.type = Global.this