@@ -250,7 +250,7 @@ object Splicer {
250250 interpretModuleAccess(fn.symbol)
251251 else if (fn.symbol.is(Method ) && fn.symbol.isStatic) {
252252 val staticMethodCall = interpretedStaticMethodCall(fn.symbol.owner, fn.symbol)
253- staticMethodCall(args.flatten.map(interpretTree ))
253+ staticMethodCall(interpretArgs( args, fn.symbol.info ))
254254 }
255255 else if fn.symbol.isStatic then
256256 assert(args.isEmpty)
@@ -260,7 +260,7 @@ object Splicer {
260260 interpretModuleAccess(fn.qualifier.symbol)
261261 else {
262262 val staticMethodCall = interpretedStaticMethodCall(fn.qualifier.symbol.moduleClass, fn.symbol)
263- staticMethodCall(args.flatten.map(interpretTree ))
263+ staticMethodCall(interpretArgs( args, fn.symbol.info ))
264264 }
265265 else if (env.contains(fn.symbol))
266266 env(fn.symbol)
@@ -289,6 +289,32 @@ object Splicer {
289289 unexpectedTree(tree)
290290 }
291291
292+ private def interpretArgs (argss : List [List [Tree ]], fnType : Type )(using Env ): List [Object ] = {
293+ def interpretArgsGroup (args : List [Tree ], argTypes : List [Type ]): List [Object ] =
294+ assert(args.size == argTypes.size)
295+ val view =
296+ for (arg, info) <- args.lazyZip(argTypes) yield
297+ info match
298+ case _ : ExprType => () => interpretTree(arg) // by-name argument
299+ case _ => interpretTree(arg) // by-value argument
300+ view.toList
301+
302+ fnType.dealias match
303+ case fnType : MethodType if fnType.isErasedMethod => interpretArgs(argss, fnType.resType)
304+ case fnType : MethodType =>
305+ val argTypes = fnType.paramInfos
306+ assert(argss.head.size == argTypes.size)
307+ interpretArgsGroup(argss.head, argTypes) ::: interpretArgs(argss.tail, fnType.resType)
308+ case fnType : AppliedType if defn.isContextFunctionType(fnType) =>
309+ val argTypes :+ resType = fnType.args
310+ interpretArgsGroup(argss.head, argTypes) ::: interpretArgs(argss.tail, resType)
311+ case fnType : PolyType => interpretArgs(argss, fnType.resType)
312+ case fnType : ExprType => interpretArgs(argss, fnType.resType)
313+ case _ =>
314+ assert(argss.isEmpty)
315+ Nil
316+ }
317+
292318 private def interpretBlock (stats : List [Tree ], expr : Tree )(implicit env : Env ) = {
293319 var unexpected : Option [Object ] = None
294320 val newEnv = stats.foldLeft(env)((accEnv, stat) => stat match {
0 commit comments