@@ -111,9 +111,20 @@ object Splicer {
111
111
}
112
112
113
113
protected def interpretStaticMethodCall (fn : Tree , args : => List [Object ])(implicit env : Env ): Object = {
114
- val (clazz, instance) = loadModule(fn.symbol.owner)
115
- val method = getMethod(clazz, fn.symbol.name, paramsSig(fn.symbol))
116
- stopIfRuntimeException(method.invoke(instance, args : _* ))
114
+ if (fn.symbol == defn.NoneModuleRef .termSymbol) {
115
+ // TODO generalize
116
+ None
117
+ } else {
118
+ val (clazz, instance) = loadModule(fn.symbol.owner)
119
+ val method = getMethod(clazz, fn.symbol.name, paramsSig(fn.symbol))
120
+ stopIfRuntimeException(method.invoke(instance, args : _* ))
121
+ }
122
+ }
123
+
124
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Object = {
125
+ val clazz = loadClass(fn.symbol.owner.fullName)
126
+ val constr = clazz.getConstructor(paramsSig(fn.symbol): _* )
127
+ constr.newInstance(args : _* ).asInstanceOf [Object ]
117
128
}
118
129
119
130
protected def unexpectedTree (tree : Tree )(implicit env : Env ): Object =
@@ -240,12 +251,13 @@ object Splicer {
240
251
241
252
def apply (tree : Tree ): Boolean = interpretTree(tree)(Map .empty)
242
253
243
- def interpretQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
244
- def interpretTypeQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
245
- def interpretLiteral (value : Any )(implicit env : Env ): Boolean = true
246
- def interpretVarargs (args : List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
247
- def interpretTastyContext ()(implicit env : Env ): Boolean = true
248
- def interpretStaticMethodCall (fn : tpd.Tree , args : => List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
254
+ protected def interpretQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
255
+ protected def interpretTypeQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
256
+ protected def interpretLiteral (value : Any )(implicit env : Env ): Boolean = true
257
+ protected def interpretVarargs (args : List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
258
+ protected def interpretTastyContext ()(implicit env : Env ): Boolean = true
259
+ protected def interpretStaticMethodCall (fn : tpd.Tree , args : => List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
260
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Boolean = args.forall(identity)
249
261
250
262
def unexpectedTree (tree : tpd.Tree )(implicit env : Env ): Boolean = {
251
263
// Assuming that top-level splices can only be in inline methods
@@ -266,6 +278,7 @@ object Splicer {
266
278
protected def interpretVarargs (args : List [Result ])(implicit env : Env ): Result
267
279
protected def interpretTastyContext ()(implicit env : Env ): Result
268
280
protected def interpretStaticMethodCall (fn : Tree , args : => List [Result ])(implicit env : Env ): Result
281
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Result
269
282
protected def unexpectedTree (tree : Tree )(implicit env : Env ): Result
270
283
271
284
protected final def interpretTree (tree : Tree )(implicit env : Env ): Result = tree match {
@@ -298,7 +311,14 @@ object Splicer {
298
311
299
312
case Inlined (EmptyTree , Nil , expansion) => interpretTree(expansion)
300
313
301
- case Typed (SeqLiteral (elems, _), _) => interpretVarargs(elems.map(e => interpretTree(e)))
314
+ case Apply (TypeApply (fun : RefTree , _), args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package ) =>
315
+ interpretNew(fun, args.map(interpretTree))
316
+
317
+ case Apply (fun : RefTree , args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package )=>
318
+ interpretNew(fun, args.map(interpretTree))
319
+
320
+ case Typed (SeqLiteral (elems, _), _) =>
321
+ interpretVarargs(elems.map(e => interpretTree(e)))
302
322
303
323
case _ =>
304
324
unexpectedTree(tree)
0 commit comments