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