2011-04-12 23 views
6

scalac eklentisini birden çok dosyaya bölmek istiyorum. Bu kolay geliyor ama import global._ satırından kaynaklanan patika bağımlı tip sorunları nedeniyle onu çıkarmayı başaramadım. İşte Birden çok dosyaya bölme scalac eklentisi

Lex Kaşık en örnek eklenti bulunmaktadır: Ben kapsamında import global._ kalmadan kendi dosyalarında Component ve DivByZeroPhase koyabilirsiniz nasıl

package localhost 

import scala.tools.nsc 
import nsc.Global 
import nsc.Phase 
import nsc.plugins.Plugin 
import nsc.plugins.PluginComponent 

class DivByZero(val global: Global) extends Plugin { 
    import global._ 

    val name = "divbyzero" 
    val description = "checks for division by zero" 
    val components = List[PluginComponent](Component) 

    private object Component extends PluginComponent { 
    val global: DivByZero.this.global.type = DivByZero.this.global 
    val runsAfter = "refchecks" 
    // Using the Scala Compiler 2.8.x the runsAfter should be written as below 
    // val runsAfter = List[String]("refchecks"); 
    val phaseName = DivByZero.this.name 
    def newPhase(_prev: Phase) = new DivByZeroPhase(_prev)  

    class DivByZeroPhase(prev: Phase) extends StdPhase(prev) { 
     override def name = DivByZero.this.name 
     def apply(unit: CompilationUnit) { 
     for (tree @ Apply(Select(rcvr, nme.DIV), List(Literal(Constant(0)))) <- unit.body; 
      if rcvr.tpe <:< definitions.IntClass.tpe) 
      { 
      unit.error(tree.pos, "definitely division by zero") 
      } 
     } 
    } 
    } 
} 

? Eğer küresel uzanan yol bağımlı tip geçmesi gerekiyor yoksa

https://github.com/jsuereth/osgi-scalac-plugin/blob/master/src/main/scala/scala/osgi/compiler/OsgiPlugin.scala

, çalışırken dert etmeyin:

cevap

4

İşte ben de aynı şeyi yaptık gerçekten eski bir proje ilgili "bu.global" bölümlerini tutmak.

2

Sen bileşen için ayrı bir sınıf oluşturmak ve küresel geçirebilirsiniz: Artık tüm

trait CompilerAccess { 
    val global: tools.nsc.Global 
} 

: Scala Refactoring kütüphanesinde

class TemplateComponent(val global: Global) extends PluginComponent { 

    import global._ 

    val runsAfter = List[String]("refchecks") 

    val phaseName = "plugintemplate" 

    def newPhase(prev: Phase) = new StdPhase(prev) { 

    override def name = phaseName 

    def apply(unit:CompilationUnit) = { 
    }  
    } 
} 
3

, ben bir özellik CompilerAccess alarak bunu çözmüş

trait TreeTraverser { 
    this: CompilerAccess => 
    import global._ 

    ... 
} 
: global erişmesi gereken diğer özellikler sadece bir bağımlılık olarak CompilerAccess beyan

trait SomeRefactoring extends TreeTraverser with OtherTrait with MoreTraits { 
    val global = //wherever you get your global from 
} 

Bu şema benim için oldukça iyi çalıştı:

ve sonra tüm bu özelliklerin içinde karıştırır ve küresel bir örneğini sağlayan bir sınıf var.

İlgili konular