aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-09-05 13:51:44 +0200
committerMartin Odersky <odersky@gmail.com>2016-10-02 16:11:21 +0200
commit4dd8469391c440728fa8ee4e45d521b7933d5bd8 (patch)
treea64baa34b874596e621ca69b97bc580d0728eaf4
parent29acee02f66c988cc9763057c785c98477201755 (diff)
downloaddotty-4dd8469391c440728fa8ee4e45d521b7933d5bd8.tar.gz
dotty-4dd8469391c440728fa8ee4e45d521b7933d5bd8.tar.bz2
dotty-4dd8469391c440728fa8ee4e45d521b7933d5bd8.zip
Avoid reference to local bindings in Inlined nodes
To do this, use a proper TypeAssigner for Inlined, analogous to how we type Blocks.
-rw-r--r--src/dotty/tools/dotc/ast/tpd.scala2
-rw-r--r--src/dotty/tools/dotc/typer/TypeAssigner.scala8
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala4
3 files changed, 10 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/ast/tpd.scala b/src/dotty/tools/dotc/ast/tpd.scala
index dc0756df1..54005808f 100644
--- a/src/dotty/tools/dotc/ast/tpd.scala
+++ b/src/dotty/tools/dotc/ast/tpd.scala
@@ -117,7 +117,7 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
ta.assignType(new untpd.JavaSeqLiteral(elems, elemtpt), elems, elemtpt).asInstanceOf[JavaSeqLiteral]
def Inlined(call: Tree, bindings: List[MemberDef], expansion: Tree)(implicit ctx: Context): Inlined =
- untpd.Inlined(call, bindings, expansion).withType(expansion.tpe)
+ ta.assignType(untpd.Inlined(call, bindings, expansion), bindings, expansion)
def TypeTree(original: Tree)(implicit ctx: Context): TypeTree =
TypeTree(original.tpe, original)
diff --git a/src/dotty/tools/dotc/typer/TypeAssigner.scala b/src/dotty/tools/dotc/typer/TypeAssigner.scala
index ba8f35cd8..0c55d977e 100644
--- a/src/dotty/tools/dotc/typer/TypeAssigner.scala
+++ b/src/dotty/tools/dotc/typer/TypeAssigner.scala
@@ -127,6 +127,9 @@ trait TypeAssigner {
widenMap(tp)
}
+ def avoidingType(expr: Tree, bindings: List[Tree])(implicit ctx: Context): Type =
+ avoid(expr.tpe, localSyms(bindings).filter(_.isTerm))
+
def seqToRepeated(tree: Tree)(implicit ctx: Context): Tree =
Typed(tree, TypeTree(tree.tpe.widen.translateParameterized(defn.SeqClass, defn.RepeatedParamClass)))
@@ -383,7 +386,10 @@ trait TypeAssigner {
tree.withType(defn.UnitType)
def assignType(tree: untpd.Block, stats: List[Tree], expr: Tree)(implicit ctx: Context) =
- tree.withType(avoid(expr.tpe, localSyms(stats) filter (_.isTerm)))
+ tree.withType(avoidingType(expr, stats))
+
+ def assignType(tree: untpd.Inlined, bindings: List[Tree], expansion: Tree)(implicit ctx: Context) =
+ tree.withType(avoidingType(expansion, bindings))
def assignType(tree: untpd.If, thenp: Tree, elsep: Tree)(implicit ctx: Context) =
tree.withType(thenp.tpe | elsep.tpe)
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index 3672996c8..8bc156606 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -948,8 +948,8 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
def typedInlined(tree: untpd.Inlined, pt: Type)(implicit ctx: Context): Inlined = {
val (exprCtx, bindings1) = typedBlockStats(tree.bindings)
val expansion1 = typed(tree.expansion, pt)(Inliner.inlineContext(tree.call)(exprCtx))
- cpy.Inlined(tree)(tree.call, bindings1.asInstanceOf[List[MemberDef]], expansion1)
- .withType(expansion1.tpe)
+ assignType(cpy.Inlined(tree)(tree.call, bindings1.asInstanceOf[List[MemberDef]], expansion1),
+ bindings1, expansion1)
}
def typedTypeTree(tree: untpd.TypeTree, pt: Type)(implicit ctx: Context): TypeTree = track("typedTypeTree") {