Linux 之父出席、干货分享、圆桌讨论,精彩尽在 OpenCloudOS 社区开放日,报名戳 了解详情
写点什么

RFactor:为文本编辑器提供 Ruby 重构支持

  • 2009 年 3 月 11 日
  • 本文字数:1468 字

    阅读完需:约 5 分钟

RFactor 是一个 Ruby gem,旨在为人们最喜欢的文本编辑器提供自动化重构的支持。可我们不是有 IED 支持重构么?这倒没错,不过 RFactor 的开发者 Fabio Kung 坚信,“大多数 Ruby 开发人员都没用 IDE”,文本编辑器已经够好了。

自动化重构的工作量可不小,要做很多复杂的事情,例如通过源码分析来判断作用范围和使用情况。而且修改代码的时候也不能破坏用户自己的排版格式。

现在 RFactor 还很年幼,只能有限的支持提取方法(Extract Method)。我们与 Fabio Kung 进行了沟通。

RFactor 用的是 ruby_parser ,它可以把解析后的 Ruby AST 作为 s-expressions(sexp)返回。但是怎么样从 s-expressions 重新得到 Ruby 代码呢?

我的原意只是想用 sexp 来支持重构。我用它们来帮我决定如何重构。在提取方法的时候,哪些变量应该是局部变量,哪些应该是参数?而提取变量的时候,哪段代码又要进行修改呢? 我没有直接修改 sexp 来产生代码;我是直接修改源码的文本。Sexp 只是帮我决定在当前的作用范围中,哪些东西需要修改(也帮我找到当前的作用范围是什么)。

等我用 sexp 来决定哪些东西要修改以后,我就把行号和列号提取出来,然后就可以直接修改用户编写的代码了。

可是如果直接从 sexp 里面重新生成新的代码不是更简单么?

Ryan Davis 开发的 ruby2ruby 确实比较酷,它可以从 sexp 直接输出 ruby 源码。我先前也考虑过用它,不过那样就没法维护注释和用户的排版格式了。 所以那样我就得把注释和排版节点(例如换行,空格和 tab)全都放到解析树(Parse Tree)里面去。这确实是个解决办法,不过太复杂了。所以我决定用 sexp 找到行列号,然后自己直接修改源码文本。

到目前为止,这种方式对简单的重构(这也是我的目标)还挺实用。不过我可以确定,对某些复杂的重构来说(例如移动 / 重命名)就不适用了。这些重构需要其他办法。比如说移动和重命名,我就在考虑用 Ack (grep 的升级版)来寻找匹配。然后再用 heuristics 找到要变化的地方,然后询问用户是否接受变化。这个难度很大,不过有些不错的 IDE 已经提供这些实现。

不过尽管如此,我也不会太在意这些复杂的重构:他们不是我当前的目标。我不想把 TextMate 或者其他优秀的编辑器变成复杂的 IDE。我们当前在文本编辑器里面还没有任何的重构支持。所以,先集中精力添上一点再说。

那下一步的计划是什么?

目前 RFactor 还很简单,因为它只能从方法内部的代码中提取方法,也就是对方法外部的代码就没辙了。而且也没做到推断方法的参数和返回值。这个功能我是想要完成的。Sexp 可以告诉我哪些应该是局部变量,哪些不是。另外一个目标是用调用新创建的方法来代替雷同代码。 我也在学习其他类似的实现,例如 Python 的 Bicycle Repair Man 、Eclipse RDT、Smalltalk Refactoring Browser,不管是啥,只要有许可协议就行(Netbeans? RubyMine?)。Bicycle Repair Man 的 Phil Dawes 也给了我很多帮助。

计划中要支持的重构包括:

  • 提取方法
  • 提取变量
  • 提取类
  • 提取模块
  • 用 Ack 做重命名和移动

不幸的是,现在只有我自己搞这个项目,而且纯粹为了兴趣在业余时间搞的。跟大多数开源项目一样,我也非常欢迎任何人的贡献。

