aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
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/Typer.scala
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/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala14
1 files changed, 6 insertions, 8 deletions
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)