diff options
author | Adriaan Moors <adriaan@lightbend.com> | 2016-12-21 14:39:55 -0800 |
---|---|---|
committer | Adriaan Moors <adriaan@lightbend.com> | 2016-12-21 16:08:30 -0800 |
commit | 80ce23103ca72762ced87e5cb97e8ae34b434edd (patch) | |
tree | a8291109d3554093381dc2c067a64097d0f7d737 /src/compiler/scala | |
parent | 014ebc4606b6c3ecd305cee672f9ca734df77079 (diff) | |
download | scala-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')
-rw-r--r-- | src/compiler/scala/tools/nsc/transform/patmat/MatchTreeMaking.scala | 18 |
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 } } |