aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeExtractors.scala
diff options
context:
space:
mode:
authorGuillaume Martres <smarter@ubuntu.com>2015-04-04 01:15:16 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2015-05-01 13:27:42 +0200
commit411d5be477cc862b14d8938c591524d8bf37d4cd (patch)
tree3350ebafcea9888897c9eab47b82f748cbe9ed23 /src/dotty/tools/dotc/transform/TreeExtractors.scala
parent3fca64e2dfd53e376b3a45605100ef6f768b07a4 (diff)
downloaddotty-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.scala48
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
+ }
+ }
+}