diff options
author | Olivier Blanvillain <olivier.blanvillain@gmail.com> | 2017-04-06 18:35:20 +0200 |
---|---|---|
committer | Olivier Blanvillain <olivier.blanvillain@gmail.com> | 2017-04-06 18:53:30 +0200 |
commit | 944e677f437c39d85280c388cab000b5490e4386 (patch) | |
tree | e83b50e31f8b3661624fc4ec9fb8c09bdbd0a450 /compiler/src/dotty/tools/io | |
parent | c0ff8adcb4f44a0b01077495a7626d201f8100d5 (diff) | |
download | dotty-944e677f437c39d85280c388cab000b5490e4386.tar.gz dotty-944e677f437c39d85280c388cab000b5490e4386.tar.bz2 dotty-944e677f437c39d85280c388cab000b5490e4386.zip |
Decouple Product and pattern-matching
Product pattern use to:
- have a `<: Product` requirement
- compute the arity of a pattern by looking at `N` in a `ProductN` superclass.
This commit changes `<: Product`, instead we look for a `_1` member. The arity is determined by inspecting `_1` to `_N` members instead.
---
Here another attempt to formalize Dotty's pattern-matching (base on #1805). This covers the *Extractor Patterns* [section of the spec](https://www.scala-lang.org/files/archive/spec/2.12/08-pattern-matching.html#extractor-patterns). Dotty support 4 different extractor patterns: Boolean Pattern, Product Pattern, Seq Pattern and Name Based Pattern.
Boolean Pattern
- Extractor defines `def unapply(x: T): Boolean`
- Pattern-matching on exactly `0` patterns
Product Pattern
- Extractor defines `def unapply(x: T): U`
- `N > 0` is the maximum number of consecutive (parameterless `def` or `val`) `_1: P1` ... `_N: PN` members in `U`
- Pattern-matching on exactly `N` patterns with types `P1, P2, ..., PN`
Seq Pattern
- Extractor defines `def unapplySeq(x: T): U`
- `U` has (parameterless `def` or `val`) members `isEmpty: Boolean` and `get: S`
- `S <: Seq[V]`
- Pattern-matching on any number of pattern with types `V, V, ..., V`
Name Based Pattern
- Extractor defines `def unapply(x: T): U`
- `U` has (parameterless `def` or `val`) members `isEmpty: Boolean` and `get: S`
- If there is exactly `1` pattern, pattern-matching on `1` pattern with type `S`
- Otherwise fallback to Product Pattern on type `U`
In case of ambiguities, *Product Pattern* is preferred over *Name Based Pattern*.
Diffstat (limited to 'compiler/src/dotty/tools/io')
0 files changed, 0 insertions, 0 deletions