@@ -108,9 +108,20 @@ object Splicer {
108108 }
109109
110110 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 ]
114125 }
115126
116127 protected def unexpectedTree (tree : Tree )(implicit env : Env ): Object =
@@ -237,11 +248,12 @@ object Splicer {
237248
238249 def apply (tree : Tree ): Boolean = interpretTree(tree)(Map .empty)
239250
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)
245257
246258 def unexpectedTree (tree : tpd.Tree )(implicit env : Env ): Boolean = {
247259 // Assuming that top-level splices can only be in inline methods
@@ -261,6 +273,7 @@ object Splicer {
261273 protected def interpretLiteral (value : Any )(implicit env : Env ): Result
262274 protected def interpretTastyContext ()(implicit env : Env ): Result
263275 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
264277 protected def unexpectedTree (tree : Tree )(implicit env : Env ): Result
265278
266279 protected final def interpretTree (tree : Tree )(implicit env : Env ): Result = tree match {
@@ -293,7 +306,14 @@ object Splicer {
293306
294307 case Inlined (EmptyTree , Nil , expansion) => interpretTree(expansion)
295308
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)
297317 }
298318
299319 object StaticMethodCall {
0 commit comments