summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDen Shabalin <den.shabalin@gmail.com>2013-10-31 11:34:21 +0100
committerDen Shabalin <den.shabalin@gmail.com>2013-11-12 14:04:41 +0100
commit9b95ab5a10398c453b7dca2ccfc10c2a9705adbe (patch)
treef956b269391efe10227d558f24480b98174c6ab9
parent80ddc958a2f7487b03d5334ac7bacf209fe98dd5 (diff)
downloadscala-9b95ab5a10398c453b7dca2ccfc10c2a9705adbe.tar.gz
scala-9b95ab5a10398c453b7dca2ccfc10c2a9705adbe.tar.bz2
scala-9b95ab5a10398c453b7dca2ccfc10c2a9705adbe.zip
make internal implementation of universe.build less restrictive
1. Use protected instead of private to avoid needless lock-in 2. Use BuildImpl field type to expose non-protected members to the compiler (user-facing side in the reflection api stays the same)
-rw-r--r--src/reflect/scala/reflect/internal/BuildUtils.scala42
1 files changed, 16 insertions, 26 deletions
diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala
index 9d111e8852..004c4aa40b 100644
--- a/src/reflect/scala/reflect/internal/BuildUtils.scala
+++ b/src/reflect/scala/reflect/internal/BuildUtils.scala
@@ -9,7 +9,6 @@ trait BuildUtils { self: SymbolTable =>
import definitions.{TupleClass, FunctionClass, ScalaPackage, UnitClass}
class BuildImpl extends BuildApi {
-
def selectType(owner: Symbol, name: String): TypeSymbol =
select(owner, newTypeName(name)).asType
@@ -19,7 +18,7 @@ trait BuildUtils { self: SymbolTable =>
else result
}
- private def select(owner: Symbol, name: Name): Symbol = {
+ protected def select(owner: Symbol, name: Name): Symbol = {
val result = owner.info decl name
if (result ne NoSymbol) result
else
@@ -135,7 +134,7 @@ trait BuildUtils { self: SymbolTable =>
def withFreshTypeName[T](prefix: String)(f: TypeName => T): T = f(freshTypeName(prefix))
- private implicit def fresh: FreshNameCreator = self.currentFreshNameCreator
+ protected implicit def fresh: FreshNameCreator = self.currentFreshNameCreator
object FlagsRepr extends FlagsReprExtractor {
def apply(bits: Long): FlagSet = bits
@@ -175,7 +174,8 @@ trait BuildUtils { self: SymbolTable =>
}
}
- private object UnCtor {
+ // recover constructor contents generated by gen.mkTemplate
+ protected object UnCtor {
def unapply(tree: Tree): Option[(Modifiers, List[List[ValDef]], List[Tree])] = tree match {
case DefDef(mods, nme.MIXIN_CONSTRUCTOR, _, _, _, Block(lvdefs, _)) =>
Some((mods | Flag.TRAIT, Nil, lvdefs))
@@ -185,7 +185,8 @@ trait BuildUtils { self: SymbolTable =>
}
}
- private object UnMkTemplate {
+ // undo gen.mkTemplate
+ protected object UnMkTemplate {
def unapply(templ: Template): Option[(List[Tree], ValDef, Modifiers, List[List[ValDef]], List[Tree], List[Tree])] = {
val Template(parents, selfType, tbody) = templ
def result(ctorMods: Modifiers, vparamss: List[List[ValDef]], edefs: List[Tree], body: List[Tree]) =
@@ -297,8 +298,8 @@ trait BuildUtils { self: SymbolTable =>
}
}
- private trait ScalaMemberRef {
- val symbols: Seq[Symbol]
+ // match references to `scala.$name`
+ protected class ScalaMemberRef(symbols: Seq[Symbol]) {
def result(name: Name): Option[Symbol] =
symbols.collect { case sym if sym.name == name => sym }.headOption
def unapply(tree: Tree): Option[Symbol] = tree match {
@@ -311,18 +312,10 @@ trait BuildUtils { self: SymbolTable =>
case _ => None
}
}
- private object TupleClassRef extends ScalaMemberRef {
- val symbols = TupleClass.seq
- }
- private object TupleCompanionRef extends ScalaMemberRef {
- val symbols = TupleClass.seq.map { _.companionModule }
- }
- private object UnitClassRef extends ScalaMemberRef {
- val symbols = Seq(UnitClass)
- }
- private object FunctionClassRef extends ScalaMemberRef {
- val symbols = FunctionClass.seq
- }
+ protected object TupleClassRef extends ScalaMemberRef(TupleClass.seq)
+ protected object TupleCompanionRef extends ScalaMemberRef(TupleClass.seq.map { _.companionModule })
+ protected object UnitClassRef extends ScalaMemberRef(Seq(UnitClass))
+ protected object FunctionClassRef extends ScalaMemberRef(FunctionClass.seq)
object SyntacticTuple extends SyntacticTupleExtractor {
def apply(args: List[Tree]): Tree = {
@@ -419,9 +412,7 @@ trait BuildUtils { self: SymbolTable =>
}
}
- trait SyntacticValDefBase extends SyntacticValDefExtractor {
- val isMutable: Boolean
-
+ protected class SyntacticValDefBase(isMutable: Boolean) extends SyntacticValDefExtractor {
def apply(mods: Modifiers, name: TermName, tpt: Tree, rhs: Tree) = {
val mods1 = if (isMutable) mods | MUTABLE else mods
ValDef(mods1, name, tpt, rhs)
@@ -434,9 +425,8 @@ trait BuildUtils { self: SymbolTable =>
None
}
}
-
- object SyntacticValDef extends SyntacticValDefBase { val isMutable = false }
- object SyntacticVarDef extends SyntacticValDefBase { val isMutable = true }
+ object SyntacticValDef extends SyntacticValDefBase(isMutable = false)
+ object SyntacticVarDef extends SyntacticValDefBase(isMutable = true)
object SyntacticAssign extends SyntacticAssignExtractor {
def apply(lhs: Tree, rhs: Tree): Tree = gen.mkAssign(lhs, rhs)
@@ -449,5 +439,5 @@ trait BuildUtils { self: SymbolTable =>
}
}
- val build: BuildApi = new BuildImpl
+ val build: BuildImpl = new BuildImpl
}