diff options
author | Martin Odersky <odersky@gmail.com> | 2013-12-07 18:14:29 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-12-07 18:14:29 +0100 |
commit | 377eb3318cdacd2dfb91d56be3649431ec1155f0 (patch) | |
tree | 058530f166821fdc58df3ba9833006c9da3d481c /src/dotty/tools/dotc/typer/Applications.scala | |
parent | e74b6316b93993e3c798bd9df45d83fc0665c52e (diff) | |
download | dotty-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.scala | 11 |
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) |