@@ -111,9 +111,20 @@ object Splicer {
111111 }
112112
113113 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 ]
117128 }
118129
119130 protected def unexpectedTree (tree : Tree )(implicit env : Env ): Object =
@@ -240,12 +251,13 @@ object Splicer {
240251
241252 def apply (tree : Tree ): Boolean = interpretTree(tree)(Map .empty)
242253
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)
249261
250262 def unexpectedTree (tree : tpd.Tree )(implicit env : Env ): Boolean = {
251263 // Assuming that top-level splices can only be in inline methods
@@ -266,6 +278,7 @@ object Splicer {
266278 protected def interpretVarargs (args : List [Result ])(implicit env : Env ): Result
267279 protected def interpretTastyContext ()(implicit env : Env ): Result
268280 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
269282 protected def unexpectedTree (tree : Tree )(implicit env : Env ): Result
270283
271284 protected final def interpretTree (tree : Tree )(implicit env : Env ): Result = tree match {
@@ -300,6 +313,12 @@ object Splicer {
300313
301314 case Typed (SeqLiteral (elems, _), _) => interpretVarargs(elems.map(e => interpretTree(e)))
302315
316+ case Apply (TypeApply (fun : RefTree , _), args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package ) =>
317+ interpretNew(fun, args.map(interpretTree))
318+
319+ case Apply (fun : RefTree , args) if fun.symbol.isConstructor && fun.symbol.owner.owner.is(Package )=>
320+ interpretNew(fun, args.map(interpretTree))
321+
303322 case _ =>
304323 unexpectedTree(tree)
305324 }
0 commit comments