Skip to content

Instantly share code, notes, and snippets.

@dlwh
Created August 31, 2008 22:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dlwh/8227 to your computer and use it in GitHub Desktop.
Save dlwh/8227 to your computer and use it in GitHub Desktop.
<plugin>
<name>seroverride</name>
<classname>smr.plugin.SerOverride</classname>
</plugin>
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