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

scala.reflect.makro.runtime.Mirrors.scala Maven / Gradle / Ivy

package scala.reflect.makro
package runtime

import scala.tools.nsc.util.ScalaClassLoader

trait Mirrors {
  self: Context =>

  import universe._
  import definitions._

  class ContextMirror extends RootsBase(NoSymbol) {
    val universe: self.universe.type = self.universe
    def rootLoader: LazyType = rootMirror.rootLoader

    val RootPackage = rootMirror.RootPackage
    val RootClass = rootMirror.RootClass
    val EmptyPackage = rootMirror.EmptyPackage
    val EmptyPackageClass = rootMirror.EmptyPackageClass

    // [Eugene++] this still doesn't solve the problem of invoking `c.typeCheck` on the code that refers to packageless symbols
    override protected def mirrorMissingHook(owner: Symbol, name: Name): Symbol = {
      if (owner.isRoot && isJavaClass(name.toString)) EmptyPackageClass.info decl name
      else NoSymbol
    }

    private def isJavaClass(path: String): Boolean =
      try {
        val classpath = platform.classPath.asURLs
        var classLoader = ScalaClassLoader.fromURLs(classpath)
        Class.forName(path, true, classLoader)
        true
      } catch {
        case (_: ClassNotFoundException) | (_: NoClassDefFoundError) | (_: IncompatibleClassChangeError) =>
        false
      }

    override def toString = "macro context mirror"
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy