Created
August 31, 2008 22:30
-
-
Save dlwh/8227 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<plugin> | |
<name>seroverride</name> | |
<classname>smr.plugin.SerOverride</classname> | |
</plugin> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package smr.plugin; | |
import scala.tools.nsc | |
import nsc.Global | |
import nsc.Phase | |
import nsc.plugins.Plugin | |
import nsc.plugins.PluginComponent | |
import nsc.transform._ | |
import nsc.symtab.Flags._ | |
class SerOverride(val global: Global) extends Plugin { | |
import global._ | |
val name = "seroverride" | |
val description = "Makes all closures serializable" | |
val components = List[PluginComponent](Component) | |
private object Component extends PluginComponent { | |
val global = SerOverride.this.global | |
val runsAfter = "erasure" | |
val phaseName = SerOverride.this.name | |
def newPhase(prev: Phase) = new SerOverridePhase(prev) | |
} | |
private class SerTransformer extends Transformer { | |
override def transform(t : Tree):Tree = t match { | |
case cdef@ ClassDef(mods,name,tparams,impl) => | |
val sym = cdef.symbol | |
val serType = definitions.SerializableAttr.tpe | |
if( sym.hasFlag(SYNTHETIC) && sym.name.toString.contains("anonfun") && !sym.attributes.exists(serType==_.atp)) { | |
println(sym.name); | |
sym.attributes= AnnotationInfo(serType, List(), List()) :: sym.attributes | |
} | |
copy.ClassDef(t, mods, name, transformTypeDefs(tparams), transformTemplate(impl)) | |
case _ => super.transform(t); | |
} | |
} | |
private class SerOverridePhase(prev: Phase) extends Phase(prev) { | |
def name = SerOverride.this.name | |
def run { | |
val trans = new SerTransformer; | |
for(unit <- currentRun.units) { | |
//unit.body = trans.transform(unit.body) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment