diff options
author | Martin Odersky <odersky@gmail.com> | 2017-02-27 09:34:57 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2017-02-28 19:34:42 +0100 |
commit | c3a90a4a9a9827d199ec436fcfda7c5447731542 (patch) | |
tree | afd58a3d48660387ef3e976e731f7b5d2d15697c /compiler/src/dotty/tools/dotc/typer/ProtoTypes.scala | |
parent | e4775b87c2b5e8f55bb32da9160cd37322a18f2c (diff) | |
download | dotty-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.scala | 28 |
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 } |