Repository: spyder-ide/spyder

Issue:
IndexError when copy/paste from file explorer
## Description

### What steps will reproduce the problem?

<!--- You can use Markdown here --->

I don't know how to reproduce the issue. However, It happened before. I copied a file name from the file explorer (I'm using CentOS) into the code. That worked fine. Afterwards I tried to copy/paste a line of code and still, the previous file location was copied. The clipboard works fine for other applications, even after this error in spyder. However, after replacing the clipboard contents in another application and trying to paste into spyder, it does not paste anything and opens this Issue reporter instead.

Thanks for the amazing work, fixing bugs and making spyder!!!

### Traceback
```python-traceback
Traceback (most recent call last):
  File "/home/jestubbe/.conda/envs/sitkpy/lib/python3.8/site-packages/spyder/plugins/editor/widgets/codeeditor.py", line 2831, in paste
    text = urls[0].toLocalFile().replace(osp.os.sep, '/')
IndexError: list index out of range
Traceback (most recent call last):
  File "/home/jestubbe/.conda/envs/sitkpy/lib/python3.8/site-packages/spyder/plugins/editor/widgets/codeeditor.py", line 2831, in paste
    text = urls[0].toLocalFile().replace(osp.os.sep, '/')
IndexError: list index out of range
Traceback (most recent call last):
  File "/home/jestubbe/.conda/envs/sitkpy/lib/python3.8/site-packages/spyder/plugins/editor/widgets/codeeditor.py", line 2831, in paste
    text = urls[0].toLocalFile().replace(osp.os.sep, '/')
IndexError: list index out of range
```

## Versions

* Spyder version: 5.1.5 
* Python version: 3.8.12
* Qt version: 5.9.7
* PyQt5 version: 5.9.2
* Operating System: Linux 3.10.0-1160.31.1.el7.x86_64

### 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.2 (OK)
diff_match_patch >=20181111   :  20200713 (OK)
intervaltree >=3.0.2          :  3.1.0 (OK)
IPython >=7.6.0               :  7.31.1 (OK)
jedi >=0.17.2;<0.19.0         :  0.18.1 (OK)
jsonschema >=3.2.0            :  3.2.0 (OK)
keyring >=17.0.0              :  23.4.0 (OK)
nbconvert >=4.0               :  6.3.0 (OK)
numpydoc >=0.6.0              :  1.2 (OK)
parso >=0.7.0;<0.9.0          :  0.8.3 (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.11.2 (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.4 (OK)
pylsp_black >=1.0.0           :  None (OK)
qdarkstyle =3.0.2             :  3.0.2 (OK)
qstylizer >=0.1.10            :  0.1.10 (OK)
qtawesome >=1.0.2             :  1.0.3 (OK)
qtconsole >=5.1.0             :  5.2.2 (OK)
qtpy >=1.5.0                  :  1.11.2 (OK)
rtree >=0.9.7                 :  0.9.7 (OK)
setuptools >=49.6.0           :  58.0.4 (OK)
sphinx >=0.6.6                :  4.4.0 (OK)
spyder_kernels >=2.1.1;<2.2.0 :  2.1.3 (OK)
textdistance >=4.2.0          :  4.2.1 (OK)
three_merge >=0.1.1           :  0.1.1 (OK)
watchdog >=0.10.3             :  2.1.6 (OK)
xdg >=0.26                    :  0.27 (OK)
zmq >=17                      :  22.3.0 (OK)

# Optional:
cython >=0.21                 :  None (OK)
matplotlib >=2.0.0            :  3.5.0 (OK)
numpy >=1.7                   :  1.21.2 (OK)
pandas >=1.1.1                :  1.3.5 (OK)
scipy >=0.17.0                :  1.7.3 (OK)
sympy >=0.7.3                 :  None (OK)
```



Discussion:
Hey @edus-apps, thanks for reporting. I don't understand very well how this error happens, but we can catch and pass on it so it doesn't appear anymore.

The fix will be available in our next version (5.3.0), to be released next week.

Resolving patch:
diff --git a/spyder/plugins/editor/widgets/codeeditor.py b/spyder/plugins/editor/widgets/codeeditor.py
--- a/spyder/plugins/editor/widgets/codeeditor.py
+++ b/spyder/plugins/editor/widgets/codeeditor.py
@@ -2870,6 +2870,7 @@ def paste(self):
         """
         clipboard = QApplication.clipboard()
         text = to_text_string(clipboard.text())
+
         if clipboard.mimeData().hasUrls():
             # Have copied file and folder urls pasted as text paths.
             # See spyder-ide/spyder#8644 for details.
@@ -2881,7 +2882,12 @@ def paste(self):
                                           replace(osp.os.sep, '/')
                                           + '"' for url in urls)
                 else:
-                    text = urls[0].toLocalFile().replace(osp.os.sep, '/')
+                    # The `urls` list can be empty, so we need to check that
+                    # before proceeding.
+                    # Fixes spyder-ide/spyder#17521
+                    if urls:
+                        text = urls[0].toLocalFile().replace(osp.os.sep, '/')
+
         eol_chars = self.get_line_separator()
         if len(text.splitlines()) > 1:
             text = eol_chars.join((text + eol_chars).splitlines())


Test patch: