diff --git a/src/funcheck/scalacheck/ForAllTransformer.scala b/src/funcheck/scalacheck/ForAllTransformer.scala index ba86964fa857e7763f29a431106303415def7f77..0c51bb91a4eb670e96b3de4f5da13ec186f3ae4d 100644 --- a/src/funcheck/scalacheck/ForAllTransformer.scala +++ b/src/funcheck/scalacheck/ForAllTransformer.scala @@ -33,101 +33,98 @@ trait ForAllTransformer extends TypingTransformers // println(lhs.symbol + " and "+lhs.symbol.tpe) // tree - case Apply(TypeApply(s: Select, partpes), rhs @ List(f @ Function(vparams,body))) if isForall(s) => + case Apply(TypeApply(s: Select, _), rhs @ List(f @ Function(vparams,body))) if isForall(s) => 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 - partpes.head.tpe match { - case tpe @ TypeRef(_,_,ptpes) => - vtpt.tpe match { - case TypeRef(_,value,vtpes) => - var fun: Function = { - if(vtpes.size <= 1) { - f - } else { + vtpt.tpe match { + case tpe @ TypeRef(_,value,vtpes) => + var fun: Function = { + if(vtpes.size <= 1) { + f + } else { + // create a fresh name for each parameter declared parametric type + val freshNames = vtpes.map(i => fresh.newName("v")) - // create a fresh name for each parameter declared parametric type - val freshNames = vtpes.map(i => fresh.newName("v")) + val funSym = tree.symbol - 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 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) + val from = Select(v, v.symbol.tpe.decl("_"+(i+1))) + val to = ValDef(toSym, EmptyTree) setPos (tree.pos) - (from, to) - } + (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] + 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 - } - } + new ChangeOwnerTraverser(funSym, fun.symbol).traverse(fun); + new ForeachTreeTraverser({t: Tree => t setPos tree.pos}).traverse(fun) + fun + } + } + - val prop = Prop.forAll(List(fun)) + val prop = Prop.forAll(List(fun)) - var buf = new collection.mutable.ListBuffer[Tree]() + var buf = new collection.mutable.ListBuffer[Tree]() - val blockValSym = newSyntheticValueParam(fun.symbol, definitions.BooleanClass.typeConstructor) + 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] + 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) + new ChangeOwnerTraverser(fun.symbol, fun2.symbol).traverse(fun2); + new ForeachTreeTraverser({t: Tree => t setPos tree.pos}).traverse(fun2) - buf += Block(Nil,fun2) - - if(vtpes.isEmpty) { - buf += resetAttrs(Arbitrary.arbitrary(value.tpe)) - buf += resetAttrs(Shrink.shrinker(value.tpe)) - } else { - for {tpe <- vtpes} { - buf += resetAttrs(Arbitrary.arbitrary(tpe)) - buf += resetAttrs(Shrink.shrinker(tpe)) - } - } + 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 + import posAssigner.atPos // for filling in tree positions - val property = localTyper.typed { - atPos(tree.pos) { - Apply(prop, buf.toList) - } - } + val property = localTyper.typed { + atPos(tree.pos) { + Apply(prop, buf.toList) + } + } - localTyper.typed { - atPos(tree.pos) { - ConsoleReporter.testStatsEx(Test.check(property)) - } - } - - case t => - assert(false, "expected ValDef of type TypeRef, found "+t) - tree + localTyper.typed { + atPos(tree.pos) { + ConsoleReporter.testStatsEx(Test.check(property)) } - - case t => tree - } + } + + case t => + assert(false, "expected ValDef of type TypeRef, found "+t) + tree } + } /** Delegates the recursive traversal of the tree. */ case _ => super.transform(tree)