Extract raises IndexError or ModuleSyntaxError instead of RefactoringError for an empty or whitespace-only region
Mantenedores costumam responder em até 7 dias
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 2/5
- Tempo estimado
- 1-3 horas
- Facilidade para iniciantes
- 78/100
- Tipo de issue
- Bug
- Clareza
- Claramente especificada
- Status de atividade
- Ativa
- Stack de tecnologia
- python
- Domínio
- developer-experience
Direção de pesquisa
Comece em _get_single_expression_body() em rope/refactor/extract.py, onde extracted.lstrip()[0] lança IndexError com uma string vazia. Reproduza com o script da issue, que cobre uma região vazia para ExtractVariable e ExtractMethod e uma região apenas com espaços em branco para ExtractMethod. Está pronto quando os três casos lançam RefactoringError com uma mensagem clara, verificado em _ExceptionalConditionChecker.base_conditions() ou após _fix_start() e _fix_end() no construtor.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
ExtractMethod and ExtractVariable raise IndexError for an empty region, and ModuleSyntaxError about a generated wrapper for a region that contains only whitespace. Both are user mistakes, not internal errors, so they should be reported as RefactoringError, as the other bad-region cases are.
This matters for editor integrations. Neovim sends an empty range when the user requests code actions without a selection, so a language server calls extract with an empty region all the time. It has to tell "can't extract here" apart from a real crash it should log.
To Reproduce
import pathlib
import tempfile
from rope.base.project import Project
from rope.refactor import extract
source = "def f(a):\n b = a + 1\n return b\n"
root = pathlib.Path(tempfile.mkdtemp())
(root / "m.py").write_text(source)
project = Project(str(root), ropefolder=None)
resource = project.get_resource("m.py")
expr = source.index("a + 1")
indent = source.index(" b =")
for label, cls, start, end in [
("extract variable, empty region", extract.ExtractVariable, expr, expr),
("extract method, empty region", extract.ExtractMethod, expr, expr),
("extract method, whitespace only", extract.ExtractMethod, indent, indent + 4),
]:
try:
cls(project, resource, start, end).get_changes("new_name")
except Exception as e:
print(f"{label}: {type(e).__name__}: {e}")
Output on master (46ebf37), Python 3.13:
extract variable, empty region: IndexError: string index out of range
extract method, empty region: IndexError: string index out of range
extract method, whitespace only: ModuleSyntaxError: Syntax error in file <string> line <1>: expected an indented block after function definition on line 1
The IndexError comes from _get_single_expression_body(), which indexes extracted.lstrip()[0] on an empty string.
Expected behaviour
RefactoringError, with a message such as "Extracted piece should contain at least one expression or statement". Checking it in _ExceptionalConditionChecker.base_conditions(), or in the constructor after _fix_start() and _fix_end(), would cover both cases.
Editor information
- Python 3.13
- Rope master 46ebf37 (also 1.14.0)
- Context: rope-language-server issue #19
- Linguagem predominante
- Python
- Estrelas
- 2.2k
- Forks
- 197
- Merge médio
- 2d 13h
- PRs com merge (30d)
- 5
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de python-rope/rope
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
python-rope/rope#927 ·
Mantenedores costumam responder em até 7 dias
-
simplify.real_code blanks t-strings, so renames inside them edit the wrong offsetTalvez já em andamento @sean0407 assumiu há 10 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 83/100
python-rope/rope#913 ·
Mantenedores costumam responder em até 7 dias
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 30/100
python-rope/rope#925 ·
Mantenedores costumam responder em até 7 dias
-
Extract method/variable and introduce parameter don't check whether the new name is already in useAberta
Dificuldade 3/5 1-2 dias Facilidade para iniciantes 62/100
python-rope/rope#924 ·
Mantenedores costumam responder em até 7 dias
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 35/100
python-rope/rope#923 ·
Mantenedores costumam responder em até 7 dias
Todas as issues de python-rope/rope
Issues semelhantes
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
yt-project/yt#5624 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
-
bug
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
NousResearch/hermes-agent#148376 ·
Mantenedores costumam responder em até 1 dia
-
Analysis
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 72/100
SACGF/variantgrid#2615 ·
Mantenedores costumam responder em até 1 dia