Class | RDoc::TopLevel |
In: |
code_objects.rb
|
Parent: | Context |
A TopLevel context is a source file
diagram | [RW] | |
file_absolute_name | [RW] | |
file_relative_name | [RW] | |
file_stat | [RW] |
# File code_objects.rb, line 591 591: def TopLevel.all_classes_and_modules 592: @@all_classes.values + @@all_modules.values 593: end
# File code_objects.rb, line 599 599: def TopLevel.find_class_named(name) 600: @@all_classes.each_value do |c| 601: res = c.find_class_named(name) 602: return res if res 603: end 604: nil 605: end
# File code_objects.rb, line 549 549: def initialize(file_name) 550: super() 551: @name = "TopLevel" 552: @file_relative_name = file_name 553: @file_absolute_name = file_name 554: @file_stat = File.stat(file_name) 555: @diagram = nil 556: @@all_files[file_name] = self 557: end
# File code_objects.rb, line 543 543: def TopLevel::reset 544: @@all_classes = {} 545: @@all_modules = {} 546: @@all_files = {} 547: end
Adding a class or module to a TopLevel is special, as we only want one copy of a particular top-level class. For example, if both file A and file B implement class C, we only want one ClassModule object for C. This code arranges to share classes and modules between files.
# File code_objects.rb, line 569 569: def add_class_or_module(collection, class_type, name, superclass) 570: cls = collection[name] 571: if cls 572: puts "Reusing class/module #{name}" if $DEBUG 573: else 574: if class_type == NormalModule 575: all = @@all_modules 576: else 577: all = @@all_classes 578: end 579: cls = all[name] 580: if !cls 581: cls = class_type.new(name, superclass) 582: all[name] = cls unless @done_documenting 583: end 584: puts "Adding class/module #{name} to #@name" if $DEBUG 585: collection[name] = cls unless @done_documenting 586: cls.parent = self 587: end 588: cls 589: end
# File code_objects.rb, line 611 611: def find_class_or_module_named(symbol, ignore_case=nil) 612: if !ignore_case 613: @@all_classes.each_value {|c| return c if c.name == symbol} 614: @@all_modules.each_value {|m| return m if m.name == symbol} 615: else 616: @@all_classes.each_value {|c| return c if c.name.upcase == symbol.upcase} 617: @@all_modules.each_value {|m| return m if m.name.upcase == symbol.upcase} 618: end 619: nil 620: end
Find a named file
# File code_objects.rb, line 628 628: def find_file_named(name, method=nil, ignore_case=nil) 629: return nil unless name 630: result = nil 631: @@all_files.each{|file_name, toplevel| 632: result = toplevel if file_name == name 633: } 634: dir = File.dirname(@file_relative_name) 635: @@all_files.each{|file_name, toplevel| 636: if /^#{dir}\/(.*)/ =~ file_name 637: result = toplevel if $1 == name 638: end 639: } 640: if result 641: if method 642: result_method = result.find_local_symbol(method, ignore_case) 643: return result_method 644: else 645: return result 646: end 647: else 648: return nil 649: end 650: end
# File code_objects.rb, line 607 607: def find_local_symbol(symbol, ignore_case=nil) 608: find_class_or_module_named(symbol, ignore_case) || super 609: end