aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-03-30 16:31:01 +0200
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-03-31 14:53:52 +0200
commitfb9a9e65c941a7b840baaa32641818d32b45b5b7 (patch)
tree0026788e85913e88d51eb00a6596d6733447d52e /src/dotty/tools/dotc/typer/Typer.scala
parent318db7dc616a659687d95380efa16159cfaeb984 (diff)
downloaddotty-fb9a9e65c941a7b840baaa32641818d32b45b5b7.tar.gz
dotty-fb9a9e65c941a7b840baaa32641818d32b45b5b7.tar.bz2
dotty-fb9a9e65c941a7b840baaa32641818d32b45b5b7.zip
Factored re-typing logic into seperate ReTyper class
Refactored re-typing logic from erasure into seperate ReTyper class. Another candidate subclass of ReTyper is a future TreeChecker.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala74
1 files changed, 40 insertions, 34 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index b72cd0fa8..c2488f68c 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -775,7 +775,7 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
//todo: make sure dependent method types do not depend on implicits or by-name params
}
- def typedTypeDef(tdef: untpd.TypeDef, sym: Symbol)(implicit ctx: Context): TypeDef = track("typedTypeDef") {
+ def typedTypeDef(tdef: untpd.TypeDef, sym: Symbol)(implicit ctx: Context): Tree = track("typedTypeDef") {
val TypeDef(mods, name, rhs) = tdef
val mods1 = typedModifiers(mods)
val _ = typedType(rhs) // unused, typecheck only to remove from typedTree
@@ -858,40 +858,26 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedAsFunction(tree: untpd.Tree, pt: Type)(implicit ctx: Context): Tree =
typed(tree, if (defn.isFunctionType(pt)) pt else AnyFunctionProto)
- def typedNamed(xtree: untpd.NameTree, pt: Type)(implicit ctx: Context): Tree = {
- val tree = xtree withName xtree.name.encode
- val sym = xtree.removeAttachment(SymOfTree) match {
- case Some(sym) =>
- sym.ensureCompleted()
- sym
- case none =>
- NoSymbol
- }
-
- def localContext = {
- val freshCtx = ctx.fresh.setTree(xtree)
- if (sym.exists) freshCtx.setOwner(sym)
- else freshCtx // can happen for self defs
- }
+ /** Retrieve symbol attached to given tree */
+ protected def retrieveSym(tree: untpd.Tree)(implicit ctx: Context) = tree.removeAttachment(SymOfTree) match {
+ case Some(sym) =>
+ sym.ensureCompleted()
+ sym
+ case none =>
+ NoSymbol
+ }
- tree match {
- case tree: untpd.Ident => typedIdent(tree, pt)
- case tree: untpd.Select => typedSelect(tree, pt)
- case tree: untpd.SelectFromTypeTree => typedSelectFromTypeTree(tree, pt)
- case tree: untpd.Bind => typedBind(tree, pt)
- case tree: untpd.ValDef =>
- if (tree.isEmpty) tpd.EmptyValDef
- else typedValDef(tree, sym)(localContext.setNewScope)
- case tree: untpd.DefDef =>
- val typer1 = nestedTyper.remove(sym).get
- typer1.typedDefDef(tree, sym)(localContext.setTyper(typer1))
- case tree: untpd.TypeDef =>
- if (tree.isClassDef) typedClassDef(tree, sym.asClass)(localContext)
- else typedTypeDef(tree, sym)(localContext.setNewScope)
- case _ => typedUnadapted(desugar(tree), pt)
- }
+ /** A fresh local context with given tree and owner.
+ * Owner might not exist (can happen for self valdefs), in which case
+ * no owner is set in result context
+ */
+ protected def localContext(tree: untpd.Tree, owner: Symbol)(implicit ctx: Context): FreshContext = {
+ val freshCtx = ctx.fresh.setTree(tree)
+ if (owner.exists) freshCtx.setOwner(owner) else freshCtx
}
+ protected def localTyper(sym: Symbol): Typer = nestedTyper.remove(sym).get
+
def typedUnadapted(initTree: untpd.Tree, pt: Type = WildcardType)(implicit ctx: Context): Tree = {
record("typedUnadapted")
val xtree = expanded(initTree)
@@ -899,6 +885,26 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
case Some(ttree) => ttree
case none =>
+ def typedNamed(tree: untpd.NameTree, pt: Type)(implicit ctx: Context): Tree = {
+ val sym = retrieveSym(xtree)
+ tree match {
+ case tree: untpd.Ident => typedIdent(tree, pt)
+ case tree: untpd.Select => typedSelect(tree, pt)
+ case tree: untpd.SelectFromTypeTree => typedSelectFromTypeTree(tree, pt)
+ case tree: untpd.Bind => typedBind(tree, pt)
+ case tree: untpd.ValDef =>
+ if (tree.isEmpty) tpd.EmptyValDef
+ else typedValDef(tree, sym)(localContext(tree, sym).setNewScope)
+ case tree: untpd.DefDef =>
+ val typer1 = localTyper(sym)
+ typer1.typedDefDef(tree, sym)(localContext(tree, sym).setTyper(typer1))
+ case tree: untpd.TypeDef =>
+ if (tree.isClassDef) typedClassDef(tree, sym.asClass)(localContext(tree, sym))
+ else typedTypeDef(tree, sym)(localContext(tree, sym).setNewScope)
+ case _ => typedUnadapted(desugar(tree), pt)
+ }
+ }
+
def typedUnnamed(tree: untpd.Tree): Tree = tree match {
case tree: untpd.Apply =>
if (ctx.mode is Mode.Pattern) typedUnApply(tree, pt) else typedApply(tree, pt)
@@ -938,8 +944,8 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
}
xtree match {
- case xtree: untpd.NameTree => typedNamed(xtree, pt)
- case xtree: untpd.Import => typedImport(xtree, xtree.removeAttachment(SymOfTree).get)
+ case xtree: untpd.NameTree => typedNamed(xtree withName xtree.name.encode, pt)
+ case xtree: untpd.Import => typedImport(xtree, retrieveSym(xtree))
case xtree => typedUnnamed(xtree)
}
}