diff options
author | Den Shabalin <den.shabalin@gmail.com> | 2013-09-05 13:35:42 +0200 |
---|---|---|
committer | Den Shabalin <den.shabalin@gmail.com> | 2013-09-05 20:42:10 +0200 |
commit | a455858fc19e47dca10f446df0f61297d0d60276 (patch) | |
tree | 002b867b22f973757c76ca70b506451987f6cf73 /src/reflect/scala/reflect/internal/BuildUtils.scala | |
parent | 546e94099d667c6395582fcba321ef95578121a5 (diff) | |
download | scala-a455858fc19e47dca10f446df0f61297d0d60276.tar.gz scala-a455858fc19e47dca10f446df0f61297d0d60276.tar.bz2 scala-a455858fc19e47dca10f446df0f61297d0d60276.zip |
SI-7723 better support for deconstruction of new expressions
Diffstat (limited to 'src/reflect/scala/reflect/internal/BuildUtils.scala')
-rw-r--r-- | src/reflect/scala/reflect/internal/BuildUtils.scala | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala index 936ca91c68..eaa4f7cba8 100644 --- a/src/reflect/scala/reflect/internal/BuildUtils.scala +++ b/src/reflect/scala/reflect/internal/BuildUtils.scala @@ -343,6 +343,21 @@ trait BuildUtils { self: SymbolTable => case _ => None } } + + object SyntacticNew extends SyntacticNewExtractor { + def apply(earlyDefs: List[Tree], parents: List[Tree], selfdef: ValDef, body: List[Tree]): Tree = + gen.mkNew(parents, selfdef, earlyDefs ::: body, NoPosition, NoPosition) + + def unapply(tree: Tree): Option[(List[Tree], List[Tree], ValDef, List[Tree])] = tree match { + case SyntacticApplied(Select(New(SyntacticTypeApplied(ident, targs)), nme.CONSTRUCTOR), argss) => + Some((Nil, SyntacticApplied(SyntacticTypeApplied(ident, targs), argss) :: Nil, emptyValDef, Nil)) + case SyntacticBlock(SyntacticClassDef(_, tpnme.ANON_CLASS_NAME, Nil, _, List(Nil), earlyDefs, parents, selfdef, body) :: + Apply(Select(New(Ident(tpnme.ANON_CLASS_NAME)), nme.CONSTRUCTOR), Nil) :: Nil) => + Some((earlyDefs, parents, selfdef, body)) + case _ => + None + } + } } val build: BuildApi = new BuildImpl |