diff options
author | Martin Odersky <odersky@gmail.com> | 2016-02-19 16:33:43 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-02-20 10:19:58 +0100 |
commit | 050c9af51432e3a752715af78b0de577d5af7f87 (patch) | |
tree | efb575e1e362eb4f7e6d5118ae8dc325035ee535 /src/dotty/tools/dotc/typer/Typer.scala | |
parent | 14096e3601e42fd33fb2446b908a5cfce3cf1fa9 (diff) | |
download | dotty-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.scala | 21 |
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) } } |