diff options
author | Guillaume Martres <smarter@ubuntu.com> | 2015-04-04 01:15:16 +0200 |
---|---|---|
committer | Dmitry Petrashko <dmitry.petrashko@gmail.com> | 2015-05-01 13:27:42 +0200 |
commit | 411d5be477cc862b14d8938c591524d8bf37d4cd (patch) | |
tree | 3350ebafcea9888897c9eab47b82f748cbe9ed23 /src/dotty/tools/dotc/transform/TreeExtractors.scala | |
parent | 3fca64e2dfd53e376b3a45605100ef6f768b07a4 (diff) | |
download | dotty-411d5be477cc862b14d8938c591524d8bf37d4cd.tar.gz dotty-411d5be477cc862b14d8938c591524d8bf37d4cd.tar.bz2 dotty-411d5be477cc862b14d8938c591524d8bf37d4cd.zip |
New phase: VCInline which inlines value classes calls
This corresponds roughly to step 2 of SIP-15 and to the peephole
optimizations of step 3.
The extractors in TreeExtractors are copied or inspired from
src/compiler/scala/tools/nsc/ast/TreeInfo.scala in scalac.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeExtractors.scala')
-rw-r--r-- | src/dotty/tools/dotc/transform/TreeExtractors.scala | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeExtractors.scala b/src/dotty/tools/dotc/transform/TreeExtractors.scala new file mode 100644 index 000000000..7a5c5df9d --- /dev/null +++ b/src/dotty/tools/dotc/transform/TreeExtractors.scala @@ -0,0 +1,48 @@ +package dotty.tools.dotc +package transform + +import ast.{Trees, tpd} +import core._, core.Decorators._ +import Contexts._, Flags._, Trees._, Types._, StdNames._, Symbols._ +import ValueClasses._ + +object TreeExtractors { + import tpd._ + + /** Match arg1.op(arg2) and extract (arg1, op.symbol, arg2) */ + object BinaryOp { + def unapply(t: Tree)(implicit ctx: Context): Option[(Tree, Symbol, Tree)] = t match { + case Apply(sel @ Select(arg1, _), List(arg2)) => + Some((arg1, sel.symbol, arg2)) + case _ => + None + } + } + + /** Match new C(args) and extract (C, args) */ + object NewWithArgs { + def unapply(t: Tree)(implicit ctx: Context): Option[(Type, List[Tree])] = t match { + case Apply(Select(New(_), nme.CONSTRUCTOR), args) => + Some((t.tpe, args)) + case _ => + None + } + } + + /** For an instance v of a value class like: + * class V(val underlying: X) extends AnyVal + * Match v.underlying() and extract v + */ + object ValueClassUnbox { + def unapply(t: Tree)(implicit ctx: Context): Option[Tree] = t match { + case Apply(sel @ Select(ref, _), Nil) => + val d = ref.tpe.widenDealias.typeSymbol.denot + if (isDerivedValueClass(d) && (sel.symbol eq valueClassUnbox(d.asClass))) { + Some(ref) + } else + None + case _ => + None + } + } +} |