aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-08-24 15:07:14 +0200
committerMartin Odersky <odersky@gmail.com>2016-08-26 11:13:17 +0200
commit55ad7ebb5960ed7590610c777cce229f7241c0d3 (patch)
treeae2582bd26d7f97fa8cefd89e858a4808afc31f7
parentbdb425c57128c85fc3f7bd03b1906f55805d2194 (diff)
downloaddotty-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.scala27
-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
}