From 105d3efcc723cb7312a25a898a7769c7f762b57e Mon Sep 17 00:00:00 2001 From: Eugene Burmako Date: Mon, 2 Jul 2012 00:37:59 +0200 Subject: moves reflective compiler into scala.tools.reflect --- src/compiler/scala/tools/nsc/ReflectGlobal.scala | 37 -------------------- src/compiler/scala/tools/nsc/ReflectMain.scala | 15 -------- src/compiler/scala/tools/nsc/ReflectSetup.scala | 7 ---- .../scala/tools/reflect/ReflectGlobal.scala | 40 ++++++++++++++++++++++ src/compiler/scala/tools/reflect/ReflectMain.scala | 19 ++++++++++ .../scala/tools/reflect/ReflectSetup.scala | 10 ++++++ .../scala/tools/reflect/ToolBoxFactory.scala | 1 - .../scala/reflect/runtime/SymbolTable.scala | 2 +- 8 files changed, 70 insertions(+), 61 deletions(-) delete mode 100644 src/compiler/scala/tools/nsc/ReflectGlobal.scala delete mode 100644 src/compiler/scala/tools/nsc/ReflectMain.scala delete mode 100644 src/compiler/scala/tools/nsc/ReflectSetup.scala create mode 100644 src/compiler/scala/tools/reflect/ReflectGlobal.scala create mode 100644 src/compiler/scala/tools/reflect/ReflectMain.scala create mode 100644 src/compiler/scala/tools/reflect/ReflectSetup.scala (limited to 'src') diff --git a/src/compiler/scala/tools/nsc/ReflectGlobal.scala b/src/compiler/scala/tools/nsc/ReflectGlobal.scala deleted file mode 100644 index 4f4db83339..0000000000 --- a/src/compiler/scala/tools/nsc/ReflectGlobal.scala +++ /dev/null @@ -1,37 +0,0 @@ -package scala.tools.nsc - -import reporters.Reporter - -/** A version of Global that uses reflection to get class - * infos, instead of reading class or source files. - */ -class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader) - extends Global(currentSettings, reporter) with scala.tools.nsc.ReflectSetup with scala.reflect.runtime.SymbolTable { - - override def transformedType(sym: Symbol) = - erasure.transformInfo(sym, - uncurry.transformInfo(sym, - refChecks.transformInfo(sym, sym.info))) - - override def isCompilerUniverse = true - - // Typically `runtimeMirror` creates a new mirror for every new classloader - // and shares symbols between the created mirrors. - // - // However we can't do that for the compiler. - // The problem is that symbol sharing violates owner chain assumptions that the compiler has. - // - // For example, we can easily end up with a situation when: - // - // Predef defined in package scala loaded by the classloader that has scala-library.jar - // - // cannot be accessed in: - // - // package scala for the rootMirror of ReflectGlobal that might correspond to a different classloader - // - // This happens because, despite the fact that `Predef` is shared between multiple `scala` packages (i.e. multiple scopes) - // (each mirror has its own set package symbols, because of the peculiarities of symbol loading in scala), - // that `Predef` symbol only has a single owner, and this messes up visibility, which is calculated based on owners, not scopes. - override def runtimeMirror(cl: ClassLoader): Mirror = rootMirror -} - diff --git a/src/compiler/scala/tools/nsc/ReflectMain.scala b/src/compiler/scala/tools/nsc/ReflectMain.scala deleted file mode 100644 index 161391fc2c..0000000000 --- a/src/compiler/scala/tools/nsc/ReflectMain.scala +++ /dev/null @@ -1,15 +0,0 @@ -package scala.tools.nsc - -import tools.util.PathResolver -import util.ClassPath.DefaultJavaContext -import util.ScalaClassLoader - -object ReflectMain extends Driver { - - private def classloaderFromSettings(settings: Settings) = { - val classpath = new PathResolver(settings).result - ScalaClassLoader.fromURLs(classpath.asURLs, getClass.getClassLoader) - } - - override def newCompiler(): Global = new ReflectGlobal(settings, reporter, classloaderFromSettings(settings)) -} \ No newline at end of file diff --git a/src/compiler/scala/tools/nsc/ReflectSetup.scala b/src/compiler/scala/tools/nsc/ReflectSetup.scala deleted file mode 100644 index 26c720a10f..0000000000 --- a/src/compiler/scala/tools/nsc/ReflectSetup.scala +++ /dev/null @@ -1,7 +0,0 @@ -package scala.tools.nsc - -/** A helper trait to initialize things that need to be set before JavaMirrors and other - * reflect specific traits are initialized */ -private[nsc] trait ReflectSetup { this: Global => - phase = new Run().typerPhase -} \ No newline at end of file diff --git a/src/compiler/scala/tools/reflect/ReflectGlobal.scala b/src/compiler/scala/tools/reflect/ReflectGlobal.scala new file mode 100644 index 0000000000..f8ded56ec6 --- /dev/null +++ b/src/compiler/scala/tools/reflect/ReflectGlobal.scala @@ -0,0 +1,40 @@ +package scala.tools +package reflect + +import scala.tools.nsc.Global +import scala.tools.nsc.reporters.Reporter +import scala.tools.nsc.Settings + +/** A version of Global that uses reflection to get class + * infos, instead of reading class or source files. + */ +class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader) + extends Global(currentSettings, reporter) with scala.tools.reflect.ReflectSetup with scala.reflect.runtime.SymbolTable { + + override def transformedType(sym: Symbol) = + erasure.transformInfo(sym, + uncurry.transformInfo(sym, + refChecks.transformInfo(sym, sym.info))) + + override def isCompilerUniverse = true + + // Typically `runtimeMirror` creates a new mirror for every new classloader + // and shares symbols between the created mirrors. + // + // However we can't do that for the compiler. + // The problem is that symbol sharing violates owner chain assumptions that the compiler has. + // + // For example, we can easily end up with a situation when: + // + // Predef defined in package scala loaded by the classloader that has scala-library.jar + // + // cannot be accessed in: + // + // package scala for the rootMirror of ReflectGlobal that might correspond to a different classloader + // + // This happens because, despite the fact that `Predef` is shared between multiple `scala` packages (i.e. multiple scopes) + // (each mirror has its own set package symbols, because of the peculiarities of symbol loading in scala), + // that `Predef` symbol only has a single owner, and this messes up visibility, which is calculated based on owners, not scopes. + override def runtimeMirror(cl: ClassLoader): Mirror = rootMirror +} + diff --git a/src/compiler/scala/tools/reflect/ReflectMain.scala b/src/compiler/scala/tools/reflect/ReflectMain.scala new file mode 100644 index 0000000000..116ae24cdd --- /dev/null +++ b/src/compiler/scala/tools/reflect/ReflectMain.scala @@ -0,0 +1,19 @@ +package scala.tools +package reflect + +import scala.tools.nsc.Driver +import scala.tools.nsc.Global +import scala.tools.nsc.Settings +import scala.tools.nsc.util.ClassPath.DefaultJavaContext +import scala.tools.nsc.util.ScalaClassLoader +import scala.tools.util.PathResolver + +object ReflectMain extends Driver { + + private def classloaderFromSettings(settings: Settings) = { + val classpath = new PathResolver(settings).result + ScalaClassLoader.fromURLs(classpath.asURLs, getClass.getClassLoader) + } + + override def newCompiler(): Global = new ReflectGlobal(settings, reporter, classloaderFromSettings(settings)) +} \ No newline at end of file diff --git a/src/compiler/scala/tools/reflect/ReflectSetup.scala b/src/compiler/scala/tools/reflect/ReflectSetup.scala new file mode 100644 index 0000000000..f18c114d62 --- /dev/null +++ b/src/compiler/scala/tools/reflect/ReflectSetup.scala @@ -0,0 +1,10 @@ +package scala.tools +package reflect + +import scala.tools.nsc.Global + +/** A helper trait to initialize things that need to be set before JavaMirrors and other + * reflect specific traits are initialized */ +private[reflect] trait ReflectSetup { this: Global => + phase = new Run().typerPhase +} \ No newline at end of file diff --git a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala index 278f4e3ff7..b4178102b9 100644 --- a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala +++ b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala @@ -2,7 +2,6 @@ package scala.tools package reflect import scala.tools.nsc.reporters._ -import scala.tools.nsc.ReflectGlobal import scala.tools.nsc.CompilerCommand import scala.tools.nsc.Global import scala.tools.nsc.typechecker.Modes diff --git a/src/reflect/scala/reflect/runtime/SymbolTable.scala b/src/reflect/scala/reflect/runtime/SymbolTable.scala index c90665508b..5b9090dae5 100644 --- a/src/reflect/scala/reflect/runtime/SymbolTable.scala +++ b/src/reflect/scala/reflect/runtime/SymbolTable.scala @@ -4,7 +4,7 @@ package runtime /** * This symbol table trait fills in the definitions so that class information is obtained by refection. * It can be used either from a reflexive universe (class scala.reflect.runtime.JavaUniverse), or else from - * a runtime compiler that uses reflection to get a class information (class scala.tools.nsc.ReflectGlobal) + * a runtime compiler that uses reflection to get a class information (class scala.tools.reflect.ReflectGlobal) */ trait SymbolTable extends internal.SymbolTable with JavaMirrors with SymbolLoaders with SynchronizedOps { -- cgit v1.2.3