summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-12-21 14:39:55 -0800
committerAdriaan Moors <adriaan@lightbend.com>2016-12-21 16:08:30 -0800
commit80ce23103ca72762ced87e5cb97e8ae34b434edd (patch)
treea8291109d3554093381dc2c067a64097d0f7d737 /src/compiler/scala/tools/nsc/transform
parent014ebc4606b6c3ecd305cee672f9ca734df77079 (diff)
downloadscala-80ce23103ca72762ced87e5cb97e8ae34b434edd.tar.gz
scala-80ce23103ca72762ced87e5cb97e8ae34b434edd.tar.bz2
scala-80ce23103ca72762ced87e5cb97e8ae34b434edd.zip
More robust outer test for patmat
While investigating https://github.com/scala/scala-dev/issues/251
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform')
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala18
1 files changed, 8 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala b/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
index e0fcc05de2..3ace61411f 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala
@@ -337,17 +337,15 @@ trait MatchTreeMaking extends MatchCodeGen with Debugging {
def eqTest(pat: Tree, testedBinder: Symbol) = REF(testedBinder) OBJ_EQ pat
def outerTest(testedBinder: Symbol, expectedTp: Type): Tree = {
- val expectedOuter = expectedTp.prefix match {
- case ThisType(clazz) => This(clazz)
- case NoType => mkTRUE // fallback for SI-6183
- case pre => REF(pre.prefix, pre.termSymbol)
+ val expectedPrefix = expectedTp.prefix
+ if (expectedPrefix eq NoType) mkTRUE // fallback for SI-6183
+ else {
+ // ExplicitOuter replaces `Select(q, outerSym) OBJ_EQ expectedPrefix` by `Select(q, outerAccessor(outerSym.owner)) OBJ_EQ expectedPrefix`
+ // if there's an outer accessor, otherwise the condition becomes `true` -- TODO: can we improve needsOuterTest so there's always an outerAccessor?
+ val outerFor = expectedTp.typeSymbol
+ val outerMarker = outerFor.newMethod(vpmName.outer, newFlags = SYNTHETIC | ARTIFACT) setInfo expectedPrefix
+ Select(codegen._asInstanceOf(testedBinder, expectedTp), outerMarker) OBJ_EQ gen.mkAttributedQualifier(expectedPrefix)
}
-
- // ExplicitOuter replaces `Select(q, outerSym) OBJ_EQ expectedPrefix` by `Select(q, outerAccessor(outerSym.owner)) OBJ_EQ expectedPrefix`
- // if there's an outer accessor, otherwise the condition becomes `true` -- TODO: can we improve needsOuterTest so there's always an outerAccessor?
- val outer = expectedTp.typeSymbol.newMethod(vpmName.outer, newFlags = SYNTHETIC | ARTIFACT) setInfo expectedTp.prefix
-
- (Select(codegen._asInstanceOf(testedBinder, expectedTp), outer)) OBJ_EQ expectedOuter
}
}