dotty.tools.dotc.transform.PatternMatcher.Translator.ScalacPatternExpanders
If elementArity is...
If elementArity is... 0: A perfect match between extractor and the fixed patterns. If there is a star pattern it will match any sequence. > 0: There are more patterns than products. There will have to be a sequence which can populate at least <elementArity> patterns. < 0: There are more products than patterns: compile time error.
An 'extractor' can be a case class or an unapply or unapplySeq method.
An 'extractor' can be a case class or an unapply or unapplySeq method. Decoding what it is that they extract takes place before we arrive here, so that this class can concentrate only on the relationship between patterns and types.
In a case class, the class is the unextracted type and the fixed and repeated types are derived from its constructor parameters.
In an unapply, this is reversed: the parameter to the unapply is the unextracted type, and the other types are derived based on the return type of the unapply method.
In other words, this case class and unapply are encoded the same:
case class Foo(x: Int, y: Int, zs: Char*) def unapplySeq(x: Foo): Option[(Int, Int, Seq[Char])]
Both are Extractor(Foo, Int :: Int :: Nil, Repeated(Seq[Char], Char, Char*))
The type in its unextracted form
The non-sequence types which are extracted
The sequence type which is extracted
It's not optimal that we're carrying both sequence and repeated type here, but the implementation requires more unraveling before it can be avoided.
It's not optimal that we're carrying both sequence and repeated type here, but the implementation requires more unraveling before it can be avoided.
sequenceType is Seq[T], elementType is T, repeatedType is T*.
You'll note we're not inside the cake.
You'll note we're not inside the cake. "Pattern" and "Type" are arbitrary types here, and NoPattern and NoType arbitrary values.
In this case we are basing the pattern expansion on a case class constructor.
In this case we are basing the pattern expansion on a case class constructor. The argument is the MethodType carried by the primary constructor.
In this case, expansion is based on an unapply or unapplySeq method.
In this case, expansion is based on an unapply or unapplySeq method. Unfortunately the MethodType does not carry the information of whether it was unapplySeq, so we have to funnel that information in separately.