@@ -69,6 +69,14 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
69
69
}
70
70
}
71
71
72
+ def wrapIntoTerm (tree : Tree ): Tree =
73
+ if (! tree.isTerm) Block (List (tree), Literal (Constant (()))) else tree
74
+
75
+ def unwrapFromTerm (tree : Tree ): Tree = tree match {
76
+ case Block (List (tree), Literal (Constant (()))) => tree
77
+ case tree => tree
78
+ }
79
+
72
80
def extractFreeTerms (expr0 : Tree , wrapFreeTermRefs : Boolean ): (Tree , scala.collection.mutable.LinkedHashMap [FreeTermSymbol , TermName ]) = {
73
81
val freeTerms = expr0.freeTerms
74
82
val freeTermNames = scala.collection.mutable.LinkedHashMap [FreeTermSymbol , TermName ]()
@@ -101,7 +109,7 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
101
109
// need to wrap the expr, because otherwise you won't be able to typecheck macros against something that contains free vars
102
110
var (expr, freeTerms) = extractFreeTerms(expr0, wrapFreeTermRefs = false )
103
111
val dummies = freeTerms.map{ case (freeTerm, name) => ValDef (NoMods , name, TypeTree (freeTerm.info), Select (Ident (PredefModule ), newTermName(" $qmark$qmark$qmark" ))) }.toList
104
- expr = Block (dummies, expr)
112
+ expr = Block (dummies, wrapIntoTerm( expr) )
105
113
106
114
// [Eugene] how can we implement that?
107
115
// !!! Why is this is in the empty package? If it's only to make
@@ -136,6 +144,7 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
136
144
}
137
145
}.transform(unwrapped)
138
146
new TreeTypeSubstituter (dummies1 map (_.symbol), dummies1 map (dummy => SingleType (NoPrefix , invertedIndex(dummy.symbol.name)))).traverse(unwrapped)
147
+ unwrapped = if (expr0.isTerm) unwrapped else unwrapFromTerm(unwrapped)
139
148
unwrapped
140
149
}
141
150
@@ -169,7 +178,9 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
169
178
}
170
179
})
171
180
172
- def compile (expr : Tree ): () => Any = {
181
+ def compile (expr0 : Tree ): () => Any = {
182
+ val expr = wrapIntoTerm(expr0)
183
+
173
184
val freeTerms = expr.freeTerms // need to calculate them here, because later on they will be erased
174
185
val thunks = freeTerms map (fte => () => fte.value) // need to be lazy in order not to distort evaluation order
175
186
verify(expr)
0 commit comments