clojure-emacs / clojure-emacs/clj-refactor.el

cljr-expand-let on a let inside of a let value is confused

Open
#488 0 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Emacs Lisp
Stars
785
Forks
110
PR merge metrics
No merged PRs in 30d

Description

When using `cljr-expand-let` on the let inside of the let value it gets quite confused.

```
(let [a 1
b (let [c 2]
(+ a c))]
b)
```

## Expected behavior

Any of the following seem reasonable;

```
(let [a 1
c 2
b (+ a c)]
b)
```

OR

```
(let [c 2]
(let [a 1
b (+ a c)]
b)
```

OR

Throw an error that it can't manipulate this form.

## Actual behavior

```
;; cljr-expand-let at ^(let [c 2]) =>
(let (let [c 2]
[a 1
b (+ a c)])
b)
```

Which is not valid clojure. I suspect this may be a tricky problem to resolve correctly as the inner let may encodes dependencies on other vars in the outer let, however, I think if the value is inserted as a key in the parent let immediately before this key it *should* work? I'm also not sure what should happen if the inner let has more then one key and one depends on the other. IE

```
(let [a 1
b (let [c 2
d (+ a c)]
d)]
b)
```

I guess maybe the operation should just fold all the keys in the inner let to the outer in order? Like so maybe?

```
(let [a 1
c 2
d (+ a c)
b d]
b)
```

Thanks for creating this tool, it's very useful! Also appreciate this particular case is kind of a tricky edge case, but thought it would be useful to report!

## Steps to reproduce the problem

Use `cljr-expand-let` on the inner let.

## Environment & Version information

### clj-refactor.el version information

clj-refactor 2.5.1 (package: 20210413.733), refactor-nrepl 2.5.1

### CIDER version information

```
;; CIDER 1.1.0 (package: 20210422.802) (Plovdiv), nREPL 0.8.3
;; Clojure 1.10.2, Java 1.8.0_292
```

### Leiningen or Boot version

clojure CLI Version: 1.10.2.774

### Emacs version

GNU Emacs 28.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.20, cairo version 1.16.0) of 2021-04-30

### Operating system

Ubuntu 2020.04

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.