aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-02-19 16:33:43 +0100
committerMartin Odersky <odersky@gmail.com>2016-02-20 10:19:58 +0100
commit050c9af51432e3a752715af78b0de577d5af7f87 (patch)
treeefb575e1e362eb4f7e6d5118ae8dc325035ee535 /src/dotty/tools/dotc/typer/Typer.scala
parent14096e3601e42fd33fb2446b908a5cfce3cf1fa9 (diff)
downloaddotty-050c9af51432e3a752715af78b0de577d5af7f87.tar.gz
dotty-050c9af51432e3a752715af78b0de577d5af7f87.tar.bz2
dotty-050c9af51432e3a752715af78b0de577d5af7f87.zip
Special case for pattern matching tagged abstract types.
Add special case when pattern matching against an abstract type that comes with a class tag
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala21
1 files changed, 18 insertions, 3 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index fabee83b7..64c118288 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -427,10 +427,25 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
ifExpr = seqToRepeated(typedExpr(tree.expr, defn.SeqType)),
wildName = nme.WILDCARD_STAR)
else {
- def tpt1 = checkSimpleKinded(typedType(tree.tpt))
+ def typedTpt = checkSimpleKinded(typedType(tree.tpt))
+ def handlePattern: Tree = {
+ val tpt1 = typedTpt
+ // special case for an abstract type that comes with a class tag
+ tpt1.tpe.dealias match {
+ case tref: TypeRef if !tref.symbol.isClass =>
+ inferImplicit(defn.ClassTagType.appliedTo(tref),
+ EmptyTree, tpt1.pos)(ctx.retractMode(Mode.Pattern)) match {
+ case SearchSuccess(arg, _, _) =>
+ return typed(untpd.Apply(untpd.TypedSplice(arg), tree.expr), pt)
+ case _ =>
+ }
+ case _ =>
+ }
+ ascription(tpt1, isWildcard = true)
+ }
cases(
- ifPat = ascription(tpt1, isWildcard = true),
- ifExpr = ascription(tpt1, isWildcard = false),
+ ifPat = handlePattern,
+ ifExpr = ascription(typedTpt, isWildcard = false),
wildName = nme.WILDCARD)
}
}