@@ -108,9 +108,20 @@ object Splicer {
108
108
}
109
109
110
110
protected def interpretStaticMethodCall (fn : Tree , args : => List [Object ])(implicit env : Env ): Object = {
111
- val (clazz, instance) = loadModule(fn.symbol.owner)
112
- val method = getMethod(clazz, fn.symbol.name, paramsSig(fn.symbol))
113
- stopIfRuntimeException(method.invoke(instance, args : _* ))
111
+ if (fn.symbol == defn.NoneModuleRef .termSymbol) {
112
+ // TODO generalize
113
+ None
114
+ } else {
115
+ val (clazz, instance) = loadModule(fn.symbol.owner)
116
+ val method = getMethod(clazz, fn.symbol.name, paramsSig(fn.symbol))
117
+ stopIfRuntimeException(method.invoke(instance, args : _* ))
118
+ }
119
+ }
120
+
121
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Object = {
122
+ val clazz = loadClass(fn.symbol.owner.fullName)
123
+ val constr = clazz.getConstructor(paramsSig(fn.symbol): _* )
124
+ constr.newInstance(args : _* ).asInstanceOf [Object ]
114
125
}
115
126
116
127
protected def unexpectedTree (tree : Tree )(implicit env : Env ): Object =
@@ -237,11 +248,12 @@ object Splicer {
237
248
238
249
def apply (tree : Tree ): Boolean = interpretTree(tree)(Map .empty)
239
250
240
- def interpretQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
241
- def interpretTypeQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
242
- def interpretLiteral (value : Any )(implicit env : Env ): Boolean = true
243
- def interpretTastyContext ()(implicit env : Env ): Boolean = true
244
- def interpretStaticMethodCall (fn : tpd.Tree , args : => List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
251
+ protected def interpretQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
252
+ protected def interpretTypeQuote (tree : tpd.Tree )(implicit env : Env ): Boolean = true
253
+ protected def interpretLiteral (value : Any )(implicit env : Env ): Boolean = true
254
+ protected def interpretTastyContext ()(implicit env : Env ): Boolean = true
255
+ protected def interpretStaticMethodCall (fn : tpd.Tree , args : => List [Boolean ])(implicit env : Env ): Boolean = args.forall(identity)
256
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Boolean = args.forall(identity)
245
257
246
258
def unexpectedTree (tree : tpd.Tree )(implicit env : Env ): Boolean = {
247
259
// Assuming that top-level splices can only be in inline methods
@@ -261,6 +273,7 @@ object Splicer {
261
273
protected def interpretLiteral (value : Any )(implicit env : Env ): Result
262
274
protected def interpretTastyContext ()(implicit env : Env ): Result
263
275
protected def interpretStaticMethodCall (fn : Tree , args : => List [Result ])(implicit env : Env ): Result
276
+ protected def interpretNew (fn : RefTree , args : => List [Result ])(implicit env : Env ): Result
264
277
protected def unexpectedTree (tree : Tree )(implicit env : Env ): Result
265
278
266
279
protected final def interpretTree (tree : Tree )(implicit env : Env ): Result = tree match {
@@ -293,7 +306,14 @@ object Splicer {
293
306
294
307
case Inlined (EmptyTree , Nil , expansion) => interpretTree(expansion)
295
308
296
- case _ => unexpectedTree(tree)
309
+ case Apply (TypeApply (fun : RefTree , _), args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package ) =>
310
+ interpretNew(fun, args.map(interpretTree))
311
+
312
+ case Apply (fun : RefTree , args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package )=>
313
+ interpretNew(fun, args.map(interpretTree))
314
+
315
+ case _ =>
316
+ unexpectedTree(tree)
297
317
}
298
318
299
319
object StaticMethodCall {
0 commit comments