diff options
author | Paul Phillips <paulp@improving.org> | 2012-01-03 14:16:24 -0800 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-01-05 14:06:11 -0800 |
commit | c40be502a2ed4ef34eff726836b76ed13b03da78 (patch) | |
tree | 7fa10b0706f051da319ae1db7c8a61afcfedb41c | |
parent | 64107de6cba37f796bd7c6b86509cefba312f91d (diff) | |
download | scala-c40be502a2ed4ef34eff726836b76ed13b03da78.tar.gz scala-c40be502a2ed4ef34eff726836b76ed13b03da78.tar.bz2 scala-c40be502a2ed4ef34eff726836b76ed13b03da78.zip |
Consolidated misc collections helper methods.
Streamlining some of our more common operations.
10 files changed, 51 insertions, 47 deletions
diff --git a/src/compiler/scala/reflect/internal/Symbols.scala b/src/compiler/scala/reflect/internal/Symbols.scala index e629b0ed43..a40f515352 100644 --- a/src/compiler/scala/reflect/internal/Symbols.scala +++ b/src/compiler/scala/reflect/internal/Symbols.scala @@ -2523,6 +2523,10 @@ trait Symbols extends api.Symbols { self: SymbolTable => val syms1 = cloneSymbolsAtOwner(syms, owner) creator(syms1, tpe.substSym(syms, syms1)) } + + /** A deep map on a symbol's paramss. + */ + def mapParamss[T](sym: Symbol)(f: Symbol => T): List[List[T]] = mmap(sym.info.paramss)(f) /** Create a new existential type skolem with the given owner and origin. */ diff --git a/src/compiler/scala/reflect/internal/Trees.scala b/src/compiler/scala/reflect/internal/Trees.scala index 566ee0e9cf..c6b5297fe4 100644 --- a/src/compiler/scala/reflect/internal/Trees.scala +++ b/src/compiler/scala/reflect/internal/Trees.scala @@ -193,7 +193,7 @@ trait Trees extends api.Trees { self: SymbolTable => DefDef(sym, Modifiers(sym.flags), vparamss, rhs) def DefDef(sym: Symbol, mods: Modifiers, rhs: Tree): DefDef = - DefDef(sym, mods, sym.paramss map (_.map(ValDef)), rhs) + DefDef(sym, mods, mapParamss(sym)(ValDef), rhs) def DefDef(sym: Symbol, rhs: Tree): DefDef = DefDef(sym, Modifiers(sym.flags), rhs) diff --git a/src/compiler/scala/reflect/internal/util/Collections.scala b/src/compiler/scala/reflect/internal/util/Collections.scala index 28a17c7821..94672097c4 100644 --- a/src/compiler/scala/reflect/internal/util/Collections.scala +++ b/src/compiler/scala/reflect/internal/util/Collections.scala @@ -21,6 +21,23 @@ trait Collections { else !xs2.isEmpty && !xs3.isEmpty && f(xs1.head, xs2.head, xs3.head) && corresponds3(xs1.tail, xs2.tail, xs3.tail)(f) ) + /** All these mm methods are "deep map" style methods for + * mapping etc. on a list of lists. + */ + final def mexists[A](xss: List[List[A]])(p: A => Boolean) = + xss exists (_ exists p) + final def mmap[A, B](xss: List[List[A]])(f: A => B) = + xss map (_ map f) + final def mforeach[A](xss: List[List[A]])(f: A => Unit) = + xss foreach (_ foreach f) + final def mfind[A](xss: List[List[A]])(p: A => Boolean): Option[A] = { + for (xs <- xss; x <- xs) + if (p(x)) return Some(x) + None + } + final def mfilter[A](xss: List[List[A]])(p: A => Boolean) = + for (xs <- xss; x <- xs; if p(x)) yield x + final def map2[A, B, C](xs1: List[A], xs2: List[B])(f: (A, B) => C): List[C] = { val lb = new ListBuffer[C] var ys1 = xs1 @@ -136,3 +153,6 @@ trait Collections { true } } + +object Collections extends Collections { } + diff --git a/src/compiler/scala/tools/nsc/ast/TreeDSL.scala b/src/compiler/scala/tools/nsc/ast/TreeDSL.scala index efc64dbbc5..2cfd21ecc8 100644 --- a/src/compiler/scala/tools/nsc/ast/TreeDSL.scala +++ b/src/compiler/scala/tools/nsc/ast/TreeDSL.scala @@ -202,7 +202,7 @@ trait TreeDSL { class DefSymStart(val sym: Symbol) extends SymVODDStart with DefCreator { def symType = sym.tpe.finalResultType def tparams = sym.typeParams map TypeDef - def vparamss = sym.paramss map (xs => xs map ValDef) + def vparamss = mapParamss(sym)(ValDef) } class ValSymStart(val sym: Symbol) extends SymVODDStart with ValCreator { def symType = sym.tpe diff --git a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala index bbe803a3fb..99b0a82690 100644 --- a/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala +++ b/src/compiler/scala/tools/nsc/transform/SpecializeTypes.scala @@ -572,8 +572,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { // resolved by the type checker. Later on, erasure re-typechecks everything and // chokes if it finds default parameters for specialized members, even though // they are never needed. - sym.info.paramss.flatten foreach (_.resetFlag(DEFAULTPARAM)) - + mapParamss(sym)(_ resetFlag DEFAULTPARAM) decls1.enter(subst(fullEnv)(sym)) } @@ -1235,7 +1234,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { debuglog("!!! adding body of a defdef %s, symbol %s: %s".format(tree, tree.symbol, rhs)) body(tree.symbol) = rhs // body(tree.symbol) = tree // whole method - parameters(tree.symbol) = vparamss map (_ map (_.symbol)) + parameters(tree.symbol) = mmap(vparamss)(_.symbol) concreteSpecMethods -= tree.symbol } // no need to descend further down inside method bodies @@ -1609,7 +1608,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { if (m.isClassConstructor) { val origParamss = parameters(info(m).target) val vparams = ( - for ((tp, sym) <- m.info.paramTypes zip origParamss(0)) yield ( + map2(m.info.paramTypes, origParamss(0))((tp, sym) => m.newValue(sym.pos, specializedName(sym, typeEnv(cls))) .setInfo(tp) .setFlag(sym.flags) @@ -1625,7 +1624,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { } // ctor - mbrs += atPos(m.pos)(DefDef(m, Modifiers(m.flags), List(vparams) map (_ map ValDef), EmptyTree)) + mbrs += atPos(m.pos)(DefDef(m, Modifiers(m.flags), mmap(List(vparams))(ValDef), EmptyTree)) } else { mbrs += atPos(m.pos)(DefDef(m, { paramss => EmptyTree })) } @@ -1671,7 +1670,7 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { } private def forwardCall(pos: util.Position, receiver: Tree, paramss: List[List[ValDef]]): Tree = { - val argss = paramss map (_ map (x => Ident(x.symbol))) + val argss = mmap(paramss)(x => Ident(x.symbol)) atPos(pos) { (receiver /: argss) (Apply) } } @@ -1708,11 +1707,11 @@ abstract class SpecializeTypes extends InfoTransform with TypingTransformers { && clazz.info.decl(f.name).suchThat(_.isGetter) != NoSymbol ) - val argss = paramss map (_ map (x => + val argss = mmap(paramss)(x => if (initializesSpecializedField(x.symbol)) gen.mkAsInstanceOf(Literal(Constant(null)), x.symbol.tpe) else - Ident(x.symbol)) + Ident(x.symbol) ) atPos(pos) { (receiver /: argss) (Apply) } } diff --git a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala index 7915a64e21..7c605fa0a1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala +++ b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala @@ -9,22 +9,6 @@ import symtab.Flags._ import scala.collection.{ mutable, immutable } import scala.tools.util.StringOps.{ ojoin } -object listutil { - def mexists[T](xss: List[List[T]])(p: T => Boolean) = - xss exists (_ exists p) - def mmap[T, U](xss: List[List[T]])(f: T => U) = - xss map (_ map f) - def mforeach[T](xss: List[List[T]])(f: T => Unit) = - xss foreach (_ foreach f) - def mfind[T](xss: List[List[T]])(p: T => Boolean): Option[T] = { - for (xs <- xss; x <- xs) - if (p(x)) return Some(x) - None - } - def mfilter[T](xss: List[List[T]])(p: T => Boolean) = - for (xs <- xss; x <- xs; if p(x)) yield x -} - /** Logic related to method synthesis which involves cooperation between * Namer and Typer. */ diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala index 364e887939..a20461949d 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala @@ -99,7 +99,7 @@ trait Namers extends MethodSynthesis { } def enterValueParams(vparamss: List[List[ValDef]]): List[List[Symbol]] = { - listutil.mmap(vparamss) { param => + mmap(vparamss) { param => val sym = assignSymbol(param, param.name, mask = ValueParameterFlags) setPrivateWithin(param, sym) enterInScope(sym) @@ -522,13 +522,13 @@ trait Namers extends MethodSynthesis { val vparamss = tree match { case x: DefDef => x.vparamss ; case _ => Nil } val cparamss = constructorType.paramss - for ((vparams, cparams) <- vparamss zip cparamss) { - for ((param, cparam) <- vparams zip cparams) { + map2(vparamss, cparamss)((vparams, cparams) => + map2(vparams, cparams)((param, cparam) => // need to clone the type cparam.tpe??? // problem is: we don't have the new owner yet (the new param symbol) param.tpt setType subst(cparam.tpe) - } - } + ) + ) } sym setInfo { mkTypeCompleter(tree) { copySym => @@ -627,7 +627,7 @@ trait Namers extends MethodSynthesis { classOfModuleClass(m.moduleClass) = new WeakReference(tree) } val hasDefault = impl.body exists { - case DefDef(_, nme.CONSTRUCTOR, _, vparamss, _, _) => listutil.mexists(vparamss)(_.mods.hasDefault) + case DefDef(_, nme.CONSTRUCTOR, _, vparamss, _, _) => mexists(vparamss)(_.mods.hasDefault) case _ => false } if (hasDefault) { @@ -953,9 +953,9 @@ trait Namers extends MethodSynthesis { // def overriddenSymbol = meth.nextOverriddenSymbol // fill in result type and parameter types from overridden symbol if there is a unique one. - if (clazz.isClass && (tpt.isEmpty || listutil.mexists(vparamss)(_.tpt.isEmpty))) { + if (clazz.isClass && (tpt.isEmpty || mexists(vparamss)(_.tpt.isEmpty))) { // try to complete from matching definition in base type - listutil.mforeach(vparamss)(v => if (v.tpt.isEmpty) v.symbol setInfo WildcardType) + mforeach(vparamss)(v => if (v.tpt.isEmpty) v.symbol setInfo WildcardType) val overridden = overriddenSymbol if (overridden != NoSymbol && !overridden.isOverloaded) { overridden.cookJavaRawInfo() // #3404 xform java rawtypes into existentials @@ -993,7 +993,7 @@ trait Namers extends MethodSynthesis { _.info.isInstanceOf[MethodType])) { vparamSymss = List(List()) } - listutil.mforeach(vparamss) { vparam => + mforeach(vparamss) { vparam => if (vparam.tpt.isEmpty) { context.error(vparam.pos, "missing parameter type") vparam.tpt defineType ErrorType @@ -1073,7 +1073,7 @@ trait Namers extends MethodSynthesis { // Create trees for the defaultGetter. Uses tools from Unapplies.scala var deftParams = tparams map copyUntyped[TypeDef] - val defvParamss = listutil.mmap(previous) { p => + val defvParamss = mmap(previous) { p => // in the default getter, remove the default parameter val p1 = atPos(p.pos.focus) { ValDef(p.mods &~ DEFAULTPARAM, p.name, p.tpt.duplicate, EmptyTree) } UnTyper.traverse(p1) diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala index ace38bb4cb..78222e203b 100644 --- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala +++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala @@ -1347,7 +1347,7 @@ abstract class RefChecks extends InfoTransform with reflect.internal.transform.R } // types of the value parameters - member.paramss.flatten foreach (p => checkAccessibilityOfType(p.tpe)) + mapParamss(member)(p => checkAccessibilityOfType(p.tpe)) // upper bounds of type parameters member.typeParams.map(_.info.bounds.hi.widen) foreach checkAccessibilityOfType } diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala index a0ef2f5e2e..cde531adc1 100644 --- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala +++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala @@ -321,12 +321,9 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT val code = DefDef(protAcc, { val (receiver :: _) :: tail = protAcc.paramss val base: Tree = Select(Ident(receiver), sym) - val allParamTypes = sym.tpe.paramss map (xs => xs map (_.tpe)) - - (tail zip allParamTypes).foldLeft(base) { - case (fn, (params, tpes)) => - Apply(fn, params zip tpes map { case (p, tp) => makeArg(p, receiver, tp) }) - } + val allParamTypes = mapParamss(sym)(_.tpe) + val args = map2(tail, allParamTypes)((params, tpes) => map2(params, tpes)(makeArg(_, receiver, _))) + args.foldLeft(base)(Apply(_, _)) }) debuglog("" + code) diff --git a/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala b/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala index 4f7e6225e1..9b69c847f6 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Unapplies.scala @@ -112,7 +112,7 @@ trait Unapplies extends ast.TreeDSL private def constrParamss(cdef: ClassDef): List[List[ValDef]] = { val DefDef(_, _, _, vparamss, _, _) = treeInfo firstConstructor cdef.impl.body - vparamss map (_ map copyUntyped[ValDef]) + mmap(vparamss)(copyUntyped[ValDef]) } /** The return value of an unapply method of a case class C[Ts] @@ -165,7 +165,7 @@ trait Unapplies extends ast.TreeDSL val cparamss = constrParamss(cdef) atPos(cdef.pos.focus)( DefDef(caseMods, nme.apply, tparams, cparamss, classType(cdef, tparams), - New(classType(cdef, tparams), cparamss map (_ map gen.paramToArg))) + New(classType(cdef, tparams), mmap(cparamss)(gen.paramToArg))) ) } @@ -201,12 +201,12 @@ trait Unapplies extends ast.TreeDSL def paramWithDefault(vd: ValDef) = treeCopy.ValDef(vd, vd.mods | DEFAULTPARAM, vd.name, atPos(vd.pos.focus)(TypeTree() setOriginal vd.tpt), toIdent(vd)) - val paramss = cparamss map (_ map paramWithDefault) + val paramss = mmap(cparamss)(paramWithDefault) val classTpe = classType(cdef, tparams) Some(atPos(cdef.pos.focus)( DefDef(Modifiers(SYNTHETIC), nme.copy, tparams, paramss, classTpe, - New(classTpe, paramss map (_ map toIdent))) + New(classTpe, mmap(paramss)(toIdent))) )) } } |