summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2015-08-31 13:44:54 +1000
committerJason Zaugg <jzaugg@gmail.com>2015-09-21 14:00:09 +1000
commitdaa421189d9191f05b5006418580eb6c0e0b1ec7 (patch)
tree50ba9c340893db51303d16d0b2b41b0b366a407b /src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
parentf1e553ecfbea25bcc7e13294f6104d599336f460 (diff)
downloadscala-daa421189d9191f05b5006418580eb6c0e0b1ec7.tar.gz
scala-daa421189d9191f05b5006418580eb6c0e0b1ec7.tar.bz2
scala-daa421189d9191f05b5006418580eb6c0e0b1ec7.zip
SI-8989 Better error message for invalid extractor pattern
Diffstat (limited to 'src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala')
-rw-r--r--src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala b/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
index 55d4366a46..5678c53e78 100644
--- a/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
+++ b/src/compiler/scala/tools/nsc/transform/patmat/ScalacPatternExpanders.scala
@@ -74,11 +74,16 @@ trait ScalacPatternExpanders {
* Unfortunately the MethodType does not carry the information of whether
* it was unapplySeq, so we have to funnel that information in separately.
*/
- def unapplyMethodTypes(whole: Type, result: Type, isSeq: Boolean): Extractor = {
+ def unapplyMethodTypes(context: Context, whole: Type, result: Type, isSeq: Boolean): Extractor = {
if (result =:= BooleanTpe) newExtractor(whole, Nil, NoRepeated)
else {
val getResult = typeOfMemberNamedGet(result)
+ def noGetError() = {
+ val name = "unapply" + (if (isSeq) "Seq" else "")
+ context.error(context.tree.pos, s"The result type of an $name method must contain a member `get` to be used as an extractor pattern, no such member exists in ${result}")
+ }
val expanded = getResult match {
+ case global.NoType => noGetError(); Nil
case rawGet if !hasSelectors(rawGet) => rawGet :: Nil
case rawGet => typesOfSelectors(rawGet)
}
@@ -131,8 +136,8 @@ trait ScalacPatternExpanders {
val isUnapply = sel.symbol.name == nme.unapply
val extractor = sel.symbol.name match {
- case nme.unapply => unapplyMethodTypes(firstParamType(fn.tpe), sel.tpe, isSeq = false)
- case nme.unapplySeq => unapplyMethodTypes(firstParamType(fn.tpe), sel.tpe, isSeq = true)
+ case nme.unapply => unapplyMethodTypes(context, firstParamType(fn.tpe), sel.tpe, isSeq = false)
+ case nme.unapplySeq => unapplyMethodTypes(context, firstParamType(fn.tpe), sel.tpe, isSeq = true)
case _ => applyMethodTypes(fn.tpe)
}