diff options
author | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-09-09 16:02:46 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2014-09-17 18:07:17 +0200 |
commit | 899554fc34038be1ff2fe6fbd2bc38f1f39dce5b (patch) | |
tree | adf1c53f10e2e2264e580715c5d0909f05e8cb29 /src/dotty/tools/dotc/transform/PatternMatcher.scala | |
parent | 278d6cbe2b77241ef1dcb6b4208d5c041ca3c72b (diff) | |
download | dotty-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.scala | 15 |
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) |