diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala index 37f233b741c937e90b19babf8ef13b6b8d2c176f..bee85f77dd6e619de01ed97ca5f09f1de813b0ca 100644 --- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala +++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala @@ -32,13 +32,12 @@ trait ASTExtractors { protected lazy val optionClassSym = classFromName("scala.Option") protected lazy val arraySym = classFromName("scala.Array") protected lazy val someClassSym = classFromName("scala.Some") - protected lazy val function1TraitSym = classFromName("scala.Function1") - protected lazy val function2TraitSym = classFromName("scala.Function2") - protected lazy val function3TraitSym = classFromName("scala.Function3") - protected lazy val function4TraitSym = classFromName("scala.Function4") - protected lazy val function5TraitSym = classFromName("scala.Function5") protected lazy val byNameSym = classFromName("scala.<byname>") protected lazy val bigIntSym = classFromName("scala.math.BigInt") + protected def functionTraitSym(i:Int) = { + require(1 <= i && i <= 22) + classFromName("scala.Function" + i) + } def isTuple2(sym : Symbol) : Boolean = sym == tuple2Sym def isTuple3(sym : Symbol) : Boolean = sym == tuple3Sym @@ -82,11 +81,8 @@ trait ASTExtractors { sym == optionClassSym || sym == someClassSym } - def isFunction1(sym : Symbol) : Boolean = sym == function1TraitSym - def isFunction2(sym : Symbol) : Boolean = sym == function2TraitSym - def isFunction3(sym : Symbol) : Boolean = sym == function3TraitSym - def isFunction4(sym : Symbol) : Boolean = sym == function4TraitSym - def isFunction5(sym : Symbol) : Boolean = sym == function5TraitSym + def isFunction(sym : Symbol, i: Int) : Boolean = + 1 <= i && i <= 22 && sym == functionTraitSym(i) protected lazy val multisetTraitSym = try { classFromName("scala.collection.immutable.Multiset") diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index 101e572ee83f3d41c1978e385730e98453615e2b..362b225ce37d041255d867407f9eab159fbeca60 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -1849,20 +1849,11 @@ trait CodeExtraction extends ASTExtractors { case TypeRef(_, sym, btt :: Nil) if isArrayClassSym(sym) => ArrayType(extractType(btt)) - case TypeRef(_, sym, List(f1,to)) if isFunction1(sym) => - FunctionType(Seq(extractType(f1)), extractType(to)) - - case TypeRef(_, sym, List(f1,f2,to)) if isFunction2(sym) => - FunctionType(Seq(extractType(f1),extractType(f2)), extractType(to)) - - case TypeRef(_, sym, List(f1,f2,f3,to)) if isFunction3(sym) => - FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3)), extractType(to)) - - case TypeRef(_, sym, List(f1,f2,f3,f4,to)) if isFunction4(sym) => - FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3),extractType(f4)), extractType(to)) - - case TypeRef(_, sym, List(f1,f2,f3,f4,f5,to)) if isFunction5(sym) => - FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3),extractType(f4),extractType(f5)), extractType(to)) + // TODO: What about Function0? + case TypeRef(_, sym, subs) if subs.size > 1 && isFunction(sym, subs.size - 1) => + val from = subs.init + val to = subs.last + FunctionType(from map extractType, extractType(to)) case TypeRef(_, sym, tps) if isByNameSym(sym) => extractType(tps.head)