diff options
author | Martin Odersky <odersky@gmail.com> | 2016-08-24 15:07:14 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2016-08-26 11:13:17 +0200 |
commit | 55ad7ebb5960ed7590610c777cce229f7241c0d3 (patch) | |
tree | ae2582bd26d7f97fa8cefd89e858a4808afc31f7 | |
parent | bdb425c57128c85fc3f7bd03b1906f55805d2194 (diff) | |
download | dotty-55ad7ebb5960ed7590610c777cce229f7241c0d3.tar.gz dotty-55ad7ebb5960ed7590610c777cce229f7241c0d3.tar.bz2 dotty-55ad7ebb5960ed7590610c777cce229f7241c0d3.zip |
Make inherited inferred result type work for dependent methods
We did not properly rename parameter references before.
-rw-r--r-- | src/dotty/tools/dotc/typer/Namer.scala | 27 | ||||
-rw-r--r-- | tests/pos/t7668.scala (renamed from tests/pending/pos/t7668.scala) | 2 |
2 files changed, 18 insertions, 11 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala index 3c0a45e94..d90f37860 100644 --- a/src/dotty/tools/dotc/typer/Namer.scala +++ b/src/dotty/tools/dotc/typer/Namer.scala @@ -726,7 +726,7 @@ class Namer { typer: Typer => // the parent types are elaborated. index(constr) symbolOfTree(constr).ensureCompleted() - + index(rest)(inClassContext(selfInfo)) val tparamAccessors = decls.filter(_ is TypeParamAccessor).toList @@ -807,20 +807,27 @@ class Namer { typer: Typer => lazy val schema = paramFn(WildcardType) val site = sym.owner.thisType ((NoType: Type) /: sym.owner.info.baseClasses.tail) { (tp, cls) => - val iRawInfo = - cls.info.nonPrivateDecl(sym.name).matchingDenotation(site, schema).info - val iInstInfo = iRawInfo match { - case iRawInfo: PolyType => - if (iRawInfo.paramNames.length == typeParams.length) - iRawInfo.instantiate(typeParams map (_.typeRef)) + def instantiatedResType(info: Type, tparams: List[Symbol], paramss: List[List[Symbol]]): Type = info match { + case info: PolyType => + if (info.paramNames.length == typeParams.length) + instantiatedResType(info.instantiate(tparams.map(_.typeRef)), Nil, paramss) else NoType + case info: MethodType => + paramss match { + case params :: paramss1 if info.paramNames.length == params.length => + instantiatedResType(info.instantiate(params.map(_.termRef)), tparams, paramss1) + case _ => + NoType + } case _ => - if (typeParams.isEmpty) iRawInfo + if (tparams.isEmpty && paramss.isEmpty) info.widenExpr else NoType } - val iResType = iInstInfo.finalResultType.asSeenFrom(site, cls) + val iRawInfo = + cls.info.nonPrivateDecl(sym.name).matchingDenotation(site, schema).info + val iResType = instantiatedResType(iRawInfo, typeParams, paramss).asSeenFrom(site, cls) if (iResType.exists) - typr.println(i"using inherited type for ${mdef.name}; raw: $iRawInfo, inst: $iInstInfo, inherited: $iResType") + typr.println(i"using inherited type for ${mdef.name}; raw: $iRawInfo, inherited: $iResType") tp & iResType } } diff --git a/tests/pending/pos/t7668.scala b/tests/pos/t7668.scala index 222a13d03..6657ffab6 100644 --- a/tests/pending/pos/t7668.scala +++ b/tests/pos/t7668.scala @@ -8,5 +8,5 @@ trait Extractor { } class Sub extends Extractor { - def extract(s: Space) = s.x + def extract(ss: Space) = ss.x } |