summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/Trees.scala
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-02-18 14:37:51 +0100
committerEugene Burmako <xeno.by@gmail.com>2014-03-23 12:02:26 +0100
commit3314d76cebc6e27ba4d4ca75cc64fe67fcb90fb6 (patch)
tree3baf8d11bbed829f6ba0b66b03144a46fe05baed /src/reflect/scala/reflect/internal/Trees.scala
parentb66a39653b9bccab72036ba58fec5fd7d596d313 (diff)
downloadscala-3314d76cebc6e27ba4d4ca75cc64fe67fcb90fb6.tar.gz
scala-3314d76cebc6e27ba4d4ca75cc64fe67fcb90fb6.tar.bz2
scala-3314d76cebc6e27ba4d4ca75cc64fe67fcb90fb6.zip
[nomaster] typecheck(q"class C") no longer crashes
MemberDefs alone can't be typechecked as is, because namer only names contents of PackageDefs, Templates and Blocks. And, if not named, a tree can't be typed. This commit solves this problem by wrapping typecheckees in a trivial block and then unwrapping the result when it returns back from the typechecker. (cherry picked from commit 609047ba372ceaf06916d3361954bc949a6906ee)
Diffstat (limited to 'src/reflect/scala/reflect/internal/Trees.scala')
-rw-r--r--src/reflect/scala/reflect/internal/Trees.scala15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala
index 53b9b1d88e..0e5985face 100644
--- a/src/reflect/scala/reflect/internal/Trees.scala
+++ b/src/reflect/scala/reflect/internal/Trees.scala
@@ -1538,6 +1538,21 @@ trait Trees extends api.Trees { self: SymbolTable =>
def duplicateAndKeepPositions(tree: Tree) = new Duplicator(focusPositions = false) transform tree
+ def wrapIntoTerm(tree: Tree): Tree = {
+ if (!tree.isTerm) Block(List(tree), Literal(Constant(()))) else tree
+ }
+
+ // this is necessary to avoid crashes like https://github.com/scalamacros/paradise/issues/1
+ // when someone tries to c.typecheck a naked MemberDef
+ def wrappingIntoTerm(tree0: Tree)(op: Tree => Tree): Tree = {
+ val neededWrapping = !tree0.isTerm
+ val tree1 = wrapIntoTerm(tree0)
+ op(tree1) match {
+ case Block(tree2 :: Nil, Literal(Constant(()))) if neededWrapping => tree2
+ case tree2 => tree2
+ }
+ }
+
// ------ copiers -------------------------------------------
def copyDefDef(tree: Tree)(