summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2011-11-28 18:08:40 +0000
committerMartin Odersky <odersky@gmail.com>2011-11-28 18:08:40 +0000
commit3c24983f427e408760cb6e3d18291a4e951a8e12 (patch)
tree76479b0254c4c9931da0c23858f271bca50de353 /src
parent88ab6441739811243f15d668c8c23a2b6481b7eb (diff)
downloadscala-3c24983f427e408760cb6e3d18291a4e951a8e12.tar.gz
scala-3c24983f427e408760cb6e3d18291a4e951a8e12.tar.bz2
scala-3c24983f427e408760cb6e3d18291a4e951a8e12.zip
Small change to get rid of naming awkwardness f...
Small change to get rid of naming awkwardness for macros. Class based macros now have a parameter section (_this: Tree), module based macrod have an empty pararameter section () instead. So we can let them have the same name, because overloading resolution will distinguish them anyway. Review by burmako.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Macros.scala21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
index d0640e76af..99ba0e0971 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
@@ -7,40 +7,41 @@ trait Macros { self: Analyzer =>
import global._
import definitions._
- def macroMethName(sym: Symbol) =
- newTermName((if (sym.name.isTypeName) "type" else "def") + "macro$" +
- (if (sym.owner.isModuleClass) "obj$" else "cls$") + sym.name)
+ def macroMethName(name: Name) =
+ newTermName((if (name.isTypeName) "type" else "def") + "macro$" + name)
def macroMeth(mac: Symbol): Symbol = {
var owner = mac.owner
if (!owner.isModuleClass) owner = owner.companionModule.moduleClass
- owner.info.decl(macroMethName(mac))
+ owner.info.decl(macroMethName(mac.name))
}
/**
* The definition of the method implementing a macro. Example:
- * Say we have
+ * Say we have in a class C
*
* def macro foo[T](xs: List[T]): T = expr
*
* Then the following macro method is generated for `foo`:
*
- * def foo(glob: scala.reflect.api.Universe)
+ * def defmacro$foo(glob: scala.reflect.api.Universe)
* (_this: glob.Tree)
* (T: glob.Type)
* (xs: glob.Tree): glob.Tree = {
* implicit val $glob = glob
* expr
* }
+ *
+ * If `foo` is declared in an object, the second parameter list is () instead of (_this: glob.Tree).
*/
def macroMethDef(mdef: DefDef): Tree = {
def paramDef(name: Name, tpt: Tree) = ValDef(Modifiers(PARAM), name, tpt, EmptyTree)
val universeType = TypeTree(ReflectApiUniverse.tpe)
- val globParam = paramDef("glob", universeType)
+ val globParamSec = List(paramDef("glob", universeType))
def globSelect(name: Name) = Select(Ident("glob"), name)
def globTree = globSelect(newTypeName("Tree"))
def globType = globSelect(newTypeName("Type"))
- val thisParam = paramDef("_this", globTree)
+ val thisParamSec = if (mdef.symbol.owner.isModuleClass) List() else List(paramDef("_this", globTree))
def tparamInMacro(tdef: TypeDef) = paramDef(tdef.name.toTermName, globType)
def vparamInMacro(vdef: ValDef): ValDef = paramDef(vdef.name, globTree)
def wrapImplicit(tree: Tree) = atPos(tree.pos) {
@@ -50,9 +51,9 @@ trait Macros { self: Analyzer =>
atPos(mdef.pos) {
new DefDef( // can't call DefDef here; need to find out why
mods = mdef.mods &~ MACRO,
- name = macroMethName(mdef.symbol),
+ name = macroMethName(mdef.name),
tparams = List(),
- vparamss = List(globParam) :: List(thisParam) :: (mdef.tparams map tparamInMacro) ::
+ vparamss = globParamSec :: thisParamSec :: (mdef.tparams map tparamInMacro) ::
(mdef.vparamss map (_ map vparamInMacro)),
tpt = globTree,
wrapImplicit(mdef.rhs))