Skip to content

Commit 2a739e1

Browse files
committed
Refactor MapUnderlying and add docs
1 parent 1636a25 commit 2a739e1

File tree

1 file changed

+16
-4
lines changed

1 file changed

+16
-4
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,10 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
971971
/** Replace Inlined nodes and InlineProxy references to underlying arguments */
972972
def underlyingArgument(implicit ctx: Context): Tree = {
973973
val mapToUnderlying = new MapToUnderlying {
974-
override def skipLocal(sym: Symbol): Boolean =
974+
/** Should get the rhs of this binding
975+
* Returns true if the symbol is a val or def generated by eta-expansion/inline
976+
*/
977+
override protected def skipLocal(sym: Symbol): Boolean =
975978
sym.is(InlineProxy) || sym.is(Synthetic)
976979
}
977980
mapToUnderlying.transform(tree)
@@ -1018,17 +1021,26 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
10181021
*/
10191022
class MapToUnderlying extends TreeMap {
10201023
override def transform(tree: Tree)(implicit ctx: Context): Tree = tree match {
1021-
case tree: Ident if tree.symbol.exists && !tree.symbol.owner.isClass && !tree.symbol.isAnonymousFunction && skipLocal(tree.symbol) =>
1024+
case tree: Ident if isBinding(tree.symbol) && skipLocal(tree.symbol) =>
10221025
tree.symbol.defTree match {
1023-
case defTree: ValOrDefDef if !defTree.rhs.isEmpty => transform(defTree.rhs)
1026+
case defTree: ValOrDefDef =>
1027+
val rhs = defTree.rhs
1028+
assert(!rhs.isEmpty)
1029+
transform(rhs)
10241030
case _ => tree
10251031
}
10261032
case Inlined(_, _, arg) => transform(arg)
10271033
case Block(Nil, arg) => transform(arg)
10281034
case NamedArg(_, arg) => transform(arg)
10291035
case tree => super.transform(tree)
10301036
}
1031-
def skipLocal(sym: Symbol): Boolean = true
1037+
1038+
/** Should get the rhs of this binding */
1039+
protected def skipLocal(sym: Symbol): Boolean = true
1040+
1041+
/** Is this a symbol that of a local val or parameterless def for which we could get the rhs */
1042+
private def isBinding(sym: Symbol)(implicit ctx: Context): Boolean =
1043+
sym.exists && !sym.is(Param) && !sym.owner.isClass && !sym.isAnonymousFunction
10321044
}
10331045

10341046
implicit class ListOfTreeDecorator(val xs: List[tpd.Tree]) extends AnyVal {

0 commit comments

Comments
 (0)