docs: public static void rescopeNamesToNewScope(Expression newScope, List<String> names, Expression e) {
  
          if (e instanceof NodeWithArguments) {
              NodeWithArguments<?> arguments = (NodeWithArguments) e;
              for (Expression argument : arguments.getArguments()) {
                  rescopeNamesToNewScope(newScope, names, argument);
              }
          }
  
          if (e instanceof AssignExpr) {
              AssignExpr assignExpr = (AssignExpr) e;
              rescopeNamesToNewScope(newScope, names, assignExpr.getTarget());
              rescopeNamesToNewScope(newScope, names, assignExpr.getValue());
          } else if (e instanceof BinaryExpr) {
              rescopeNamesToNewScope(newScope, names, (( BinaryExpr ) e).getLeft());
              rescopeNamesToNewScope(newScope, names, (( BinaryExpr ) e).getRight());
          } else if (e instanceof UnaryExpr) {
              rescopeNamesToNewScope(newScope, names, (( UnaryExpr ) e).getExpression());
          } else if (e instanceof EnclosedExpr) {
              rescopeNamesToNewScope(newScope, names, (( EnclosedExpr ) e).getInner());
          } else {
              Optional<Expression> rootNode = DrlxParseUtil.findRootNodeViaScope(e);
              if (rootNode.isPresent() && rootNode.get() instanceof NameExpr) {
                  NameExpr nameExpr = (NameExpr) rootNode.get();
                  if (names.contains(nameExpr.getNameAsString())) {
                      Expression prepend = new FieldAccessExpr(newScope, nameExpr.getNameAsString());
                      if (e instanceof NameExpr) {
                          e.getParentNode().get().replace(nameExpr, prepend); // actually `e` was not composite, it was already the NameExpr node I was looking to replace.
                      } else {
                          e.replace(nameExpr, prepend);
                      }
                  }
              }
          }
      }