aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/PatternMatcher.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2014-09-09 16:02:46 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-09-17 18:07:17 +0200
commit899554fc34038be1ff2fe6fbd2bc38f1f39dce5b (patch)
treeadf1c53f10e2e2264e580715c5d0909f05e8cb29 /src/dotty/tools/dotc/transform/PatternMatcher.scala
parent278d6cbe2b77241ef1dcb6b4208d5c041ca3c72b (diff)
downloaddotty-899554fc34038be1ff2fe6fbd2bc38f1f39dce5b.tar.gz
dotty-899554fc34038be1ff2fe6fbd2bc38f1f39dce5b.tar.bz2
dotty-899554fc34038be1ff2fe6fbd2bc38f1f39dce5b.zip
Fixed unapplySeq. Patmat passes all test suite but typer itself breaks on it.
Diffstat (limited to 'src/dotty/tools/dotc/transform/PatternMatcher.scala')
-rw-r--r--src/dotty/tools/dotc/transform/PatternMatcher.scala15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/transform/PatternMatcher.scala b/src/dotty/tools/dotc/transform/PatternMatcher.scala
index dff6d7b6a..1b3d19239 100644
--- a/src/dotty/tools/dotc/transform/PatternMatcher.scala
+++ b/src/dotty/tools/dotc/transform/PatternMatcher.scala
@@ -1807,14 +1807,23 @@ class PatternMatcher extends MiniPhaseTransform {
println("here")
val whole = fun.tpe.widen.paramTypess.headOption.flatMap(_.headOption).getOrElse(NoType)//firstParamType(method)
- val result = tree.tpe.widen// fun.tpe.fin
+ val resultOfGet = extractorMemberType(resultType, nme.get)
+
//println(s"${_id}unapplyArgs(${result.widen}")
- val expanded = /*(
+ val expanded:List[Type] = /*(
if (result =:= ctx.definitions.BooleanType) Nil
else if(defn.isProductSubType(result)) productSelectorTypes(result)
else if(result.classSymbol is Flags.CaseClass) result.decls.filter(x => x.is(Flags.CaseAccessor) && x.is(Flags.Method)).map(_.info).toList
else result.select(nme.get) :: Nil
- )*/ unapplyArgs(result, fun, args)
+ )*/
+ if ((extractorMemberType(resultType, nme.isDefined) isRef defn.BooleanClass) && resultOfGet.exists)
+ getUnapplySelectors(resultOfGet, args)
+ else if (defn.isProductSubType(resultType)) productSelectorTypes(resultType)
+ else {
+ ctx.error(i"invalid return type in Unapply node: $resultType")
+ Nil
+ }
+
expanded match {
case init :+ last if isSeq => newExtractor(whole, init, repeatedFromSeq(last))
case tps => newExtractor(whole, tps, NoRepeated)