В библиотеке Scala Refactoring я решил эту проблему с помощью свойства CompilerAccess:
trait CompilerAccess {
val global: tools.nsc.Global
}
Теперь все остальные черты, к которым требуется доступ global
, просто объявляют CompilerAccess
как зависимость:
trait TreeTraverser {
this: CompilerAccess =>
import global._
...
}
и затем есть класс, который смешивает во всех этих чертах и обеспечивает экземпляр global:
trait SomeRefactoring extends TreeTraverser with OtherTrait with MoreTraits {
val global = //wherever you get your global from
}
Эта схема работала довольно хорошо для меня.