diff options
author | Den Shabalin <den.shabalin@gmail.com> | 2013-09-05 13:40:38 +0200 |
---|---|---|
committer | Den Shabalin <den.shabalin@gmail.com> | 2013-09-05 20:42:10 +0200 |
commit | cd07f9f9656ea1bdc6c27ef2be9192d52cd987a5 (patch) | |
tree | b01e7dabd00347b71a6ce7766747ba62cef0344b /src/reflect | |
parent | 4ad10642e9dacfb50c6c0ac0faaf7e5839bdffb5 (diff) | |
download | scala-cd07f9f9656ea1bdc6c27ef2be9192d52cd987a5.tar.gz scala-cd07f9f9656ea1bdc6c27ef2be9192d52cd987a5.tar.bz2 scala-cd07f9f9656ea1bdc6c27ef2be9192d52cd987a5.zip |
better support for ValDefs, VarDefs and DefDefs
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/api/BuildUtils.scala | 16 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/BuildUtils.scala | 29 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/StdNames.scala | 3 |
3 files changed, 48 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/api/BuildUtils.scala b/src/reflect/scala/reflect/api/BuildUtils.scala index b80159d051..ee6515b547 100644 --- a/src/reflect/scala/reflect/api/BuildUtils.scala +++ b/src/reflect/scala/reflect/api/BuildUtils.scala @@ -175,5 +175,21 @@ private[reflect] trait BuildUtils { self: Universe => def unapply(tree: Tree): Option[(List[ValDef], Tree)] } + + val SyntacticDefDef: SyntacticDefDefExtractor + + trait SyntacticDefDefExtractor { + def apply(mods: Modifiers, name: TermName, tparams: List[Tree], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef + + def unapply(tree: Tree): Option[(Modifiers, TermName, List[Tree], List[List[ValDef]], Tree, Tree)] + } + + val SyntacticValDef: SyntacticValDefExtractor + val SyntacticVarDef: SyntacticValDefExtractor + + trait SyntacticValDefExtractor { + def apply(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree): ValDef + def unapply(tree: Tree): Option[(Modifiers, TermName, Tree, Tree)] + } } } diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala index 0cbad0d641..7091b0e875 100644 --- a/src/reflect/scala/reflect/internal/BuildUtils.scala +++ b/src/reflect/scala/reflect/internal/BuildUtils.scala @@ -358,6 +358,35 @@ trait BuildUtils { self: SymbolTable => None } } + + object SyntacticDefDef extends SyntacticDefDefExtractor { + def apply(mods: Modifiers, name: TermName, tparams: List[Tree], vparamss: List[List[ValDef]], tpt: Tree, rhs: Tree): DefDef = + DefDef(mods, name, mkTparams(tparams), mkVparamss(vparamss), tpt, rhs) + + def unapply(tree: Tree): Option[(Modifiers, TermName, List[Tree], List[List[ValDef]], Tree, Tree)] = tree match { + case DefDef(mods, name, tparams, vparamss, tpt, rhs) => Some((mods, name, tparams, vparamss, tpt, rhs)) + case _ => None + } + } + + trait SyntacticValDefBase extends SyntacticValDefExtractor { + val isMutable: Boolean + + def apply(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree) = { + val mods1 = if (isMutable) mods | MUTABLE else mods + ValDef(mods1, name, tpt, rhs) + } + + def unapply(tree: Tree): Option[(Modifiers, TermName, Tree, Tree)] = tree match { + case ValDef(mods, name, tpt, rhs) if mods.hasFlag(MUTABLE) == isMutable => + Some((mods, name, tpt, rhs)) + case _ => + None + } + } + + object SyntacticValDef extends SyntacticValDefBase { val isMutable = false } + object SyntacticVarDef extends SyntacticValDefBase { val isMutable = true } } val build: BuildApi = new BuildImpl diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala index e52f3140c3..17a084f461 100644 --- a/src/reflect/scala/reflect/internal/StdNames.scala +++ b/src/reflect/scala/reflect/internal/StdNames.scala @@ -592,6 +592,7 @@ trait StdNames { val SyntacticApplied: NameType = "SyntacticApplied" val SyntacticBlock: NameType = "SyntacticBlock" val SyntacticClassDef: NameType = "SyntacticClassDef" + val SyntacticDefDef: NameType = "SyntacticDefDef" val SyntacticFunction: NameType = "SyntacticFunction" val SyntacticFunctionType: NameType= "SyntacticFunctionType" val SyntacticModuleDef: NameType = "SyntacticModuleDef" @@ -600,6 +601,8 @@ trait StdNames { val SyntacticTuple: NameType = "SyntacticTuple" val SyntacticTupleType: NameType = "SyntacticTupleType" val SyntacticTypeApplied: NameType = "SyntacticTypeApplied" + val SyntacticValDef: NameType = "SyntacticValDef" + val SyntacticVarDef: NameType = "SyntacticVarDef" val This: NameType = "This" val ThisType: NameType = "ThisType" val True : NameType = "True" |