diff options
author | Martin Odersky <odersky@gmail.com> | 2014-08-25 11:03:06 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2014-08-25 11:03:06 +0200 |
commit | 15c4fec42148da760107baa0fb3e5fbb699c4c82 (patch) | |
tree | 135b9d9e02732e441a26ef337b6a66d31bceec94 | |
parent | b56a743edf1fe21ff1f9f070d17e4a23930e59bd (diff) | |
download | dotty-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.scala | 7 | ||||
-rw-r--r-- | src/dotty/tools/dotc/transform/TreeChecker.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Typer.scala | 8 |
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 |