aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-10-24 20:09:30 +0200
committerMartin Odersky <odersky@gmail.com>2013-10-24 21:21:04 +0200
commite8a160c8c64354b12423b908067a1ba328d6248f (patch)
treeec500dc68c0309eb5522b17d919fd70a40344d68 /src/dotty/tools/dotc/typer
parentaddd4a645c0b3adb898c74cb9b1197bb04597467 (diff)
downloaddotty-e8a160c8c64354b12423b908067a1ba328d6248f.tar.gz
dotty-e8a160c8c64354b12423b908067a1ba328d6248f.tar.bz2
dotty-e8a160c8c64354b12423b908067a1ba328d6248f.zip
Fixed problem in handing of self types.
Self types were not taken into account when doing a typedIdent. The fix in typedIdent caused as CyclicReference when typing the self type itself. This in turn is fixed by distinguishing more carefully in denotNamed in Namer which context we are in.
Diffstat (limited to 'src/dotty/tools/dotc/typer')
-rw-r--r--src/dotty/tools/dotc/typer/Applications.scala8
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala11
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala14
3 files changed, 18 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/typer/Applications.scala b/src/dotty/tools/dotc/typer/Applications.scala
index 648713571..0abaa17fe 100644
--- a/src/dotty/tools/dotc/typer/Applications.scala
+++ b/src/dotty/tools/dotc/typer/Applications.scala
@@ -204,10 +204,10 @@ trait Applications extends Compatibility { self: Typer =>
def findDefault(cx: Context): Type = {
if (cx eq NoContext) NoType
else if (cx.scope != cx.outer.scope &&
- cx.denotsNamed(methRef.name)
- .filterWithPredicate(_.symbol == meth).exists) {
- val denot = cx.denotsNamed(getterName).toDenot(NoPrefix)
- NamedType(NoPrefix, getterName).withDenot(denot)
+ cx.denotNamed(methRef.name).hasAltWith(_.symbol == meth)) {
+ val denot = cx.denotNamed(getterName)
+ assert(denot.exists)
+ NamedType(cx.owner.thisType, getterName).withDenot(denot)
} else findDefault(cx.outer)
}
findDefault(ctx)
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala
index 79b1750dc..fb2aef90d 100644
--- a/src/dotty/tools/dotc/typer/Namer.scala
+++ b/src/dotty/tools/dotc/typer/Namer.scala
@@ -26,9 +26,14 @@ trait NamerContextOps { this: Context =>
sym
}
- def denotsNamed(name: Name): PreDenotation =
- if (owner.isClass) owner.asClass.membersNamed(name)
- else scope.denotsNamed(name)
+ def denotNamed(name: Name): Denotation =
+ if (owner.isClass)
+ if (outer.owner == owner)
+ owner.thisType.member(name)
+ else // we are in the outermost context belonging to a class; self is invisible here. See inClassContext.
+ owner.findMember(name, owner.thisType, EmptyFlags)
+ else
+ scope.denotsNamed(name).toDenot(NoPrefix)
def effectiveScope =
if (owner != null && owner.isClass) owner.asClass.decls
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index bb3e1052a..a22d128e3 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -269,8 +269,8 @@ class Typer extends Namer with Applications with Implicits {
/** Is (some alternative of) the given predenotation `denot`
* defined in current compilation unit?
*/
- def isDefinedInCurrentUnit(denot: PreDenotation): Boolean = denot match {
- case DenotUnion(d1, d2) => isDefinedInCurrentUnit(d1) || isDefinedInCurrentUnit(d2)
+ def isDefinedInCurrentUnit(denot: Denotation): Boolean = denot match {
+ case MultiDenotation(d1, d2) => isDefinedInCurrentUnit(d1) || isDefinedInCurrentUnit(d2)
case denot: SingleDenotation => denot.symbol.sourceFile == ctx.source
}
@@ -279,13 +279,11 @@ class Typer extends Namer with Applications with Implicits {
else {
val outer = ctx.outer
if ((ctx.scope ne outer.scope) || (ctx.owner ne outer.owner)) {
- val defDenots = ctx.denotsNamed(name)
- if (defDenots.exists) {
+ val defDenot = ctx.denotNamed(name)
+ if (defDenot.exists) {
val curOwner = ctx.owner
- val pre = curOwner.thisType
- val defDenot = defDenots toDenot pre
- val found = NamedType(pre, name) withDenot defDenot
- if (!(curOwner is Package) || (defDenot.symbol is Package) || isDefinedInCurrentUnit(defDenots))
+ val found = NamedType(curOwner.thisType, name) withDenot defDenot
+ if (!(curOwner is Package) || (defDenot.symbol is Package) || isDefinedInCurrentUnit(defDenot))
return checkNewOrShadowed(found, definition) // no need to go further out, we found highest prec entry
else if (prevPrec < packageClause)
return findRef(found, packageClause, ctx)(outer)