spyder-ide / spyder

Official repository for Spyder - The Scientific Python Development Environment
https://www.spyder-ide.org
MIT License
8.2k stars 1.59k forks source link

Breakpoints disappear when I save a file with the autoformat option toggled on #16549

Open ghost opened 2 years ago

ghost commented 2 years ago

Issue Report Checklist

Problem Description

Breakpoints disappear when I save a file with the option "Autoformat files on save" turned on.

What steps reproduce the problem?

  1. Toggle the option "Autoformat files on save" on under Preferences ➝ Completion and linting ➝ Code style and formatting.
  2. Select black as the formatter
  3. Write a line of code, e.g. a = 1
  4. Write another line of code on line 2 e.g. print(a)
  5. Create a breakpoint on line 1
  6. Save the file

Below gif shows the above step and the actual output:

spyder

What is the expected output? What do you see instead?

I expect that the breakpoint on line 1 stays available and is shown in the gutter.
Instead the breakpoint disappears from the gutter and also from the Breakpoints panel.

I partially understand that when autoformatting it can be ambiguous what line the breakpoint should stay at, but that's not always the case. Perhaps some logic can be applied here that keeps the breakpoints on the lines that haven't changed?

Paste Traceback/Error Below (if applicable)


N/A

Versions

Dependencies


# Mandatory:
atomicwrites >=1.2.0          :  1.4.0 (OK)
chardet >=2.0.0               :  4.0.0 (OK)
cloudpickle >=0.5.0           :  2.0.0 (OK)
cookiecutter >=1.6.0          :  1.7.3 (OK)
diff_match_patch >=20181111   :  20200713 (OK)
intervaltree                  :  None (OK)
IPython >=7.6.0               :  7.27.0 (OK)
jedi >=0.17.2;<0.19.0         :  0.18.0 (OK)
jsonschema >=3.2.0            :  3.2.0 (OK)
keyring >=17.0.0              :  23.2.1 (OK)
nbconvert >=4.0               :  6.1.0 (OK)
numpydoc >=0.6.0              :  1.1.0 (OK)
paramiko >=2.4.0              :  2.7.2 (OK)
parso >=0.7.0;<0.9.0          :  0.8.2 (OK)
pexpect >=4.4.0               :  4.8.0 (OK)
pickleshare >=0.4             :  0.7.5 (OK)
psutil >=5.3                  :  5.8.0 (OK)
pygments >=2.0                :  2.10.0 (OK)
pylint >=2.5.0;<2.10.0        :  2.9.6 (OK)
pyls_spyder >=0.4.0           :  0.4.0 (OK)
pylsp >=1.2.2;<1.3.0          :  1.2.2 (OK)
pylsp_black >=1.0.0           :  None (OK)
qdarkstyle =3.0.2             :  3.0.2 (OK)
qstylizer >=0.1.10            :  0.2.1 (OK)
qtawesome >=1.0.2             :  1.0.3 (OK)
qtconsole >=5.1.0             :  5.1.1 (OK)
qtpy >=1.5.0                  :  1.11.1 (OK)
rtree >=0.9.7                 :  0.9.7 (OK)
setuptools >=49.6.0           :  58.0.4 (OK)
sphinx >=0.6.6                :  4.2.0 (OK)
spyder_kernels >=2.1.1;<2.2.0 :  2.1.1 (OK)
textdistance >=4.2.0          :  4.2.1 (OK)
three_merge >=0.1.1           :  0.1.1 (OK)
watchdog                      :  2.1.5 (OK)
zmq >=17                      :  22.2.1 (OK)

# Optional:
cython >=0.21                 :  0.29.24 (OK)
matplotlib >=2.0.0            :  3.4.3 (OK)
numpy >=1.7                   :  1.19.3 (OK)
pandas >=1.1.1                :  1.3.3 (OK)
scipy >=0.17.0                :  1.7.1 (OK)
sympy >=0.7.3                 :  1.8 (OK)
dalthviz commented 2 years ago

Hi @ba-tno thanks for the feedback! I was able to reproduce this and also trigger it by running manually the autoformat action (Source > Format file or section with Autopep8 or by using the shortcut Ctrl + Alt + I). I think the current way the autoformat works is replacing all the text in the formated file so that's why the breakpoints are being removed

ghost commented 2 years ago

The issue still exists but has slightly morphed in 5.2.2. The breakpoints no longer disappear completely, but they remain in the Breakpoints panel after an autoformat and actually still work (i.e. the debugger stops at the line written in the panel). However, the red dot in the margin does still disappear.

Only when the number of lines changes and the file is saved, the breakpoints disappear completely (also from the panel).

ccordoba12 commented 2 years ago

I think this happens because we're not correctly preserving line endings on Windows when formatting with Black. This should be fixed in our next version (5.3.0), thanks to some fixes I'm working on right now.