From b54935fc81e829c98303ac314d1af2fe5fca504b Mon Sep 17 00:00:00 2001 From: Philippe Suter <philippe.suter@gmail.com> Date: Fri, 18 Jun 2010 16:04:58 +0000 Subject: [PATCH] completing the move --- src/funcheck/lib/Specs.scala | 26 - .../FilterGeneratorAnnotations.scala | 69 -- .../scalacheck/ForAllTransformer.scala | 200 ----- .../scalacheck/GeneratorDefDefInjector.scala | 33 - src/funcheck/scalacheck/ScalaCheck.scala | 786 ------------------ .../scalacheck/ScalaCheckIntegrator.scala | 31 - src/funcheck/util/FreshNameCreator.scala | 5 - src/scala/collection/Multiset.scala | 81 -- .../collection/immutable/EmptyMultiset.scala | 24 - .../collection/immutable/HashMultiset.scala | 79 -- src/scala/collection/immutable/Helper.scala | 24 - src/scala/collection/immutable/Multiset.scala | 43 - 12 files changed, 1401 deletions(-) delete mode 100644 src/funcheck/lib/Specs.scala delete mode 100644 src/funcheck/scalacheck/FilterGeneratorAnnotations.scala delete mode 100644 src/funcheck/scalacheck/ForAllTransformer.scala delete mode 100644 src/funcheck/scalacheck/GeneratorDefDefInjector.scala delete mode 100644 src/funcheck/scalacheck/ScalaCheck.scala delete mode 100644 src/funcheck/scalacheck/ScalaCheckIntegrator.scala delete mode 100644 src/funcheck/util/FreshNameCreator.scala delete mode 100644 src/scala/collection/Multiset.scala delete mode 100644 src/scala/collection/immutable/EmptyMultiset.scala delete mode 100644 src/scala/collection/immutable/HashMultiset.scala delete mode 100644 src/scala/collection/immutable/Helper.scala delete mode 100644 src/scala/collection/immutable/Multiset.scala diff --git a/src/funcheck/lib/Specs.scala b/src/funcheck/lib/Specs.scala deleted file mode 100644 index 1f3167cb6..000000000 --- a/src/funcheck/lib/Specs.scala +++ /dev/null @@ -1,26 +0,0 @@ -package funcheck.lib - -object Specs { - - /** - * this is used to annotate the (unique) class method - * that will be used by our funcheck plugin to - * automagically define a class generator that can be used - * by ScalaCheck to create test cases. - */ - class generator extends StaticAnnotation - - implicit def extendedBoolean(b: => Boolean) = new { - def ==>(p: => Boolean) = Specs ==> (b,p) - } - - def forAll[A](f: A => Boolean): Boolean = { - Console.err.println("Warning: ignored forAll. Are you using the funcheck plugin?") - true - // error("\"forAll\" combinator is currently unsupported by plugin.") - } - - - /** Implication */ - def ==>(ifz: => Boolean, then: => Boolean): Boolean = !ifz || then -} diff --git a/src/funcheck/scalacheck/FilterGeneratorAnnotations.scala b/src/funcheck/scalacheck/FilterGeneratorAnnotations.scala deleted file mode 100644 index be3aaae44..000000000 --- a/src/funcheck/scalacheck/FilterGeneratorAnnotations.scala +++ /dev/null @@ -1,69 +0,0 @@ -package funcheck.scalacheck - -import scala.tools.nsc.Global - -/** - * A tree traverser which filter the trees elements that contain the - * <code>@generator</code> annotation, defined in <code>funcheck.lib.Specs</code> - * module. - * - * Note: For the moment this is working only for <code>ClassDef</code> and - * <code>DefDef</code> tree elements. - * - * This trait is meant to be used with the <code>FilterTreeTraverser</code> - * class, available in the <code>scala.tools.nsc.ast.Trees</code> trait. - * - * - * Usage Example: - * - * new FilterTreeTraverser(filterTreesWithGeneratorAnnotation(unit)) - * - * where <code>unit</code> is the current Compilation Unit. - */ -trait FilterGeneratorAnnotations { - val global: Global - // [[INFO]] "hasAttribute" is "hasAnnotation" in future compiler release 2.8 - import global._ - - /** Funcheck <code>@generator</code> annotation. */ - private lazy val generator: Symbol = definitions.getClass("funcheck.lib.Specs.generator") - - - /** - * Check for <code>@generator</code> annotation only for class and method - * definitions. A class is considered to be annotated if either the class itself - * has the annotation, or if the class inherit from an annotated abstract class. - */ - def filterTreesWithGeneratorAnnotation(Unit: CompilationUnit)(tree: Tree): Boolean = { - lazy val sym = tree.symbol - tree match { - case cd: ClassDef => isAbstractClass(sym) || - sym.hasAttribute(generator) || - abstractSuperClassHasGeneratorAnnotation(sym.superClass) - case d: DefDef => sym.hasAttribute(generator) - case _ => false - } - } - - - /** Return true if the class (or superclass) symbol is flagged as being ABSTRACT and contains - * the <code>@generator</code> annotation.*/ - private def abstractSuperClassHasGeneratorAnnotation(superclass: Symbol): Boolean = { - //require(superclass.isInstanceOf[ClassSymbol], "expected ClassSymbol, found "+superclass) - superclass match { - case NoSymbol => false - case cs: ClassSymbol => - (isAbstractClass(cs) && cs.hasAttribute(generator)) || - abstractSuperClassHasGeneratorAnnotation(cs.superClass) - case _ => - assert(false, "expected ClassSymbol, found "+superclass) - false - } - } - - private def isAbstractClass(s: Symbol): Boolean = s match { - case cs: ClassSymbol => cs.hasFlag(scala.tools.nsc.symtab.Flags.ABSTRACT) - case _ => false - } - -} \ No newline at end of file diff --git a/src/funcheck/scalacheck/ForAllTransformer.scala b/src/funcheck/scalacheck/ForAllTransformer.scala deleted file mode 100644 index 4d02d6cca..000000000 --- a/src/funcheck/scalacheck/ForAllTransformer.scala +++ /dev/null @@ -1,200 +0,0 @@ -package funcheck.scalacheck - -import scala.tools.nsc.transform.TypingTransformers -import scala.tools.nsc.util.NoPosition -import funcheck.util.FreshNameCreator - -/** Takes care of mapping Specs.forAll methods calls to - * ScalaCheck org.scalacheck.Prop.forAll. - */ -trait ForAllTransformer extends TypingTransformers - with ScalaCheck - with FreshNameCreator -{ - import global._ - - private lazy val specsModule: Symbol = definitions.getModule("funcheck.lib.Specs") - - - - def forAllTransform(unit: CompilationUnit): Unit = - unit.body = new ForAllTransformer(unit).transform(unit.body) - - - - - class ForAllTransformer(unit: CompilationUnit) - extends TypingTransformer(unit) - { - - override def transform(tree: Tree): Tree = { - curTree = tree - - tree match { - /* XXX: This only works for top-level forAll. Nested forAll are not handled by the current version*/ - case Apply(TypeApply(s: Select, _), rhs @ List(f @ Function(vparams,body))) if isSelectOfSpecsMethod(s.symbol, "forAll") => - atOwner(currentOwner) { - assert(vparams.size == 1, "funcheck.Specs.forAll properties are expected to take a single (tuple) parameter") - - val v @ ValDef(mods,name,vtpt,vinit) = vparams.head - - vtpt.tpe match { - // the type of the (single, by the above assumption) function parameter - // will tell us what are the generators needed. In fact, we need to manually - // provide the generators since despite the generators that we create are - // implicit definitions, funcheck is hooking after the typechecking phase - // and implicit definition are solved at typechecking. Therefore the need - // of manually provide every single parameter to the org.scalacheck.Prop.forAll - // method. - // This is actually one of the major limitations of this plugin since it is not - // really quite flexible. For a future work it might be a good idea to rethink - // how this problem can be fixed (an idea could be to inject the code and actuate - // the forall conversion and then typecheck the whole program from zero). - case tpe @ TypeRef(_,value,vtpes) => - var fun: Function = { - if(vtpes.size <= 1) { - // if there is less than one parameter then the function tree can be injected - // without (almost) no modificcation because it matches what Scalacheck Prop.forAll - // expects - f - } - else { - // Transforming a pair into a list of arguments (this is what ScalaCheck Prop.forAll expects) - - // create a fresh name for each parameter declared parametric type - val freshNames = vtpes.map(i => fresh.newName(NoPosition,"v")) - - val funSym = tree.symbol - - val subst = for { i <- 0 to vtpes.size-1} yield { - val toSym = funSym.newValueParameter(funSym.pos, freshNames(i)).setInfo(vtpes(i)) - - val from = Select(v, v.symbol.tpe.decl("_"+(i+1))) - val to = ValDef(toSym, EmptyTree) setPos (tree.pos) - - (from, to) - } - - - val valdefs = subst.map(_._2).toList - val fun = localTyper.typed { - val newBody = new MyTreeSubstituter(subst.map(p => p._1.symbol).toList, valdefs.map(v => Ident(v.symbol)).toList).transform(resetAttrs(body)) - Function(valdefs, newBody) - }.asInstanceOf[Function] - - - new ChangeOwnerTraverser(funSym, fun.symbol).traverse(fun); - new ForeachTreeTraverser({t: Tree => t setPos tree.pos}).traverse(fun) - fun - } - } - - // Prop.forall(function , where function is of the form (v1,v2,...,vn) => expr(v1,v2,..,vn)) - val prop = Prop.forAll(List(transform(fun))) - - - // the following are the list of (implicit) parameters that need to be provided - // when calling Prop.forall - - var buf = new collection.mutable.ListBuffer[Tree]() - - val blockValSym = newSyntheticValueParam(fun.symbol, definitions.BooleanClass.typeConstructor) - - val fun2 = localTyper.typed { - val body = Prop.propBoolean(resetAttrs(Ident(blockValSym))) - Function(List(ValDef(blockValSym, EmptyTree)), body) - }.asInstanceOf[Function] - - - new ChangeOwnerTraverser(fun.symbol, fun2.symbol).traverse(fun2); - new ForeachTreeTraverser({t: Tree => t setPos tree.pos}).traverse(fun2) - - buf += Block(Nil,fun2) - - - if(vtpes.size <= 1) { - buf += resetAttrs(Arbitrary.arbitrary(tpe)) - buf += resetAttrs(Shrink.shrinker(tpe)) - } else { - for { tpe <- vtpes } { - buf += resetAttrs(Arbitrary.arbitrary(tpe)) - buf += resetAttrs(Shrink.shrinker(tpe)) - } - } - - - import posAssigner.atPos // for filling in tree positions - - - val property = localTyper.typed { - atPos(tree.pos) { - Apply(prop, buf.toList) - } - } - - - - localTyper.typed { - atPos(tree.pos) { - Test.isPassed(Test.check(property)) - } - } - - - case t => - assert(false, "expected ValDef of type TypeRef, found "+t) - tree - } - } - - /** Delegates the recursive traversal of the tree. */ - case _ => super.transform(tree) - } - - } - - class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol) extends Traverser { - override def traverse(tree: Tree) { - if (tree != null && tree.symbol != null && tree.symbol != NoSymbol && tree.symbol.owner == oldowner) - tree.symbol.owner = newowner; - super.traverse(tree) - } - } - - /** Synthetic value parameters when parameter symbols are not available - */ - final def newSyntheticValueParam(owner: Symbol, argtype: Type): Symbol = { - var cnt = 0 - def freshName() = { cnt += 1; newTermName("x$" + cnt) } - def param(tp: Type) = - owner.newValueParameter(owner.pos, freshName()).setFlag(scala.tools.nsc.symtab.Flags.SYNTHETIC).setInfo(tp) - param(argtype) - } - - private def isSelectOfSpecsMethod(s: Symbol, method: String): Boolean = - s == specsModule.tpe.decl(method) - - - - /** Quick (and dirty) hack for enabling tree substitution for pair elements. - * Specifically, this allow to map pair accesses such as p._1 to a new variable 'x' - * ([p._1 |-> x, p._2 |-> y, ..., p._n |-> z]) - */ - class MyTreeSubstituter(from: List[Symbol], to: List[Tree]) extends TreeSubstituter(from,to) { - override def transform(tree: Tree): Tree = tree match { - // Useful for substutite values like p._1 where 'p' is a pair - // Inherithed 'TreeSubstituter' cannot handle this - case Select(Ident(_), name) => - def subst(from: List[Symbol], to: List[Tree]): Tree = - if (from.isEmpty) tree - else if (tree.symbol == from.head) to.head - else subst(from.tail, to.tail); - subst(from, to) - case _ => - super.transform(tree) - } - } - - } - -} diff --git a/src/funcheck/scalacheck/GeneratorDefDefInjector.scala b/src/funcheck/scalacheck/GeneratorDefDefInjector.scala deleted file mode 100644 index c10b26a4d..000000000 --- a/src/funcheck/scalacheck/GeneratorDefDefInjector.scala +++ /dev/null @@ -1,33 +0,0 @@ -package funcheck.scalacheck - -import scala.tools.nsc.transform.TypingTransformers - -trait GeneratorDefDefInjector extends TypingTransformers { - import global._ - - def injectGenDefDefs(injecting: List[DefDef], unit: CompilationUnit): Unit = - unit.body = new GenDefDefTransformer(injecting, unit).transform(unit.body) - - class GenDefDefTransformer(injecting: List[DefDef], unit: CompilationUnit) - extends /*Code Injection*/ TypingTransformer(unit) - { - override def transform(tree: Tree): Tree = { - curTree = tree - tree match { - - case impl @ Template(parents, self, body) => - atOwner(currentOwner) { - val newBody: List[Tree] = body ::: (injecting.map(localTyper.typed(_))) - val cd = copy.Template(impl, parents, self, newBody) - cd - } - - /** Delegates the recursive traversal of the tree. */ - case _ => super.transform(tree) - } - } - - } -} - - \ No newline at end of file diff --git a/src/funcheck/scalacheck/ScalaCheck.scala b/src/funcheck/scalacheck/ScalaCheck.scala deleted file mode 100644 index 5fda35047..000000000 --- a/src/funcheck/scalacheck/ScalaCheck.scala +++ /dev/null @@ -1,786 +0,0 @@ -package funcheck.scalacheck - -import scala.tools.nsc.Global -import scala.tools.nsc.util.NoPosition -import funcheck.util.FreshNameCreator - -/** - * Utilitarity class that is used as a factory for creating Tree nodes for method - * calls of classes and modules in the <code>org.scalacheck</code> package. - */ -trait ScalaCheck extends FreshNameCreator { - val global: Global - import global._ - - trait GenericScalaCheckModule { - /** Symbol for a module definition. */ - protected val moduleSym: Symbol - /** Symbol for the module's companion class definition. */ - protected lazy val classSym = moduleSym.linkedClassOfModule - - /** - * <p> - * Take a <code>symbol</code> and method <code>name</code> and return the associated - * method's symbol. - * </p> - * <p> - * Note: if <code>symbol</code> does not contain a method named </code>name</code>, the - * returned symbol will be a <code>NoSymbol</code>. - * </p> - * - * @param symbol A module/class symbol, - * @param name A name of the method that should be part of the declared members of the <code>symbol</code>. - * @return The symbol for the method 'symbol.name' or <code>NoSymbol</code> if the <code>symbol</code> does - * not have a member named <code>name</code>. - */ - private def symDecl(symbol: Symbol, name: String) = symbol.tpe.decl(name) - - /** Identical to symDecl(symbol: Symbol, name: String), but uses a Name object - * instead of a String for the <code>name</code>.*/ - private def symDecl(symbol: Symbol, name: Name) = symbol.tpe.decl(name) - - /** Retrieve the constructor Symbol for the passes <code>cs</code> ClassSymbol. */ - private def constructorDecl(cs: ClassSymbol) = symDecl(cs, nme.CONSTRUCTOR) - - /** - * <p> - * Take a method <code>name</code> and return the associated module method's symbol. - * </p> - * <p> - * Note: if module does not contain a method named </code>name</code>, the - * returned symbol will be a <code>NoSymbol</code>. - * </p> - * - * @param name A name of the method that should be part of the declared members of the module. - * @return The symbol for the method 'module.name' or <code>NoSymbol</code> if the module does - * not have a member named <code>name</code>. - */ - protected def modDecl(method: String) = symDecl(moduleSym, method) - - /** - * <p> - * Take a method <code>name</code> and return the associated (module's) companion class method's symbol. - * </p> - * <p> - * Note: if class does not contain a method named </code>name</code>, the - * returned symbol will be a <code>NoSymbol</code>. - * </p> - * - * @param name A name of the method that should be part of the declared members of the class. - * @return The symbol for the method 'class.name' or <code>NoSymbol</code> if the class does - * not have a member named <code>name</code>. - */ - protected def classDecl(method: String) = symDecl(classSym, method) - - /** - * <p> - * Take an <code>instance</code> symbol and a <code>method</code> name and return - * valid Scala Tree node of the form 'instance.method'. - * </p> - * <p> - * The precondition for this method to execute is that the <code>instance</code> Symbol - * contains in its members the selected <code>method</code>, otherwise calling this routine - * will throw an exception. - * </p> - * - * @param instance The Symbol for the instance whose <code>method</code> is selected. - * @param method The name of the selected method. - * @return A Scala valid Select Tree node of the form 'instance.method'. - * - */ - protected def select(instance: Symbol, method: String): Select = { - require(instance.tpe.decl(method) != NoSymbol) - Select(Ident(instance), symDecl(instance,method)) - } - - /** - * <p> - * Apply <code>arg</code> to the passed <code>method</code> contained in the - * <code>moduleSym</code> module and return a valid Scala Tree node of the - * form 'module.method(arg)'. - * </p> - * <p> - * The precondition for this method to execute is that the module Symbol - * contains in its members the passed <code>method</code>, otherwise calling - * this routine will throw an exception. - * </p> - * - * @param method The name of the selected method. - * @args The arguments to which the <code>method</code> is applied to. - * @return A Scala valid Apply Tree node of the form 'moduleSym.method(arg)'. - * - */ - protected def moduleApply(method: String, args: List[Tree]): Apply = - apply(select(moduleSym,method), args) - - /** Calls <code>moduleApply</code> and wraps the passed <code>arg</code> into a - * List, i.e., moduleApply(method, List(arg).*/ - protected def moduleApply(method: String, arg: Tree): Apply = moduleApply(method,List(arg)) - - /** - * <p> - * Generic apply. Applies <code>select</code> to the passed list of <code>arguments</code>. - * and return a valid Scala Tree Apply Node of the form 'select(arg1,arg2,...,argN)'. - * </p> - * <p> - * Note: No check is performed to ensure that <code>select</code> can accept - * the passed list of <code>arguments</code> - * </p> - * - * @param select The left hand side of the application. - * @param arguments The arguments of the application. - * @return A Scala valid Apply Tree node of the form 'select(arg1, arg32, ..., argN)' - */ - protected def apply(select: Tree, arguments: List[Tree]): Apply = - Apply(select, arguments) - - /** Calls <code>apply</code> and wraps the passed <code>arg</code> into a List, - * i.e., apply(select, List(arg)). */ - protected def apply(select: Tree, argument: Tree): Apply = - apply(select, List(argument)) - } - - - /** Module for creating scalac Tree nodes for calling methods of the - * <code>org.scalacheck.Gen</code> class and module.*/ - object Gen extends GenericScalaCheckModule { - - /** Symbol for the <code>org.scalacheck.Gen</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.Gen") - - /** - * Apply <code>polyTpe</code> to the polymorphic type <code>org.scalacheck.Gen</code>. - * - * @param polyTpe the type to be applied to <code>org.scalacheck.Gen</code>. - * @return The polymorphic type resulting from applying <code>polyTpe</code> - * to the polymorphic type <code>org.scalacheck.Gen</code>, i.e., - * <code>Gen[polyTpe]</code>. - */ - private def applyType(polyTpe: Type) = appliedType(classSym.tpe, List(polyTpe)) - - - /** - * This creates a Tree node for the call <code>org.scalacheck.Gen.value[T](rhs)</code>, - * where the polymorphic type <code>T</code> will be inferred during the next - * typer phase (this usually means that the typer has to be called explictly, - * so it is the developer duty to ensure that this happen at some point). - */ - def value(rhs: Tree): Tree = moduleApply("value", rhs) - - - /** - * This creates a Tree node for the call <code>org.scalacheck.Gen.oneOf[T](generators)</code>, - * where the polymorphic type <code>T</code> will be inferred during the next - * typer phase (this usually means that the typer has to be called explictly, - * so it is the developer duty to ensure that this happen at some point). - */ - def oneOf(generators: List[Symbol]): Tree = - moduleApply("oneOf", generators.map(Ident(_))) - - - def lzy(generator: Tree): Tree = moduleApply("lzy", generator) - - /** - * This creates a Tree node for the call <code>org.scalacheck.Gen.flatMap[T](body)</code>, - * where the polymorphic type <code>T</code> will be inferred during the next - * typer phase (this usually means that the typer has to be called explictly, - * so it is the developer duty to ensure that this happen at some point). - */ - def flatMap(qualifier: Tree, body: Tree): Tree = - apply(Select(qualifier, classDecl("flatMap")), body) - - - /** - * This creates a Tree node for the call <code>org.scalacheck.Gen.map[T](rhs)</code>, - * where the polymorphic type <code>T</code> will be inferred during the next - * typer phase (this usually means that the typer has to be called explictly, - * so it is the developer duty to ensure that this happen at some point). - */ - def map(qualifier: Tree, body: Tree): Tree = - apply(Select(qualifier, classDecl("map")), body) - - - - /** - * Utilitary method for creating a method symbol for a <code>org.scalacheck.Gen</codee> - * generator method. - * - * @param owner The owner of the method (DefDef) which will use the returned method symbol. - * @param genName The name of the method symbol (which will also be the name of the method). - * @param retTpe The method's returning type. - * @return The method symbol for a generator method. - */ - def createGenDefSymbol(owner: Symbol, genName: String, retTpe: Type): Symbol = { - // returning type of the new method, i.e., Gen["retTpe"] - val genDefRetTpe = applyType(retTpe) - - // create a symbol for the generator method that will be created next - owner.newMethod(owner.pos,genName).setInfo(PolyType(List(), genDefRetTpe)) - } - - - - /** - * Map that stores for each @generator annotated ClassDef or DefDef the automatically - * generated DefDef for creating instances of the <code>org.scalacheck.Gen</code> class. - * The <code>Type</code> that is associated to the DefDef is either the type of the - * ClassDef or the returning type of the DefDef. - */ - private val tpe2listGen = scala.collection.mutable.Map.empty[Type, List[DefDef]] - private val tpe2listGenSym = scala.collection.mutable.Map.empty[Type, List[Symbol]] - - /** - * Add the <code>gen</code> generator DefDef declaration to the list of - * generators for <code>tpe</code>. - * - * @param tpe The type of elements generated by the <code>gen</code>. - * @param gen The DefDef declaration for the generator method. - */ - def +[T](map: collection.mutable.Map[Type, List[T]], key: Type, value: T): Unit = map.get(key) match { - case None => map += key -> List(value) - case Some(values) => map += key -> (value :: values) - } - - /** List of generator DefDef symbols for a given type <code>tpe</code>*/ - def genSymbolsForType(tpe: Type): List[Symbol] = tpe2listGenSym.get(tpe) match { - case None => Nil - case Some(symbols) => symbols - } - - /** - * Second Pass: Create symbols for the generator DefDef that will be created - * durind the Third Pass. - */ - def createGenDefDef(klasses: List[ClassDef], defs: List[DefDef]): List[DefDef] = { - val generable: List[(Symbol,Tree)] = createGenDefSyms(klasses, defs) - - for { (genSym, genTree) <- generable } genTree match { - case cd: ClassDef => - val tpe = cd.symbol.tpe - Gen + (tpe2listGen, tpe, Gen.createGenDef(cd, genSym)) - - case d: DefDef => - val tpe = d.tpt.symbol.tpe - val generated = DefDef(genSym, Modifiers(0), List(), rhsGenDef(Ident(d.name))(d)(genSym)) - Gen + (tpe2listGen, tpe, generated) - } - - // flatten into single list values of Gen.tpe2listGen - (List[DefDef]() /: Gen.tpe2listGen.values) { - case (xs, xss) => xs ::: xss - } - } - - - /** - * Create method symbols for each <code>@generator</code> annotated ClassDef - * and DefDef. - */ - private def createGenDefSyms(klasses: List[ClassDef], defs: List[DefDef]): List[(Symbol, Tree)] = { - - val genKlasses: List[(Symbol, ClassDef)] = for(klass <- klasses) yield { - val genName = fresh.newName(NoPosition, "gen"+klass.name) - val tpe = klass.symbol.tpe - val genSym = createGenDefSymbol(klass.symbol.enclClass.owner, genName, tpe) - - Gen + (tpe2listGenSym, tpe, genSym) - - (genSym, klass) - } - - val genDefs: List[(Symbol, DefDef)] = for(d <- defs) yield { - val genName = fresh.newName(NoPosition, "gen"+d.name) - val tpe = d.tpt.symbol.tpe - val genSym = createGenDefSymbol(d.symbol.owner, genName, tpe) - - Gen + (tpe2listGenSym, tpe, genSym) - - (genSym, d) - } - - genKlasses ::: genDefs - } - - - - def createGenDef(cd: ClassDef, genDef: Symbol): DefDef = { - val d: DefDef = getConstructorOf(cd) - val DefDef(_,_,_,vparamss,retTpe,_) = d - assert(vparamss.size <= 1, "currying is not supported. Change signature of "+cd.symbol) - - - if(cd.symbol.hasFlag(scala.tools.nsc.symtab.Flags.ABSTRACT)) { - val generators = retTpe.symbol.children.toList.map(s => genSymbolsForType(s.tpe)).flatMap(v=>v) - DefDef(genDef, Modifiers(0), List(), Gen.lzy(Gen.oneOf(generators))) - } - else { - - val constrObj = resetAttrs(d.tpt.duplicate) - val instance = Select(New(constrObj), nme.CONSTRUCTOR) - - assert(d.tpt.isInstanceOf[TypeTree]) - - val body = rhsGenDef(instance)(d)(genDef) - DefDef(genDef, Modifiers(0), List(), body) - } - } - - - /** <code>base</code> is either - * - Select(New(tpe),constructor) [constructor] - * - Ident(name) [method call] - */ - private def rhsGenDef(base: Tree)(d: DefDef)(extOwner: Symbol): Tree = { - val DefDef(_,name,_,vparamss,retTpe,_) = d - assert(vparamss.size <= 1, "currying is not supported. Change signature of "+d.symbol) - // XXX: quick fix to force creation of arbitrary objects for each data type, this should be refactored!! - Arbitrary.arbitrary(retTpe.asInstanceOf[TypeTree]) - - if(vparamss.head.isEmpty) - Gen.value(Apply(base, Nil)) - - else { - var owner = extOwner - - val paramssTpe: List[ValDef] = vparamss.flatMap(v=>v).map(p => - ValDef(Modifiers(0), fresh.newName(NoPosition, "v"), resetAttrs(p.tpt.duplicate), EmptyTree)) - - - var last = true - - - val z :Tree = Apply(base, paramssTpe.map(p => Ident(p.name))) - val body = (paramssTpe :\ z) { - case (param,apply) => { - val body = Function(List(param), apply) - body.symbol.owner = owner - owner = body.symbol - //XXX: it is not flatMap in general. fix this!! - if(last) { - last = false - Gen.map(Arbitrary.arbitrary(param.tpt.asInstanceOf[TypeTree]), body) - } else - Gen.flatMap(Arbitrary.arbitrary(param.tpt.asInstanceOf[TypeTree]), body) - } - } - - - Gen.lzy(body) - } - } - - - - private def getConstructorOf(cd: ClassDef): DefDef = { - val Template(parents, self, body) = cd.impl - var dd: DefDef = null - for { b <- body } b match { - case d @ DefDef(_, nme.CONSTRUCTOR, _, _, _, _) => dd = d - case _ => ; - } - dd - } ensuring (res => res != null) - - - - } - - - - /** Module for creating scalac Tree nodes for calling methods of the - * <code>org.scalacheck.Arbitrary</code> class and module.*/ - object Arbitrary extends GenericScalaCheckModule { - - - /** Symbol for the <code>org.scalacheck.Arbitrary</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.Arbitrary") - - /** Symbol for the <code>org.scalacheck.Arbitrary.arbInt</code> method definition. */ - private val arbInt = select(moduleSym, "arbInt") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbBool</code> method definition. */ - private val arbBool = select(moduleSym, "arbBool") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbLong</code> method definition. */ - private val arbLong = select(moduleSym, "arbLong") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbThrowable</code> method definition. */ - private val arbThrowable = select(moduleSym, "arbThrowable") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbDouble</code> method definition. */ - private val arbDouble = select(moduleSym, "arbDouble") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbChar</code> method definition. */ - private val arbChar = select(moduleSym, "arbChar") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbString</code> method definition. */ - private val arbString = select(moduleSym, "arbString") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbOption</code> method definition. */ - private val arbOption = select(moduleSym, "arbOption") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbImmutableMap</code> method definition. */ - private val arbImmutableMap = select(moduleSym, "arbImmutableMap") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbList</code> method definition. */ - private val arbList = select(moduleSym, "arbList") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbArray</code> method definition. */ - private val arbArray = select(moduleSym, "arbArray") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbSet</code> method definition. */ - private val arbSet = select(moduleSym, "arbSet") - /** Symbol for the <code>org.scalacheck.Arbitrary.arbTuple2</code> method definition. */ - private val arbTuple2 = select(moduleSym, "arbTuple2") - - //[[TODO]] - //lazy val arbMultiSet = Select(Ident(arbitraryModule), arbitraryModule.tpe.decl("arbMultiSet")) - - - - /** Map that stores <code>org.scalacheck.Arbitrary.arbitrary[Type]</code> calls. */ - protected val tpe2arbApp = scala.collection.mutable.Map.empty[Type,Tree] - - - // initialize map with ScalaCheck built-in types that are part of our PureScala language - import definitions._ - tpe2arbApp += IntClass.typeConstructor -> arbInt - tpe2arbApp += BooleanClass.typeConstructor -> arbBool - tpe2arbApp += LongClass.typeConstructor -> arbLong - tpe2arbApp += ThrowableClass.typeConstructor -> arbThrowable - tpe2arbApp += DoubleClass.typeConstructor -> arbDouble - tpe2arbApp += CharClass.typeConstructor -> arbChar - tpe2arbApp += StringClass.typeConstructor -> arbString // XXX: NOT WORKING - tpe2arbApp += OptionClass.typeConstructor -> arbOption - - //lazy val ImmutableMapClass: Symbol = definitions.getClass(newTypeName("scala.collection.immutable.Map")) - //lazy val ImmutableSetClass: Symbol = definitions.getClass(newTypeName("scala.collection.immutable.Set")) - - //tpe2arbApp += ImmutableMapClass.typeConstructor -> arbImmutableMap - tpe2arbApp += ListClass.typeConstructor -> arbList - tpe2arbApp += ArrayClass.typeConstructor -> arbArray - //tpe2arbApp += ImmutableSetClass.typeConstructor -> arbSet - tpe2arbApp += TupleClass(2).typeConstructor -> arbTuple2 - - /** - * Apply <code>polyTpe</code> to the polymorphic type <code>org.scalacheck.Arbitrary</code>. - * - * @param polyTpe the type to be applied to <code>org.scalacheck.Arbitrary</code>. - * @return The polymorphic type resulting from applying <code>polyTpe</code> - * to the polymorphic type <code>org.scalacheck.Arbitrary</code>, i.e., - * <code>Arbitrary[polyTpe]</code>. - */ - private def applyType(tpe: Type) = appliedType(classSym.tpe, List(tpe)) - - /** - * Creates a Tree node for the call <code>org.scalacheck.Arbitrary.apply[T](generator)</code>, - * where the polymorphic type <code>T</code> will be inferred during the next - * typer phase (this usually means that the typer has to be called explictly, - * so it is the developer duty to ensure that this happen at some point). - */ - def apply(generator: Tree): Tree = moduleApply("apply", generator) - - def arbitrary(tpe: Type): Tree = tpe2arbApp.get(tpe) match { - case Some(arbTree) => arbTree - case None => - val TypeRef(_,sym,params) = tpe - apply(arbitrary(sym.typeConstructor), params.map(arbitrary(_))) - } - - - /** - * - */ - def arbitrary(polyTpe: TypeTree): Apply = { - val symbol = polyTpe.symbol - val tpe = symbol.tpe - tpe2arbApp.get(tpe) match { - case Some(arb) => applyArbitrary(arb) - case None => arbitrary(symbol) - } - } - - /** Map that stores not built-in <code>org.scalacheck.Arbitrary</code> DefDef definitions. */ - private val tpe2arbDefDef = scala.collection.mutable.Map.empty[Type,DefDef] - - def getArbitraryDefDefs: List[DefDef] = tpe2arbDefDef.values.toList - - def arbitrary(tpeSym: Symbol): Apply = { - require(tpe2arbApp.get(tpeSym.tpe).isEmpty, "Arbitrary.arbitrary["+tpeSym.tpe+"] is already in the map") - - val owner = tpeSym.toplevelClass - val arbName = fresh.newName(NoPosition,"arb"+tpeSym.name) - val tpe = tpeSym.tpe - - val arbDef = createArbitraryDefSymbol(owner, arbName, tpe) - - - val genNames = Gen.genSymbolsForType(tpe) - - - val generated = DefDef(arbDef, Modifiers(0), List(), Arbitrary(Gen.oneOf(genNames))) - tpe2arbDefDef += tpe -> generated - - val result = applyArbitrary(Ident(arbDef)) - tpe2arbApp += tpe -> Ident(arbDef) - - result - - } - - - protected def applyArbitrary(param: Tree): Apply = - apply(select(moduleSym, "arbitrary"), param) - - - /** - * Utilitary method for creating a method symbol for a <code>org.scalacheck.Arbitrary</codee> - * generator method. - * - * @param owner The owner of the method (DefDef) which will use the returned method symbol. - * @param arbName The name of the method symbol (which will also be the name of the method). - * @param retTpe The method's returning type. - * @return The method symbol for a generator method. - */ - def createArbitraryDefSymbol(owner: Symbol, arbName: String, retTpe: Type): Symbol = { - // returning type of the new method, i.e., Arbitrary["retTpe"] - val arbRetTpe = applyType(retTpe) - - // Create the DefDef for the new Arbitrary object - val arbDef = owner.newMethod(owner.pos, arbName).setInfo(PolyType(List(), arbRetTpe)) - // Implicit only because of ScalaCheck rational (not really needed since we are injecting code) - arbDef.setFlag(scala.tools.nsc.symtab.Flags.IMPLICIT) - - arbDef - } - } - - object Prop extends GenericScalaCheckModule { - - /** Symbol for the <code>org.scalacheck.Prop</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.Prop") - - - def forAll(props: List[Tree]): Apply = - moduleApply("forAll", props) - - def forAll(prop: Tree): Apply = forAll(List(prop)) - - def ==>(ifz: Tree, then: Tree): Apply = moduleApply("==>", List(ifz,propBoolean(then))) - - def propBoolean(prop: Tree): Apply = moduleApply("propBoolean", List(prop)) - - } - - - object Shrink extends GenericScalaCheckModule { - - /** Symbol for the <code>org.scalacheck.Shrink</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.Shrink") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkInt</code> method definition. */ - private val shrinkInt = select(moduleSym, "shrinkInt") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkString</code> method definition. */ - private val shrinkString = select(moduleSym, "shrinkString") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkOption</code> method definition. */ - private val shrinkOption = select(moduleSym, "shrinkOption") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkList</code> method definition. */ - private val shrinkList = select(moduleSym, "shrinkList") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkSet</code> method definition. */ - private val shrinkArray = select(moduleSym, "shrinkArray") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkSet</code> method definition. */ - private val shrinkSet = select(moduleSym, "shrinkSet") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple2</code> method definition. */ - private val shrinkTuple2 = select(moduleSym, "shrinkTuple2") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple3</code> method definition. */ - private val shrinkTuple3 = select(moduleSym, "shrinkTuple3") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple4</code> method definition. */ - private val shrinkTuple4 = select(moduleSym, "shrinkTuple4") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple5</code> method definition. */ - private val shrinkTuple5 = select(moduleSym, "shrinkTuple5") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple6</code> method definition. */ - private val shrinkTuple6 = select(moduleSym, "shrinkTuple6") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple7</code> method definition. */ - private val shrinkTuple7 = select(moduleSym, "shrinkTuple7") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple8</code> method definition. */ - private val shrinkTuple8 = select(moduleSym, "shrinkTuple8") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkTuple9</code> method definition. */ - private val shrinkTuple9 = select(moduleSym, "shrinkTuple9") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntList</code> method definition. */ - private val shrinkIntList = select(moduleSym, "shrinkIntList") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanList</code> method definition. */ - private val shrinkBooleanList = select(moduleSym, "shrinkBooleanList") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleList</code> method definition. */ - private val shrinkDoubleList = select(moduleSym, "shrinkDoubleList") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringList</code> method definition. */ - private val shrinkStringList = select(moduleSym, "shrinkStringList") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntArray</code> method definition. */ - private val shrinkIntArray = select(moduleSym, "shrinkIntArray") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanArray</code> method definition. */ - private val shrinkBooleanArray = select(moduleSym, "shrinkBooleanArray") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleArray</code> method definition. */ - private val shrinkDoubleArray = select(moduleSym, "shrinkDoubleArray") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringArray</code> method definition. */ - private val shrinkStringArray = select(moduleSym, "shrinkStringArray") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntSet</code> method definition. */ - private val shrinkIntSet = select(moduleSym, "shrinkIntSet") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanSet</code> method definition. */ - private val shrinkBooleanSet = select(moduleSym, "shrinkBooleanSet") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleSet</code> method definition. */ - private val shrinkDoubleSet = select(moduleSym, "shrinkDoubleSet") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringSet</code> method definition. */ - private val shrinkStringSet = select(moduleSym, "shrinkStringSet") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntOption</code> method definition. */ - private val shrinkIntOption = select(moduleSym, "shrinkIntOption") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanOption</code> method definition. */ - private val shrinkBooleanOption= select(moduleSym, "shrinkBooleanOption") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleOption</code> method definition. */ - private val shrinkDoubleOption = select(moduleSym, "shrinkDoubleOption") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringOption</code> method definition. */ - private val shrinkStringOption = select(moduleSym, "shrinkStringOption") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntTuple2</code> method definition. */ - private val shrinkIntTuple2 = select(moduleSym, "shrinkIntTuple2") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanTuple2</code> method definition. */ - private val shrinkBooleanTuple2= select(moduleSym, "shrinkBooleanTuple2") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleTuple2</code> method definition. */ - private val shrinkDoubleTuple2 = select(moduleSym, "shrinkDoubleTuple2") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringTuple2</code> method definition. */ - private val shrinkStringTuple2 = select(moduleSym, "shrinkStringTuple2") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntTuple3</code> method definition. */ - private val shrinkIntTuple3 = select(moduleSym, "shrinkIntTuple3") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanTuple3</code> method definition. */ - private val shrinkBooleanTuple3= select(moduleSym, "shrinkBooleanTuple3") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleTuple3</code> method definition. */ - private val shrinkDoubleTuple3 = select(moduleSym, "shrinkDoubleTuple3") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringTuple3</code> method definition. */ - private val shrinkStringTuple3 = select(moduleSym, "shrinkStringTuple3") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkIntTuple4</code> method definition. */ - private val shrinkIntTuple4 = select(moduleSym, "shrinkIntTuple4") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkBooleanTuple4</code> method definition. */ - private val shrinkBooleanTuple4= select(moduleSym, "shrinkBooleanTuple4") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkDoubleTuple4</code> method definition. */ - private val shrinkDoubleTuple4 = select(moduleSym, "shrinkDoubleTuple4") - /** Symbol for the <code>org.scalacheck.Shrink.shrinkStringTuple4</code> method definition. */ - private val shrinkStringTuple4 = select(moduleSym, "shrinkStringTuple4") - - /** Symbol for the <code>org.scalacheck.Shrink.shrinkAny</code> method definition. - * This is a generic shrinker which does not shrink whatever object is passed to it. - */ - private val shrinkAny = select(moduleSym, "shrinkAny") - - def shrinker(tpe: Type): Select = tpe2shrinker.getOrElse(tpe, shrinkAny) - - private val tpe2shrinker: Map[Type, Select] = { - import definitions._ - val SetClass: Symbol = definitions.getClass("scala.collection.immutable.Set") - - def apply(container: Type)(parametric: Type): Type = - appliedType(container, List(parametric)) - - def listOf(tpe: Type): Type = apply(ListClass.typeConstructor)(tpe) - def arrayOf(tpe: Type): Type = apply(ArrayClass.typeConstructor)(tpe) - def setOf(tpe: Type): Type = apply(SetClass.typeConstructor)(tpe) - def optionOf(tpe: Type): Type = apply(OptionClass.typeConstructor)(tpe) - def tupleOf(arity: Int, tpe: Type): Type = apply(TupleClass(arity).typeConstructor)(tpe) - - val IntListTpe = listOf(IntClass.typeConstructor) - val BooleanListTpe = listOf(BooleanClass.typeConstructor) - val DoubleListTpe = listOf(DoubleClass.typeConstructor) - val StringListTpe = listOf(StringClass.typeConstructor) - - val IntArrayTpe = arrayOf(IntClass.typeConstructor) - val BooleanArrayTpe = arrayOf(BooleanClass.typeConstructor) - val DoubleArrayTpe = arrayOf(DoubleClass.typeConstructor) - val StringArrayTpe = arrayOf(StringClass.typeConstructor) - - val IntSetTpe = setOf(IntClass.typeConstructor) - val BooleanSetTpe = setOf(BooleanClass.typeConstructor) - val DoubleSetTpe = setOf(DoubleClass.typeConstructor) - val StringSetTpe = setOf(StringClass.typeConstructor) - - val IntOptionTpe = optionOf(IntClass.typeConstructor) - val BooleanOptionTpe = optionOf(BooleanClass.typeConstructor) - val DoubleOptionTpe = optionOf(DoubleClass.typeConstructor) - val StringOptionTpe = optionOf(StringClass.typeConstructor) - - val IntTuple2Tpe = tupleOf(2, IntClass.typeConstructor) - val BooleanTuple2Tpe = tupleOf(2, BooleanClass.typeConstructor) - val DoubleTuple2Tpe = tupleOf(2, DoubleClass.typeConstructor) - val StringTuple2Tpe = tupleOf(2, StringClass.typeConstructor) - - val IntTuple3Tpe = tupleOf(3, IntClass.typeConstructor) - val BooleanTuple3Tpe = tupleOf(3, BooleanClass.typeConstructor) - val DoubleTuple3Tpe = tupleOf(3, DoubleClass.typeConstructor) - val StringTuple3Tpe = tupleOf(3, StringClass.typeConstructor) - - val IntTuple4Tpe = tupleOf(4, IntClass.typeConstructor) - val BooleanTuple4Tpe = tupleOf(4, BooleanClass.typeConstructor) - val DoubleTuple4Tpe = tupleOf(4, DoubleClass.typeConstructor) - val StringTuple4Tpe = tupleOf(4, StringClass.typeConstructor) - - Map( - IntClass.typeConstructor -> shrinkInt, - StringClass.typeConstructor -> shrinkString, - OptionClass.typeConstructor -> shrinkOption, - ListClass.typeConstructor -> shrinkList, - ArrayClass.typeConstructor -> shrinkArray, - SetClass.typeConstructor -> shrinkSet, - TupleClass(2).typeConstructor -> shrinkTuple2, - TupleClass(3).typeConstructor -> shrinkTuple3, - TupleClass(4).typeConstructor -> shrinkTuple4, - TupleClass(5).typeConstructor -> shrinkTuple5, - TupleClass(6).typeConstructor -> shrinkTuple6, - TupleClass(7).typeConstructor -> shrinkTuple7, - TupleClass(8).typeConstructor -> shrinkTuple8, - TupleClass(9).typeConstructor -> shrinkTuple9, - IntListTpe -> shrinkIntList, - BooleanListTpe -> shrinkBooleanList, - DoubleListTpe -> shrinkDoubleList, - StringListTpe -> shrinkStringList, - IntArrayTpe -> shrinkIntArray, - BooleanArrayTpe -> shrinkBooleanArray, - DoubleArrayTpe -> shrinkDoubleArray, - StringArrayTpe -> shrinkStringArray, - IntSetTpe -> shrinkIntSet, - BooleanSetTpe -> shrinkBooleanSet, - DoubleSetTpe -> shrinkDoubleSet, - StringSetTpe -> shrinkStringSet, - IntOptionTpe -> shrinkIntOption, - BooleanOptionTpe -> shrinkBooleanOption, - DoubleOptionTpe -> shrinkDoubleOption, - StringOptionTpe -> shrinkStringOption, - IntTuple2Tpe -> shrinkIntTuple2, - BooleanTuple2Tpe -> shrinkBooleanTuple2, - DoubleTuple2Tpe -> shrinkDoubleTuple2, - StringTuple2Tpe -> shrinkStringTuple2, - IntTuple3Tpe -> shrinkIntTuple3, - BooleanTuple3Tpe -> shrinkBooleanTuple3, - DoubleTuple3Tpe -> shrinkDoubleTuple3, - StringTuple3Tpe -> shrinkStringTuple3, - IntTuple4Tpe -> shrinkIntTuple4, - BooleanTuple4Tpe -> shrinkBooleanTuple4, - DoubleTuple4Tpe -> shrinkDoubleTuple4, - StringTuple4Tpe -> shrinkStringTuple4 - ) - } - } - - - object ConsoleReporter extends GenericScalaCheckModule { - /** Symbol for the <code>org.scalacheck.ConsoleReporter</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.ConsoleReporter") - - def testStatsEx(testRes: Tree): Tree = testStatsEx("", testRes) - - def testStatsEx(msg: String, testRes: Tree): Tree = - Apply(select(moduleSym, "testStatsEx"), List(Literal(msg), testRes)) - } - - object Test extends GenericScalaCheckModule { - /** Symbol for the <code>org.scalacheck.Test</code> module definition. */ - override protected lazy val moduleSym = definitions.getModule("org.scalacheck.Test") - - def check(prop: Tree): Tree = moduleApply("check", prop) - - def isPassed(res: Tree): Tree = Select(res, "passed") - } - -} diff --git a/src/funcheck/scalacheck/ScalaCheckIntegrator.scala b/src/funcheck/scalacheck/ScalaCheckIntegrator.scala deleted file mode 100644 index c212589ad..000000000 --- a/src/funcheck/scalacheck/ScalaCheckIntegrator.scala +++ /dev/null @@ -1,31 +0,0 @@ -package funcheck.scalacheck - -import scala.tools.nsc.{Global, SubComponent} - - -trait ScalaCheckIntegrator extends ScalaCheck - with FilterGeneratorAnnotations - with GeneratorDefDefInjector - with ForAllTransformer -{ - val global: Global - import global._ - - - def createGeneratorDefDefs(unit: CompilationUnit): (List[DefDef], List[DefDef]) = { - val filteredGenTree = new FilterTreeTraverser(filterTreesWithGeneratorAnnotation(unit)) - filteredGenTree.traverse(unit.body) - - val klasses = collection.mutable.Set.empty[ClassDef] - val defs = collection.mutable.Set.empty[DefDef] - - for {tree <- filteredGenTree.hits} tree match { - case c: ClassDef => klasses + c - case d: DefDef => defs + d - } - - (Gen.createGenDefDef(klasses.toList,defs.toList), Arbitrary.getArbitraryDefDefs) - } - - -} diff --git a/src/funcheck/util/FreshNameCreator.scala b/src/funcheck/util/FreshNameCreator.scala deleted file mode 100644 index 3e51a5e42..000000000 --- a/src/funcheck/util/FreshNameCreator.scala +++ /dev/null @@ -1,5 +0,0 @@ -package funcheck.util - -trait FreshNameCreator { - var fresh: scala.tools.nsc.util.FreshNameCreator -} diff --git a/src/scala/collection/Multiset.scala b/src/scala/collection/Multiset.scala deleted file mode 100644 index 23c6255bb..000000000 --- a/src/scala/collection/Multiset.scala +++ /dev/null @@ -1,81 +0,0 @@ -package scala.collection - - -trait Multiset[A] extends (A => Int) with Collection[A]{ - - /** Returns the number of elements in this multiset. - * - * @return number of multiset elements. - */ - def size: Int - - /** This method allows multisets to be interpreted as predicates. - * It returns <code>0</code>, iff this multiset does not contain - * element <code>elem</code>, or <code>N</code> where <code>N</code> - * is the number of occurences of <code>elem</code> in this multiset. - * - * @param elem the element to check for membership. - * @return <code>0</code> iff <code>elem</code> is not contained in - * this multiset, or <code>N</code> where <code>N</code> - * is the number of occurences of <code>elem</code> in this - * multiset. - */ - def apply(elem: A): Int - - /** Checks if this set contains element <code>elem</code>. - * - * @param elem the element to check for membership. - * @return <code>true</code> iff <code>elem</code> is not contained in - * this multiset. - */ - def contains(elem: A): Boolean = apply(elem) > 0 - - /** Checks if this multiset is empty. - * - * @return <code>true</code> iff there is no element in the multiset. - */ - override def isEmpty: Boolean = size == 0 - - /** Checks if this multiset is a subset of set <code>that</code>. - * - * @param that another multiset. - * @return <code>true</code> iff the other multiset is a superset of - * this multiset. - * todo: rename to isSubsetOf - */ - def subsetOf(that: Multiset[A]): Boolean = - forall(e => this(e) <= that(e)) - - /** - * This method is an alias for <code>intersect</code>. It computes an - * intersection with set that. It removes all the elements - * <code>that</code> are not present in that. - */ - def ** (that: Multiset[A]): Multiset[A] - - /** @return this multiset as set. */ - def asSet: Set[A] - - - //structural equality - /** Compares this multiset with another object and returns true, iff the - * other object is also a multiset which contains the same elements as - * this multiset, with the same cardinality. - * - * @param that the other object - * @note not necessarily run-time type safe. - * @return <code>true</code> iff this multiset and the other multiset - * contain the same elements, with same cardinality. - */ - override def equals(that: Any): Boolean = that match { - case other: Multiset[_] => other.size == this.size && subsetOf(other.asInstanceOf[Multiset[A]]) - case _ => false - } - - /** Defines the prefix of this object's <code>toString</code> representation. - */ - override protected def stringPrefix : String = "Multiset" - - - override def toString = elements.mkString(stringPrefix + "(", ", ", ")") -} diff --git a/src/scala/collection/immutable/EmptyMultiset.scala b/src/scala/collection/immutable/EmptyMultiset.scala deleted file mode 100644 index c688a80f3..000000000 --- a/src/scala/collection/immutable/EmptyMultiset.scala +++ /dev/null @@ -1,24 +0,0 @@ -package scala.collection.immutable - -class EmptyMultiset[A] extends Multiset[A] with Helper[A]{ - - def empty[C]: Multiset[C] = new EmptyMultiset[C] - - override def size: Int = 0 - - override def apply(elem: A): Int = 0 - - override def contains(elem: A): Boolean = false - - override def intersect (that: collection.Multiset[A]): Multiset[A] = empty - - override def ++ (elems: Iterable[A]): Multiset[A] = iterable2multiset(elems) - - override def +++ (elems: Iterable[A]): Multiset[A] = this ++ elems - - override def --(elems: Iterable[A]): Multiset[A] = empty - - override def elements: Iterator[A] = Iterator.empty - - override def asSet: Set[A] = new EmptySet[A] -} diff --git a/src/scala/collection/immutable/HashMultiset.scala b/src/scala/collection/immutable/HashMultiset.scala deleted file mode 100644 index ac53f9359..000000000 --- a/src/scala/collection/immutable/HashMultiset.scala +++ /dev/null @@ -1,79 +0,0 @@ -package scala.collection.immutable - -object HashMultiset { - - /** The empty multiset of this type. */ - def empty[A]: Multiset[A] = new EmptyMultiset[A] - - /** The canonical factory for this type */ - def apply[A](elems: A*) = empty[A] ++ elems -} - -class HashMultiset[A] private[immutable] (private val map: Map[A,Int]) extends Multiset[A] with Helper[A] { - - def empty[C]: Multiset[C] = new EmptyMultiset[C] - - override def size: Int = map.values.foldLeft(0)((a,b) => a+b) - - override def apply(elem: A): Int = map.getOrElse(elem,0) - - override def intersect (that: collection.Multiset[A]): Multiset[A] = { - def inner(entries: List[A], result: Map[A,Int]): Map[A,Int] = entries match { - case Nil => result - case elem :: rest => inner(rest, result.update(elem, min(this(elem),that(elem)))) - } - - new HashMultiset[A](inner(asSet.toList,new HashMap[A,Int].empty)) - } - - - override def ++ (elems: Iterable[A]): Multiset[A] = { - val that = iterable2multiset(elems) - - def inner(entries: List[A], result: Map[A,Int]): Map[A,Int] = entries match { - case Nil => result - case elem :: rest => - inner(rest, result.update(elem,max(result.getOrElse(elem,0),that(elem)))) - } - - new HashMultiset[A](inner(that.asSet.toList, map)) - } - - - override def +++ (elems: Iterable[A]): Multiset[A] = { - def inner(entries: List[A], result: Map[A,Int]): Map[A,Int] = entries match { - case Nil => result - case elem :: rest => - inner(rest, result.update(elem,result.getOrElse(elem,0)+1)) - } - - new HashMultiset[A](inner(elems.toList,map)) - } - - override def --(elems: Iterable[A]): Multiset[A] = { - val that = iterable2multiset(elems) - def inner(entries: List[A], result: Map[A,Int]): Map[A,Int] = entries match { - case Nil => result - case elem :: rest => - val diff = result.getOrElse(elem,0) - that(elem) - if(diff > 0) - inner(rest, result.update(elem,diff)) - else - inner(rest, result - elem) - } - - new HashMultiset[A](inner(that.asSet.toList,map)) - } - - override def elements: Iterator[A] = { - def inner(entries: List[A], result: List[A]): List[A] = entries match { - case Nil => result - case elem :: rest => - inner(rest, result ::: int2list(elem, this(elem))) - } - - inner(map.keys.toList, Nil).elements - } - - override def asSet: Set[A] = Set.empty[A] ++ map.keys -} diff --git a/src/scala/collection/immutable/Helper.scala b/src/scala/collection/immutable/Helper.scala deleted file mode 100644 index 100c97725..000000000 --- a/src/scala/collection/immutable/Helper.scala +++ /dev/null @@ -1,24 +0,0 @@ -package scala.collection.immutable - -private[immutable] trait Helper[A] { - - protected def int2list[C](elem: C, times: Int): List[C] = { - require(times >= 0) - if(times == 0) - Nil - else - elem :: int2list(elem,times-1) - } ensuring (res => res.size == times) - - protected def iterable2multiset(elems: Iterable[A]): Multiset[A] = { - def inner(elems: List[A], result: Map[A,Int]): Map[A,Int] = elems match { - case Nil => result - case elem :: tail => inner(tail, result.update(elem, result.getOrElse(elem,0) + 1)) - } - new HashMultiset[A](inner(elems.toList,new scala.collection.immutable.HashMap[A,Int].empty)) - } - - protected def min(a: Int, b: Int): Int = if(a <= b) a else b - protected def max(a: Int, b: Int): Int = if(a < b) b else a - -} diff --git a/src/scala/collection/immutable/Multiset.scala b/src/scala/collection/immutable/Multiset.scala deleted file mode 100644 index 6a4c89d85..000000000 --- a/src/scala/collection/immutable/Multiset.scala +++ /dev/null @@ -1,43 +0,0 @@ -package scala.collection.immutable - - -object Multiset { - /** The empty set of this type */ - def empty[A]: Multiset[A] = new EmptyMultiset[A] - - /** The canonical factory for this type */ - def apply[A](elems: A*): Multiset[A] = empty[A] +++ elems - -} - -trait Multiset[A] extends AnyRef with collection.Multiset[A]{ - - /** This method is an alias for <code>intersect</code>. - * It computes an intersection with multiset <code>that</code>. - * It removes all the elements that are not present in <code>that</code>. - * - * @param that the multiset to intersect with - */ - final override def ** (that: collection.Multiset[A]): Multiset[A] = intersect(that) - - /** - * This method computes an intersection with multiset that. It removes all - * the elements that are not present in that. - */ - def intersect (that: collection.Multiset[A]): Multiset[A] - - // A U elems (max) - def ++ (elems: Iterable[A]): Multiset[A] - - // A U elems (sum) - def +++ (elems: Iterable[A]): Multiset[A] - - // A \ {elems} - def --(elems: Iterable[A]): Multiset[A] - - // A U {elems} - final def + (elems: A*): Multiset[A] = this ++ elems - - // A \ {elems} - final def - (elems: A*): Multiset[A] = this -- elems -} -- GitLab