From 4da04eee1893ead433a624f6b146d56aca46cb7e Mon Sep 17 00:00:00 2001 From: Jason Zaugg Date: Sun, 25 Nov 2012 22:44:08 +0100 Subject: Preserve outer This() refs through resetAttrs. Adapt the compiler's standard ResetAttrs to keep This() nodes don't refer to a symbol defined in the current async block. --- .../scala/scala/async/run/hygiene/Hygiene.scala | 47 ++++++++++++++++------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'src/test/scala/scala/async/run/hygiene/Hygiene.scala') diff --git a/src/test/scala/scala/async/run/hygiene/Hygiene.scala b/src/test/scala/scala/async/run/hygiene/Hygiene.scala index 2aaf515..bb28d5b 100644 --- a/src/test/scala/scala/async/run/hygiene/Hygiene.scala +++ b/src/test/scala/scala/async/run/hygiene/Hygiene.scala @@ -88,16 +88,39 @@ class HygieneSpec { ext mustBe (14) } -// @Test def `this reference is maintained`() { -// object Test { -// def blerg = 1 -// def check() { -// AsyncId.async { -// assert(this.blerg == 1) -// assert(this == Test, this.getClass) -// } -// } -// } -// Test.check() -// } + trait T1 { + def blerg = 0 + } + + object O1 extends T1 { + override def blerg = 1 + + def check() { + val blerg = 3 + AsyncId.async { + assert(this == O1, this.getClass) + assert(this.blerg == 1) + assert(super.blerg == 0) + assert(super[T1].blerg == 0) + } + } + } + + @Test def `this reference is maintained`() { + O1.check() + } + + @Test def `this reference is maintained to local class`() { + object O2 { + def blerg = 2 + + def check() { + AsyncId.async { + assert(this.blerg == 2) + assert(this == O2, this.getClass) + } + } + } + O2.check() + } } -- cgit v1.2.3