diff options
author | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2013-07-27 01:38:45 -0700 |
---|---|---|
committer | Grzegorz Kossakowski <grzegorz.kossakowski@gmail.com> | 2013-07-27 14:09:40 -0700 |
commit | afbee09c8e0e7b1a4da1f8517c723dad9f1adb6f (patch) | |
tree | 9e0eba8ce1bff0af357aa4f84b3a905e00325bd9 /src/scaladoc | |
parent | 5eb4cdf1a7a466276a979d2952dbc30d416f423d (diff) | |
download | scala-afbee09c8e0e7b1a4da1f8517c723dad9f1adb6f.tar.gz scala-afbee09c8e0e7b1a4da1f8517c723dad9f1adb6f.tar.bz2 scala-afbee09c8e0e7b1a4da1f8517c723dad9f1adb6f.zip |
Refactor the cake so SymbolTable does not depend on Global
This is rather large commit so I'll first explain the motivation
behind it and then go through all changes in detail explaining
the choices I made.
The motivation behind this refactoring was to make SymbolTable
unit testable. I wanted a lightweight way of initializing
SymbolTable and then writing unit tests for subtyping algorithm,
various functionality related to Symbols, etc.
All of that should be possible by precisely controlling what we
test, e.g., create types and symbols by hand and not have them
defined in source code as we normally do in partest (functional)
tests.
The other motivation was to reduce and clarify dependencies we
have in the compiler. Explicit dependencies lead to cleaner
design. Also, explicit and reduces dependencies help incremental
compilation which is a big problem for us in compiler's code
base at the moment.
One of the challenges I faced during that refactoring was
cyclic dependency between Platform and SymbolLoaders.
Platform depended on `SymbolLoaders.SymbolLoader` because it
would define a root loader. SymbolLoaders depended on Platform
for numerous reasons like deferring decision how to load a given
symbol based on some Platform-specific hooks.
I decided to break that cycle by removing methods related to
symbol loading from Platform interface. One could argue, that
better fix would be to make SymbolLoaders to not depend on Platform
(backend) concept but that would be much bigger refactoring. Also,
we have a new concept for dealing with symbol loading: Mirrors.
For those reasons both `newClassLoader` and `rootLoader`
were dropped from Platform interface.
Note that JavaPlatform still depends on Global so it can
access phases defined in Global to implement `platformPhases`
method.
Both GenICode and BCodeBodyBuilder have some Platform specific
logic that requires casting because pattern matcher doesn't narrow
types to give them a proper refinement. Check the changes for details.
Some logging utilities has been moved from Global to SymbolTable
because they are accessed by SymbolTable. Since Global inherits from
SymbolTable this should be a source compatible change.
The SymbolLoaders has dependency on `compileLate` method defined in Global.
The purpose behind `compileLate` is not clear to me but the dependency looks
a little bit dubious. At least we made that dependency explicit.
ScaladocGlobal and Global defined in interactive has been adapted in a way
that makes them compile both with quick.comp and 2.11.0-M4 so my refactorings
are not blocking the modularization effort.
Diffstat (limited to 'src/scaladoc')
-rw-r--r-- | src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala index 91d5fef4cf..94d3809fc3 100644 --- a/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala +++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala @@ -23,9 +23,14 @@ trait ScaladocGlobalTrait extends Global { val runsAfter = List[String]() val runsRightAfter = None } - override lazy val loaders = new SymbolLoaders { - val global: outer.type = outer + override lazy val loaders = new { + val symbolTable: outer.type = outer + val platform: outer.platform.type = outer.platform + // `global` val is needed so we conform to loaders type in Global in Scala 2.11.0-M4 + // TODO: remove once 2.11.0-M5 is used to build Scaladoc + val global: outer.type = outer + } with SymbolLoaders { // SI-5593 Scaladoc's current strategy is to visit all packages in search of user code that can be documented // therefore, it will rummage through the classpath triggering errors whenever it encounters package objects // that are not in their correct place (see bug for details) @@ -33,7 +38,12 @@ trait ScaladocGlobalTrait extends Global { log(s"Suppressing error involving $root: $ex") } - def lookupMemberAtTyperPhaseIfPossible(sym: Symbol, name: Name): Symbol = { + // TODO: Add `override` modifier once Scala 2.11.0-M5 is used to build Scaladoc + protected /*override*/ def compileLate(srcfile: io.AbstractFile): Unit = + currentRun.compileLate(srcfile) + + // TODO: Add `override` modifier once Scala 2.11.0-M5 is used to build Scaladoc + protected def /*override*/ lookupMemberAtTyperPhaseIfPossible(sym: Symbol, name: Name): Symbol = { def lookup = sym.info.member(name) // if loading during initialization of `definitions` typerPhase is not yet set. // in that case we simply load the member at the current phase |