aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-02-27 09:34:57 +0100
committerMartin Odersky <odersky@gmail.com>2017-02-28 19:34:42 +0100
commitc3a90a4a9a9827d199ec436fcfda7c5447731542 (patch)
treeafd58a3d48660387ef3e976e731f7b5d2d15697c /compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala
parente4775b87c2b5e8f55bb32da9160cd37322a18f2c (diff)
downloaddotty-c3a90a4a9a9827d199ec436fcfda7c5447731542.tar.gz
dotty-c3a90a4a9a9827d199ec436fcfda7c5447731542.tar.bz2
dotty-c3a90a4a9a9827d199ec436fcfda7c5447731542.zip
Systematic treatment of result types of dependent methods
We approximate dependencies to parameters by Wildcards. This was already done in one place, is now done in other places as well, instead of doing nothing for dependent methods.
Diffstat (limited to 'compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala28
1 files changed, 12 insertions, 16 deletions
diff --git a/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala b/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala
index 48f79d147..4d88fc4f5 100644
--- a/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala
+++ b/compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala
@@ -57,7 +57,7 @@ object ProtoTypes {
case pt: FunProto =>
mt match {
case mt: MethodType =>
- mt.isDependent || constrainResult(mt.resultType, pt.resultType)
+ constrainResult(mt.resultTypeApprox, pt.resultType)
case _ =>
true
}
@@ -408,22 +408,18 @@ object ProtoTypes {
tp.widenSingleton match {
case poly: PolyType => normalize(constrained(poly).resultType, pt)
case mt: MethodType =>
- if (mt.isImplicit)
- if (mt.isDependent)
- mt.resultType.substParams(mt, mt.paramTypes.map(Function.const(WildcardType)))
- else mt.resultType
- else
- if (mt.isDependent) tp
- else {
- val rt = normalize(mt.resultType, pt)
- pt match {
- case pt: IgnoredProto => mt
- case pt: ApplyingProto => mt.derivedMethodType(mt.paramNames, mt.paramTypes, rt)
- case _ =>
- val ft = defn.FunctionOf(mt.paramTypes, rt)
- if (mt.paramTypes.nonEmpty || ft <:< pt) ft else rt
- }
+ if (mt.isImplicit) mt.resultTypeApprox
+ else if (mt.isDependent) tp
+ else {
+ val rt = normalize(mt.resultType, pt)
+ pt match {
+ case pt: IgnoredProto => mt
+ case pt: ApplyingProto => mt.derivedMethodType(mt.paramNames, mt.paramTypes, rt)
+ case _ =>
+ val ft = defn.FunctionOf(mt.paramTypes, rt)
+ if (mt.paramTypes.nonEmpty || ft <:< pt) ft else rt
}
+ }
case et: ExprType => et.resultType
case _ => tp
}