BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias RFactor: Suporte Refactoring de Ruby para Editores de Texto

RFactor: Suporte Refactoring de Ruby para Editores de Texto

RFactor um Ruby gem que tem por objetivo oferecer suporte automatizado de refactoring para seu editor favorito. Não temos IDEs que suportam refactoring? Sim, mas o desenvolvedor do RFactor, Fábio Kung, acredita que "a maioria dos desenvolvedores Ruby não usam IDEs" e que um editor de texto é bom o suficiente.

Refactoring automatizado não é uma tarefa trivial e envolve várias atividades complexas, como análise do código para determinar escopos e usos. Também é necessário ter uma boa estratégia para modificar o código sem bagunçar a formatação do usuário.

Neste momento, o RFactor ainda é novo e suporta somente Extração de Métodos com algumas limitações. Nós conversamos com Fábio Kung para aprender mais sobre o RFactor.

O RFactor usa o ruby_parser, que retorna a AST Ruby parseada como uma s-expression (sexp). Mas como você obtém o código Ruby a partir de uma s-expression?

Minha idéia inicial é usar sexps apenas para suportar alguns refactorings. Estou usando-as para ajudar a tomar decisões sobre como refatorar código. Que variáveis podem ser consideradas locais e o que deve se tornar argumentos, quando eu extraio um método? Quando eu extraio uma variável, qual código deve ser modificado para usar a variável que acabou de ser criada?

Eu não modifico as sexps diretamente para produzir código; minha abordagem era modificar o texto do código fonte diretamente. O sexp está lá basicamente para decidir o que deve mudar, baseado no escopo atual (e para descobrir qual é o escopo atual).

Uma vez que eu tenha usado as sexps para decidir o que será modificado, eu extraio os números de linha e coluna, então eu posso modificar diretamente o código escrito pelos usuários.

Mas não seria mais fácil se você pudesse apenas re-gerar o código a partir das sexps?

ruby2ruby é um outro projeto ótimo do Ryan Davis, que gera código fonte Ruby direto de sexps. Eu pensei em usar ele antes, mas eu não seria capaz de manter os comentários e formatação do usuário dessa forma.

Por este caminho, eu teria de incluir os comentários e nós de formatação (como newlines, espaços e tabs) nas Parse Trees. Isso é certamente uma alternativa, mas muito mais complexa. Foi por isso que decidi usar as sexps apenas para descobrir os números de linha e coluna e então manipular o texto do código fonte diretamente. 

Esta abordagem tem sido suficiente para refactorings simples (que é o meu objetivo). Eu não estou tentando transformar o TextMate e cia em IDEs complexas. Nós não temos suporte de refactoring para nenhum dos bons editores de texto. Vamos nos concentrar em ter algo simples antes.

Então, quais são os planos pro futuro?

Até agora, RFactor é bem simples, porque só pode extrair métodos de código dentro de outros métodos; ex: ainda não há suporte para código fora de métodos. Também, ele não tenta inferir parâmetros e retorno. Esse é uma das coisas que eu quero suportar. Sexps podem dizer o que pode ser local e o que não pode. Outra coisa a considerar é substituir código similar por uma chamada do novo método.

Eu também estou estudando outras implementações, como o Bicycle Repair Man do Python, o Eclipse RDT, Smalltalk Refactoring Browser e qualquer uma que tiver uma licença (Netbeans? RubyMine?). Phil Dawes (do Bicycle Repair Man) já me deu algumas dicas úteis.

Mais refactoring estão no plano também:
  • Extrair Métodos
  • Extrair Variáveis
  • Extrair Classes
  • Extrair Módulos
  • Renomear/Mover utilizando Ack
Infelizmente, eu sou apenas um homem e estou trabalhando nessas coisas por diversão, no meu tempo livre. Como na maioria dos projetos open source, quaisquer contribuições seriam muito bem vindas.

Mais sobre o RFactor pode ser encontrado no GitHub e também no post sobre RFactor no blog do Fábio. Também existe um TextMate bundle.

O RFactor é mais um passo na direção de ter ferramentas de código fonte Ruby escritas em Ruby. Outros exemplos são ferramentas de análise estática que também usam ParseTree ou ruby_parser para chegar nas ASTs Ruby.

Se você é um usuário de editores de texto, você sente falta de suporte a refactoring? Há outras funcionalidades do IDE que você gostaria de ver integradas ao seu editor de texto?

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT