Skip to content

Commit dab03fd

Browse files
authored
Merge pull request #4990 from dotty-staging/simplify-enclosedInlineds
Simplify enclosedInlineds
2 parents 03b9887 + b5abba6 commit dab03fd

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

compiler/src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,21 +1082,27 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
10821082
/** A key to be used in a context property that tracks enclosing inlined calls */
10831083
private val InlinedCalls = new Property.Key[List[Tree]]
10841084

1085-
override def inlineContext(call: Tree)(implicit ctx: Context): Context =
1086-
ctx.fresh.setProperty(InlinedCalls, call :: enclosingInlineds)
1087-
1088-
/** All enclosing calls that are currently inlined, from innermost to outermost.
1089-
* EmptyTree calls cancel the next-enclosing non-empty call in the list
1090-
*/
1091-
def enclosingInlineds(implicit ctx: Context): List[Tree] = {
1092-
def normalize(ts: List[Tree]): List[Tree] = ts match {
1093-
case t :: (ts1 @ (t1 :: ts2)) if t.isEmpty => normalize(if (t1.isEmpty) ts1 else ts2)
1094-
case t :: ts1 => t :: normalize(ts1)
1095-
case Nil => Nil
1085+
/** Record an enclosing inlined call.
1086+
* EmptyTree calls (for parameters) cancel the next-enclosing call in the list instead of being added to it.
1087+
* We assume parameters are never nested inside parameters.
1088+
*/
1089+
override def inlineContext(call: Tree)(implicit ctx: Context): Context = {
1090+
// We assume enclosingInlineds is already normalized, and only process the new call with the head.
1091+
val oldIC = enclosingInlineds
1092+
val newIC = (call, oldIC) match {
1093+
case (t, t1 :: ts2) if t.isEmpty =>
1094+
assert(!t1.isEmpty)
1095+
ts2
1096+
case _ => call :: oldIC
10961097
}
1097-
normalize(ctx.property(InlinedCalls).getOrElse(Nil))
1098+
ctx.fresh.setProperty(InlinedCalls, newIC)
10981099
}
10991100

1101+
/** All enclosing calls that are currently inlined, from innermost to outermost.
1102+
*/
1103+
def enclosingInlineds(implicit ctx: Context): List[Tree] =
1104+
ctx.property(InlinedCalls).getOrElse(Nil)
1105+
11001106
/** The source file where the symbol of the `inline` method referred to by `call`
11011107
* is defined
11021108
*/

0 commit comments

Comments
 (0)