Skip to content
Snippets Groups Projects
Commit ce17562d authored by Jad Hamza's avatar Jad Hamza
Browse files

Add an option to copy positions from old tree when doing substitutions

parent eb87ecf0
1 merge request!107Add an option to copy positions from old tree when doing substitutions
Pipeline #160623 failed
...@@ -38,10 +38,17 @@ trait ExprOps extends GenTreeOps { ...@@ -38,10 +38,17 @@ trait ExprOps extends GenTreeOps {
lazy val Deconstructor = Operator lazy val Deconstructor = Operator
/** Replaces bottom-up variables by looking up for them in a map */ /** Replaces bottom-up variables by looking up for them in a map */
def replaceFromSymbols[V <: VariableSymbol](substs: Map[V, Expr], expr: Expr)(implicit ev: VariableConverter[V]): Expr = { def replaceFromSymbols[V <: VariableSymbol](
substs: Map[V, Expr],
expr: Expr,
copyPositions: Boolean = false
)(implicit ev: VariableConverter[V]): Expr = {
new SelfTreeTransformer { new SelfTreeTransformer {
override def transform(expr: Expr): Expr = expr match { override def transform(expr: Expr): Expr = expr match {
case v: Variable => substs.getOrElse(v.to[V], super.transform(v)) case v: Variable =>
val res = substs.getOrElse(v.to[V], super.transform(v))
if (copyPositions) res.copiedFrom(v)
else res
case _ => super.transform(expr) case _ => super.transform(expr)
} }
}.transform(expr) }.transform(expr)
......
...@@ -336,11 +336,15 @@ trait Types { self: Trees => ...@@ -336,11 +336,15 @@ trait Types { self: Trees =>
case NAryType(tps, builder) => tps.exists(isParametricType) case NAryType(tps, builder) => tps.exists(isParametricType)
} }
def replaceFromSymbols[V <: VariableSymbol](subst: Map[V, Expr], tpe: Type) def replaceFromSymbols[V <: VariableSymbol]
(implicit ev: VariableConverter[V]): Type = { (subst: Map[V, Expr], tpe: Type, copyPositions: Boolean = false)
(implicit ev: VariableConverter[V]): Type = {
new SelfTreeTransformer { new SelfTreeTransformer {
override def transform(expr: Expr): Expr = expr match { override def transform(expr: Expr): Expr = expr match {
case v: Variable => subst.getOrElse(v.to[V], v) case v: Variable =>
val res = subst.getOrElse(v.to[V], v)
if (copyPositions) res.copiedFrom(v)
else res
case _ => super.transform(expr) case _ => super.transform(expr)
} }
}.transform(tpe) }.transform(tpe)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment