aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Applications.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-12-07 18:14:29 +0100
committerMartin Odersky <odersky@gmail.com>2013-12-07 18:14:29 +0100
commit377eb3318cdacd2dfb91d56be3649431ec1155f0 (patch)
tree058530f166821fdc58df3ba9833006c9da3d481c /src/dotty/tools/dotc/typer/Applications.scala
parente74b6316b93993e3c798bd9df45d83fc0665c52e (diff)
downloaddotty-377eb3318cdacd2dfb91d56be3649431ec1155f0.tar.gz
dotty-377eb3318cdacd2dfb91d56be3649431ec1155f0.tar.bz2
dotty-377eb3318cdacd2dfb91d56be3649431ec1155f0.zip
Fixes for desugarings of case classes.
Also: Standardized on selectorName; Translate $init$ to <init> when unpickling.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Applications.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Applications.scala11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala
index 3de835736..023e7c2b5 100644
--- a/src/dotty/tools/dotc/typer/Applications.scala
+++ b/src/dotty/tools/dotc/typer/Applications.scala
@@ -564,7 +564,7 @@ trait Applications extends Compatibility { self: Typer =>
}
def productSelectors(tp: Type): List[Type] = {
- val sels = for (n <- Iterator.from(1)) yield extractorMemberType(tp, ("_" + n).toTermName)
+ val sels = for (n <- Iterator.from(0)) yield extractorMemberType(tp, nme.selectorName(n))
sels.takeWhile(_.exists).toList
}
def seqSelector = defn.RepeatedParamType.appliedTo(unapplyResult.elemType :: Nil)
@@ -572,9 +572,12 @@ trait Applications extends Compatibility { self: Typer =>
if (tp derivesFrom defn.ProductClass) productSelectors(tp) else tp :: Nil
def getTp = extractorMemberType(unapplyResult, nme.get)
- if ((extractorMemberType(unapplyResult, nme.isDefined) isRef defn.BooleanClass) &&
- getTp.exists) getSelectors(getTp)
- else if (unapplyResult derivesFrom defn.SeqClass) seqSelector :: Nil
+ // println(s"unapply $unapplyResult ${extractorMemberType(unapplyResult, nme.isDefined)}")
+ if (extractorMemberType(unapplyResult, nme.isDefined) isRef defn.BooleanClass) {
+ if (getTp.exists) return getSelectors(getTp)
+ else if (unapplyResult derivesFrom defn.ProductClass) return productSelectors(unapplyResult)
+ }
+ if (unapplyResult derivesFrom defn.SeqClass) seqSelector :: Nil
else if (unapplyResult isRef defn.BooleanClass) Nil
else {
ctx.error(s"${unapplyResult.show} is not a valid result type of an unapply method of an extractor", tree.pos)