aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2014-08-25 11:03:06 +0200
committerMartin Odersky <odersky@gmail.com>2014-08-25 11:03:06 +0200
commit15c4fec42148da760107baa0fb3e5fbb699c4c82 (patch)
tree135b9d9e02732e441a26ef337b6a66d31bceec94
parentb56a743edf1fe21ff1f9f070d17e4a23930e59bd (diff)
downloaddotty-15c4fec42148da760107baa0fb3e5fbb699c4c82.tar.gz
dotty-15c4fec42148da760107baa0fb3e5fbb699c4c82.tar.bz2
dotty-15c4fec42148da760107baa0fb3e5fbb699c4c82.zip
ref(<type>) -> TypeTree
Taking the ref of a type should always give a TypeTree. Makes ref more universally usable as type references after frontend are assumed to be TypeTrees.
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala7
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala2
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala8
3 files changed, 10 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index db0171d55..7bddd49f4 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -270,14 +270,15 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
}
/** A tree representing the same reference as the given type */
- def ref(tp: NamedType)(implicit ctx: Context): NameTree =
- if (prefixIsElidable(tp)) Ident(tp)
+ def ref(tp: NamedType)(implicit ctx: Context): Tree =
+ if (tp.isType) TypeTree(tp)
+ else if (prefixIsElidable(tp)) Ident(tp)
else tp.prefix match {
case pre: SingletonType => singleton(pre).select(tp)
case pre => SelectFromTypeTree(TypeTree(pre), tp)
} // no checks necessary
- def ref(sym: Symbol)(implicit ctx: Context): NameTree =
+ def ref(sym: Symbol)(implicit ctx: Context): Tree =
ref(NamedType(sym.owner.thisType, sym.name, sym.denot))
def singleton(tp: Type)(implicit ctx: Context): Tree = tp match {
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index 87254a217..7147d3b15 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -73,7 +73,7 @@ class TreeChecker {
override def typedIdent(tree: untpd.Ident, pt: Type)(implicit ctx: Context): Tree = {
assert(tree.isTerm || !ctx.isAfterTyper, tree.show + " at " + ctx.phase)
- assert(!needsSelect(tree.tpe), i"bad type ${tree.tpe} for $tree")
+ assert(tree.isType || !needsSelect(tree.tpe), i"bad type ${tree.tpe} for $tree")
super.typedIdent(tree, pt)
}
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 400909da6..9bf4d8a66 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -729,10 +729,12 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
assert(tree.refinements.length == refinements1.length, s"${tree.refinements} != $refinements1")
def addRefinement(parent: Type, refinement: Tree): Type = {
typr.println(s"adding refinement $refinement")
+ def checkRef(tree: Tree, sym: Symbol) =
+ if (sym.maybeOwner == refineCls && tree.pos.start <= sym.pos.end)
+ ctx.error("illegal forward reference in refinement", tree.pos)
foreachSubTreeOf(refinement) {
- case tree: RefTree =>
- if (tree.symbol.owner == refineCls && tree.pos.start <= tree.symbol.pos.end)
- ctx.error("illegal forward reference in refinement", tree.pos)
+ case tree: RefTree => checkRef(tree, tree.symbol)
+ case tree: TypeTree => checkRef(tree, tree.tpe.typeSymbol)
case _ =>
}
val rsym = refinement.symbol