GitHub 和 Fabio 的 blog 上可以了解到有关 RFactor 的更多信息,同时 GitHub 上还有一个 TextMate bundle

在用 Ruby 编写 Ruby 源码工具的路上,RFactor 又迈出了一步。此外就是那些用ParseTree 或者ruby_parser 来得到Ruby AST 的静态分析工具

如果你是个文本编辑器的用户,那你希望有重构支持么?你还希望有哪些IDE 功能集成到编辑器里面去?

查看英文原文 RFactor: Ruby Refactoring Support for Text Editors

2009 年 3 月 11 日 18:55932
用户头像

发布了 197 篇内容, 共 48.0 次阅读, 收获喜欢 17 次。

关注

评论

发布
暂无评论
发现更多内容

公安局情指勤一体化指挥调度系统开发

认识流媒体协议,从RTSP协议解析开始!

明儿

c c++ 协议 Wireshark rtp

如果你不知道从哪本书开始阅读,那就从这本开始吧

小天同学

读书 好书推荐 读后感 4月日更

数据人上班划水都聊什么

数据社

大数据 程序员

太简单了!这套java内部类和异常的总结,只学了2个小时就学会了

牛哄哄的java大师

Java

002 ES NGram 分词 + suggest

小林-1025

ES es7

你必须明白的新生代垃圾回收:YoungGC

小Q

Java 架构 面试 JVM GC

seata-golang 一周年回顾

阿里巴巴云原生

Java 数据库 微服务 云原生 Go 语言

【翻译】JVM-技术专题-ZGC学习手册(1)概念定义

浩宇天尚

翻译 ZGC JVM 基本概念

接纳不完美的自己,才能拥有完整的人生|靠谱点评

无量靠谱

谈Android端的高音质和低延时音频编码

Changing Lin

音视频 4月日更

不想搞Java了,现在Java面试为何这么难

Java架构师迁哥

菩萨心肠 霹雳手段|靠谱点评

无量靠谱

“Windows找不到文件...”,怎么处理?

Emotion

Windows 10 系统 找不到系统文件 错误弹窗 windows找不到文件

001 ES suggest-IK 中文

小林-1025

ES es7

shell的三种循环

做个人吧

话题讨论|三大运营商Q1业绩大增,5G开始收割?

程序员架构进阶

5G 话题讨论 28天写作 4月日更 通信运营商

你“会”学算法吗?

IT蜗壳-Tango

精选8道Java集合最常见面试题,进大厂99%都会被问到,限时送!

飞飞JAva

JAVA集合

技术向上,雪坡向下:拼多多的“新帅”与新路

脑极体

Spring 实战:自定义 Filter 优雅获取请求参数和响应结果

看山

Spring实战

封神总结!蚂蚁金服+滴滴+美团+拼多多+腾讯15万字Java面试题

Java 程序员 架构 面试

大数据技术发展的过程

菜菜

TcaplusDB祝大家劳动节快乐

数据人er

分布式 TcaplusDB Tcaplus NoSQL数据库

WebAssembly + Dapr = 下一代云原生运行时?

阿里巴巴云原生

云计算 容器 开发者 运维 云原生

笔记分享--弱网下的极限实时视频通信

攻城先森

音视频 端到端 #弱网 极限视频通信

Dubbo 注册中心

青年IT男

dubbo

头一次见到阿里大牛把spring boot讲的如此通俗易懂

Java 编程 程序员 架构

资源数据治理的应用实践

鲸品堂

数据 治理 运营商

这份清华学霸的Java反射完整版学习笔记,2小时带你从入门到入土

飞飞JAva

关于企业数字化转型的一些思考

石云升

数字化转型 28天写作 4月日更

GPU容器虚拟化:用户态和内核态的技术和实践详解

GPU容器虚拟化:用户态和内核态的技术和实践详解

RFactor:为文本编辑器提供Ruby重构支持_敏捷_Mirko Stocker_InfoQ精选文章