Skip to content

Commit 7707a76

Browse files
committed
[nomerge] Restore findMacroClassloader into Analyzer for the 2.12.x series
1 parent 141a72f commit 7707a76

File tree

4 files changed

+59
-14
lines changed

4 files changed

+59
-14
lines changed

src/compiler/scala/tools/nsc/plugins/Plugins.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ trait Plugins { global: Global =>
175175
*
176176
* Mirrors with runtime definitions (e.g. Repl) need to adjust this method.
177177
*/
178-
protected[scala] def findMacroClassLoader(): ClassLoader = {
178+
protected def findMacroClassLoader(): ClassLoader = {
179179
val classpath: Seq[URL] = if (settings.YmacroClasspath.isSetByUser) {
180180
for {
181181
file <- scala.tools.nsc.util.ClassPath.expandPath(settings.YmacroClasspath.value, true)

src/compiler/scala/tools/nsc/typechecker/Macros.scala

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,43 @@ trait Macros extends MacroRuntimes with Traces with Helpers {
6464

6565
def globalSettings = global.settings
6666

67+
/** Obtains a `ClassLoader` instance used for macro expansion.
68+
*
69+
* By default a new `ScalaClassLoader` is created using the classpath
70+
* from global and the classloader of self as parent.
71+
*
72+
* Mirrors with runtime definitions (e.g. Repl) need to adjust this method.
73+
*/
74+
protected def findMacroClassLoader(): ClassLoader = {
75+
import java.net.URL
76+
import scala.tools.nsc.io.AbstractFile
77+
78+
val classpath: Seq[URL] = if (settings.YmacroClasspath.isSetByUser) {
79+
for {
80+
file <- scala.tools.nsc.util.ClassPath.expandPath(settings.YmacroClasspath.value, true)
81+
af <- Option(AbstractFile getDirectory file)
82+
} yield af.file.toURI.toURL
83+
} else global.classPath.asURLs
84+
def newLoader: () => ScalaClassLoader.URLClassLoader = () => {
85+
analyzer.macroLogVerbose("macro classloader: initializing from -cp: %s".format(classpath))
86+
ScalaClassLoader.fromURLs(classpath, getClass.getClassLoader)
87+
}
88+
89+
val policy = settings.YcacheMacroClassLoader.value
90+
val cache = Macros.macroClassLoadersCache
91+
val disableCache = policy == settings.CachePolicy.None.name
92+
val checkStamps = policy == settings.CachePolicy.LastModified.name
93+
cache.checkCacheability(classpath, checkStamps, disableCache) match {
94+
case Left(msg) =>
95+
analyzer.macroLogVerbose(s"macro classloader: $msg.")
96+
val loader = newLoader()
97+
closeableRegistry.registerClosable(loader)
98+
loader
99+
case Right(paths) =>
100+
cache.getOrCreate(paths, newLoader, closeableRegistry, checkStamps)
101+
}
102+
}
103+
67104
/** `MacroImplBinding` and its companion module are responsible for
68105
* serialization/deserialization of macro def -> impl bindings.
69106
*

src/compiler/scala/tools/reflect/ReflectGlobal.scala

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,18 @@ import scala.tools.nsc.typechecker.Analyzer
2525
class ReflectGlobal(currentSettings: Settings, reporter: Reporter, override val rootClassLoader: ClassLoader)
2626
extends Global(currentSettings, reporter) with scala.tools.reflect.ReflectSetup with scala.reflect.runtime.SymbolTable {
2727

28-
/** Obtains the classLoader used for runtime macro expansion.
29-
*
30-
* Macro expansion can use everything available in `global.classPath` or `rootClassLoader`.
31-
* The `rootClassLoader` is used to obtain runtime defined macros.
32-
*/
33-
override protected[scala] def findMacroClassLoader(): ClassLoader = {
34-
val classpath = classPath.asURLs
35-
perRunCaches.recordClassloader(ScalaClassLoader.fromURLs(classpath, rootClassLoader))
28+
override lazy val analyzer = new {
29+
val global: ReflectGlobal.this.type = ReflectGlobal.this
30+
} with Analyzer {
31+
/** Obtains the classLoader used for runtime macro expansion.
32+
*
33+
* Macro expansion can use everything available in [[global.classPath]] or [[rootClassLoader]].
34+
* The [[rootClassLoader]] is used to obtain runtime defined macros.
35+
*/
36+
override protected def findMacroClassLoader(): ClassLoader = {
37+
val classpath = global.classPath.asURLs
38+
ScalaClassLoader.fromURLs(classpath, rootClassLoader)
39+
}
3640
}
3741

3842
override def transformedType(sym: Symbol) =

src/repl/scala/tools/nsc/interpreter/ReplGlobal.scala

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,15 @@ trait ReplGlobal extends Global {
3030
super.abort(msg)
3131
}
3232

33-
override protected[scala] def findMacroClassLoader(): ClassLoader = {
34-
val loader = super.findMacroClassLoader
35-
analyzer.macroLogVerbose("macro classloader: initializing from a REPL classloader: %s".format(classPath.asURLs))
36-
val virtualDirectory = analyzer.globalSettings.outputDirs.getSingleOutput.get
37-
new util.AbstractFileClassLoader(virtualDirectory, loader) {}
33+
override lazy val analyzer = new {
34+
val global: ReplGlobal.this.type = ReplGlobal.this
35+
} with Analyzer {
36+
override protected def findMacroClassLoader(): ClassLoader = {
37+
val loader = super.findMacroClassLoader
38+
macroLogVerbose("macro classloader: initializing from a REPL classloader: %s".format(global.classPath.asURLs))
39+
val virtualDirectory = globalSettings.outputDirs.getSingleOutput.get
40+
new util.AbstractFileClassLoader(virtualDirectory, loader) {}
41+
}
3842
}
3943

4044
override def optimizerClassPath(base: ClassPath): ClassPath = {

0 commit comments

Comments
 (0)