diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-12-09 09:45:31 +0100 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-12-30 19:07:05 +0300 |
commit | 87913661e199e3894190b7b8aa0900d7237feec0 (patch) | |
tree | db22c710438c8f2cf35886b8014456a911a25855 /test/files/run/macroPlugins-namerHooks.scala | |
parent | 4d92aec651def608628a2275e1b6bf2d1fcbabe7 (diff) | |
download | scala-87913661e199e3894190b7b8aa0900d7237feec0.tar.gz scala-87913661e199e3894190b7b8aa0900d7237feec0.tar.bz2 scala-87913661e199e3894190b7b8aa0900d7237feec0.zip |
hooks for naming and synthesis in Namers.scala and Typers.scala
Interestingly enough, despite of the implementation surface being
quite noticeable, it is enough to hijack just `enterSym` and typechecking
of stats for packages, templates and blocks in order to enable macro annotations.
That and `ensureCompanionObject`, which I couldn't abstract away so far.
An architectural note: given that a hooked method is called `X`,
there are two implementations of this method. `pluginsX` is defined in
AnalyzerPlugins.scala and lets macro plugins customize `X`.
`standardX` is defined next to `X` and provides a default implementation.
Finally `X` is changed to trivially forward to `pluginsX`.
Existing and future callers of `X` now can be completely oblivious of the
introduced hooks, because calls to `X` will continue working and will be
correctly hooked. This makes the infrastructure more robust.
The only downside is that in case when a macro plugin wants to call
into the default implementation, it needs to call `standardX`, because
`X` will lead to a stack overflow. However, in my opinion this not a big
problem, because such failures are load and clear + for every `pluginsX`
we actually provide documentation that says what is its standard impl is.
Diffstat (limited to 'test/files/run/macroPlugins-namerHooks.scala')
-rw-r--r-- | test/files/run/macroPlugins-namerHooks.scala | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/test/files/run/macroPlugins-namerHooks.scala b/test/files/run/macroPlugins-namerHooks.scala index b0f29cbbed..a71d685f7f 100644 --- a/test/files/run/macroPlugins-namerHooks.scala +++ b/test/files/run/macroPlugins-namerHooks.scala @@ -18,12 +18,12 @@ object Test extends DirectTest { object macroPlugin extends MacroPlugin { override def pluginsEnterSym(namer: Namer, tree: Tree): Boolean = { output += s"enterSym(${tree.toString.replace('\n', ' ')})" - namer.enterSym(tree) + namer.standardEnterSym(tree) true } override def pluginsEnsureCompanionObject(namer: Namer, cdef: ClassDef, creator: ClassDef => Tree = companionModuleDef(_)): Option[Symbol] = { output += s"ensureCompanionObject(${cdef.toString.replace('\n', ' ')}, ...)" - Some(namer.ensureCompanionObject(cdef, creator)) + Some(namer.standardEnsureCompanionObject(cdef, creator)) } override def pluginsEnterStats(typer: Typer, stats: List[Tree]): List[Tree] = { stats.foreach(stat => output += s"enterStat(${stat.toString.replace('\n', ' ')})") |