aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Namer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-08-14 16:07:59 +0200
committerMartin Odersky <odersky@gmail.com>2013-08-14 16:07:59 +0200
commitf19250b1a123aa63cf8f14096bfd8e29e7e548b2 (patch)
treea676a2d5c8e3dc494c4736c9d1454294b9b10341 /src/dotty/tools/dotc/typer/Namer.scala
parentc6f0c00790c996bea57ea905a830dedcb4f2bb44 (diff)
downloaddotty-f19250b1a123aa63cf8f14096bfd8e29e7e548b2.tar.gz
dotty-f19250b1a123aa63cf8f14096bfd8e29e7e548b2.tar.bz2
dotty-f19250b1a123aa63cf8f14096bfd8e29e7e548b2.zip
Integrated parser/typer into compiler
Some initial bug fixes. Added -explaintypes diagnostics.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Namer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Namer.scala20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/dotty/tools/dotc/typer/Namer.scala b/src/dotty/tools/dotc/typer/Namer.scala
index 716de5f3c..1d679c070 100644
--- a/src/dotty/tools/dotc/typer/Namer.scala
+++ b/src/dotty/tools/dotc/typer/Namer.scala
@@ -7,6 +7,7 @@ import ast._
import Trees._, Constants._, StdNames._, Scopes._, Denotations._
import Contexts._, Symbols._, Types._, SymDenotations._, Names._, NameOps._, Flags._, Decorators._
import ast.desugar, ast.desugar._
+import Typer.AnySelectionProto
import util.Positions._
import util.SourcePosition
import collection.mutable
@@ -126,6 +127,17 @@ class Namer { typer: Typer =>
sym
}
+ /** All PackageClassInfoTypes come from here. */
+ private def createPackageSymbol(pid: RefTree)(implicit ctx: Context): Symbol = {
+ val pkgOwner = pid match {
+ case Ident(_) => if (ctx.owner eq defn.EmptyPackageClass) defn.RootClass else ctx.owner
+ case Select(qual: RefTree, _) => createPackageSymbol(qual).moduleClass
+ }
+ val existing = pkgOwner.info.decls.lookup(pid.name)
+ if ((existing is Package) && (pkgOwner eq existing.owner)) existing
+ else println(s"entering new ${pid.name} in ${pkgOwner.show}")
+ }
+
/** The expansion of a member def */
def expansion(mdef: MemberDef)(implicit ctx: Context): Tree = {
val expanded = desugar.memberDef(mdef)
@@ -147,6 +159,10 @@ class Namer { typer: Typer =>
/** Enter statement */
def enterSym(stat: Tree)(implicit ctx: Context): Context = stat match {
+ case pcl: PackageDef =>
+ val pkg = createPackageSymbol(pcl.pid)
+ enterSyms(pcl.stats)(ctx.fresh.withOwner(pkg.moduleClass))
+ ctx
case imp: Import =>
importContext(createSymbol(imp), imp.selectors)
case mdef: MemberDef =>
@@ -161,7 +177,7 @@ class Namer { typer: Typer =>
def enterSyms(stats: List[Tree])(implicit ctx: Context): Context = {
@tailrec def traverse(stats: List[Tree])(implicit ctx: Context): Context = stats match {
case stat :: stats1 =>
- traverse(stats)(enterSym(stat))
+ traverse(stats1)(enterSym(stat))
case nil =>
ctx
}
@@ -210,7 +226,7 @@ class Namer { typer: Typer =>
if (tree.isClassDef) classDefSig(tree, sym.asClass)(localContext)
else typeDefSig(tree, sym)(localContext.withNewScope)
case imp: Import =>
- val expr1 = typedAheadExpr(imp.expr)
+ val expr1 = typedAheadExpr(imp.expr, AnySelectionProto)
ImportType(tpd.SharedTree(expr1))
}