All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.scalajs.testinterface.TestUtils.scala Maven / Gradle / Ivy

There is a newer version: 0.6.12
Show newest version
package org.scalajs.testinterface

import language.experimental.macros

/** Dummy object to get the right shadowing for 2.10 / 2.11 cross compilation */
private object Compat210 {
  object blackbox { // scalastyle:ignore
    type Context = scala.reflect.macros.Context
  }
}

import Compat210._

object TestUtils {
  import scala.reflect.macros._ // shadows blackbox from above
  import blackbox.Context

  def newInstance(name: String, loader: ClassLoader)(args: Seq[AnyRef]): AnyRef =
    macro newInstance_impl

  def newInstance_impl(c: Context)(name: c.Expr[String],
      loader: c.Expr[ClassLoader])(
      args: c.Expr[Seq[AnyRef]]): c.Expr[AnyRef] = c.universe.reify {

    val clazz = loader.splice.loadClass(name.splice)
    val ctors = clazz.getConstructors()

    if (ctors.size != 1) {
      throw new IllegalArgumentException(
          "You may only call newInstance with single-ctor classes")
    }

    val ctor = ctors.head
    ctor.newInstance(args.splice: _*).asInstanceOf[AnyRef]
  }

  def loadModule(name: String, loader: ClassLoader): AnyRef =
    macro loadModule_impl

  def loadModule_impl(c: Context)(name: c.Expr[String],
      loader: c.Expr[ClassLoader]): c.Expr[AnyRef] = c.universe.reify {
    val clazz = loader.splice.loadClass(name.splice + "$")
    clazz.getField("MODULE$").get(null)
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy