summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2013-06-12 04:50:00 -0400
committerPaul Phillips <paulp@improving.org>2013-06-13 08:49:21 -0400
commitede32ba3421be657a4369b847e60d5fb2b9def14 (patch)
tree27245ef1a38020a173e9a816f5087246ffa63ddb /src
parentf790662a3eab1e8efce5d4096d0efbae96cf45b4 (diff)
downloadscala-ede32ba3421be657a4369b847e60d5fb2b9def14.tar.gz
scala-ede32ba3421be657a4369b847e60d5fb2b9def14.tar.bz2
scala-ede32ba3421be657a4369b847e60d5fb2b9def14.zip
SI-6221 inference with Function1 subtypes.
There appears to be no upper bound on the number of places we have to remove calls to typeSymbol and introduce calls to baseType. This one was type inference for function parameter types: worked when expected type was A => B, but not if there was an implicit conversion from A => B to the expected type.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala17
1 files changed, 6 insertions, 11 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 8d422f415d..efd258a577 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -2794,16 +2794,11 @@ trait Typers extends Adaptations with Tags {
if (numVparams > definitions.MaxFunctionArity)
return MaxFunctionArityError(fun)
- def decompose(pt: Type): (Symbol, List[Type], Type) =
- if ((isFunctionType(pt) || (pt.typeSymbol == PartialFunctionClass && numVparams == 1 && fun.body.isInstanceOf[Match])) && // see bug901 for a reason why next conditions are needed
- ( pt.dealiasWiden.typeArgs.length - 1 == numVparams
- || fun.vparams.exists(_.tpt.isEmpty)
- ))
- (pt.typeSymbol, pt.dealiasWiden.typeArgs.init, pt.dealiasWiden.typeArgs.last)
- else
- (FunctionClass(numVparams), fun.vparams map (x => NoType), WildcardType)
-
- val (clazz, argpts, respt) = decompose(pt)
+ val FunctionSymbol = FunctionClass(numVparams)
+ val (argpts, respt) = pt baseType FunctionSymbol match {
+ case TypeRef(_, FunctionSymbol, args :+ res) => (args, res)
+ case _ => (fun.vparams map (_ => NoType), WildcardType)
+ }
if (argpts.lengthCompare(numVparams) != 0)
WrongNumberOfParametersError(fun, argpts)
else {
@@ -2853,7 +2848,7 @@ trait Typers extends Adaptations with Tags {
val formals = vparamSyms map (_.tpe)
val body1 = typed(fun.body, respt)
val restpe = packedType(body1, fun.symbol).deconst.resultType
- val funtpe = appliedType(clazz, formals :+ restpe: _*)
+ val funtpe = appliedType(FunctionSymbol, formals :+ restpe: _*)
treeCopy.Function(fun, vparams, body1) setType funtpe
}