aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/typer/Typer.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-09-11 13:48:02 +0200
committerMartin Odersky <odersky@gmail.com>2016-10-02 16:11:21 +0200
commit975d297cc42dd170fe8869474038a4204771a7a1 (patch)
treed80e5c9c741f0094b6d22723e85ec1c7413943be /src/dotty/tools/dotc/typer/Typer.scala
parentb743a9b3b98c67fd4e86c7700bf24e3c1d19e2b2 (diff)
downloaddotty-975d297cc42dd170fe8869474038a4204771a7a1.tar.gz
dotty-975d297cc42dd170fe8869474038a4204771a7a1.tar.bz2
dotty-975d297cc42dd170fe8869474038a4204771a7a1.zip
Fix problem related to accessor generation under separate compilation
Accessors were multiply generated under separate compilation. To fix this, the resident body of an inlined function is now the same as the inlined body. Both use accessors where necessary. Previously, only the inlined body used accessors.
Diffstat (limited to 'src/dotty/tools/dotc/typer/Typer.scala')
-rw-r--r--src/dotty/tools/dotc/typer/Typer.scala18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/typer/Typer.scala b/src/dotty/tools/dotc/typer/Typer.scala
index dde2c866b..60f04b268 100644
--- a/src/dotty/tools/dotc/typer/Typer.scala
+++ b/src/dotty/tools/dotc/typer/Typer.scala
@@ -1495,10 +1495,12 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
case Some(xtree) =>
traverse(xtree :: rest)
case none =>
- val mdef1 = typed(mdef)
- buf += mdef1
- if (Inliner.hasBodyToInline(mdef1.symbol))
- buf ++= Inliner.removeInlineAccessors(mdef1.symbol)
+ typed(mdef) match {
+ case mdef1: DefDef if Inliner.hasBodyToInline(mdef1.symbol) =>
+ buf ++= inlineExpansion(mdef1)
+ case mdef1 =>
+ buf += mdef1
+ }
traverse(rest)
}
case Thicket(stats) :: rest =>
@@ -1512,6 +1514,14 @@ class Typer extends Namer with TypeAssigner with Applications with Implicits wit
traverse(stats)
}
+ /** Given an inline method `mdef`, the method rewritten so that its body
+ * uses accessors to access non-public members, followed by the accessor definitions.
+ * Overwritten in Retyper to return `mdef` unchanged.
+ */
+ protected def inlineExpansion(mdef: DefDef)(implicit ctx: Context): List[Tree] =
+ tpd.cpy.DefDef(mdef)(rhs = Inliner.bodyToInline(mdef.symbol)) ::
+ Inliner.removeInlineAccessors(mdef.symbol)
+
def typedExpr(tree: untpd.Tree, pt: Type = WildcardType)(implicit ctx: Context): Tree =
typed(tree, pt)(ctx retractMode Mode.PatternOrType)
def typedType(tree: untpd.Tree, pt: Type = WildcardType)(implicit ctx: Context): Tree = // todo: retract mode between Type and Pattern?