开发者

How can I determine the size of methods and classes in Ruby?

开发者 https://www.devze.com 2023-03-31 04:58 出处:网络
I\'m working on a code visualization tool and I\'d like to be able to display the size(in lines) of each Class, Method, and Module in a project.It seems like existing parsers(such as Ripper) could mak

I'm working on a code visualization tool and I'd like to be able to display the size(in lines) of each Class, Method, and Module in a project. It seems like existing parsers(such as Ripper) could make this i开发者_运维百科nfo easy to get. Is there a preferred way to do this? Is there a method of assessing size for classes that have been re-opened in separate locations? How about for dynamically (Class.new {}, Module.new {}) defined structures?


I think what you're asking for is not possible in general without actually running the whole Ruby program the classes are part of (and then you run into the halting problem). Ruby is extremely dynamic, so lines could be added to a class' definition anywhere, at any time, without necessarily referring to the particular class by name (e.g. using class_eval on a class passed into a method as an argument). Not that the source code of a class' definition is saved anyway... I think the closest you could get to that is the source_locations of the methods of the class.

You could take the difference of the maximum and minimum line numbers of those source_locations for each file. Then you'd have to assume that the class is opened only once per file, and that the size of the last method in a file is negligible (as well as any non-method parts of the class definition that happen before the first method definition or after the last one).

If you want something more accurate maybe you could run the program, get method source_locations, and try to correlate those with a separate parse of the source file(s), looking for enclosing class blocks etc.

But anything you do will most likely involve assumptions about how classes are generally defined, and thus not always be correct.

EDIT: Just saw that you were asking about methods and modules too, not just classes, but I think similar arguments apply for those.


I've created a gem that handles this problem in the fashion suggested by wdebaum. class_source. It certainly doesn't cover all cases but is a nice 80% solution for folks that need this type of thing. Patches welcome!

0

精彩评论

暂无评论...
验证码 换一张
取 消