diff options
author | Martin Odersky <odersky@gmail.com> | 2015-05-05 22:18:46 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-05-08 13:33:50 +0200 |
commit | 1f1359349787b571a3c1b1d570548f71da8a767f (patch) | |
tree | 2ef260113630f0c5567ba91aa2e145db5c5daf02 /src | |
parent | 10610cbc65cce2e5056b8606968c738532e55bfd (diff) | |
download | dotty-1f1359349787b571a3c1b1d570548f71da8a767f.tar.gz dotty-1f1359349787b571a3c1b1d570548f71da8a767f.tar.bz2 dotty-1f1359349787b571a3c1b1d570548f71da8a767f.zip |
Drop the requirement that extractors with `get` must implement Product
We used to require that the result type of an extractor `get` is a product,
or else the type of the `get` itself would be taken as the result type of the
unapply. This is now relaxed so that we automatically select with _1, _2, ...
as soon as there are multiple argument patterns, and (1) the result type is not
a Seq, (2) the number of consecutive product conselectors matches the number
of arguments.
Diffstat (limited to 'src')
-rw-r--r-- | src/dotty/tools/dotc/typer/Applications.scala | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala index 7a826fee8..ce181c0cc 100644 --- a/src/dotty/tools/dotc/typer/Applications.scala +++ b/src/dotty/tools/dotc/typer/Applications.scala @@ -51,9 +51,12 @@ object Applications { sels.takeWhile(_.exists).toList } - def getUnapplySelectors(tp: Type, args:List[untpd.Tree], pos: Position = NoPosition)(implicit ctx: Context): List[Type] = - if (defn.isProductSubType(tp) && args.length > 1) productSelectorTypes(tp, pos) - else tp :: Nil + def getUnapplySelectors(tp: Type, args: List[untpd.Tree], pos: Position = NoPosition)(implicit ctx: Context): List[Type] = + if (args.length > 1 && !(tp.derivesFrom(defn.SeqClass))) { + val sels = productSelectorTypes(tp, pos) + if (sels.length == args.length) sels + else tp :: Nil + } else tp :: Nil def unapplyArgs(unapplyResult: Type, unapplyFn:Tree, args:List[untpd.Tree], pos: Position = NoPosition)(implicit ctx: Context): List[Type] = { @@ -747,6 +750,7 @@ trait Applications extends Compatibility { self: Typer => case _ => args } if (argTypes.length != bunchedArgs.length) { + println(argTypes) ctx.error(d"wrong number of argument patterns for $qual; expected: ($argTypes%, %)", tree.pos) argTypes = argTypes.take(args.length) ++ List.fill(argTypes.length - args.length)(WildcardType) |