That's a good catch regarding `line` -- how about the changes above with the following?

```
expr -> `expr.free_symbols.union(line.free_symbols)`
```

Or we could pass the expressions like `_uniquely_named_symbol(name, expr, line)` and then have `def _uniquely_named_symbol(xname, *exprs)` and do `... for s in set.union(*[e.free_symbols for e in exprs])`