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 595 595: def TopLevel.all_classes_and_modules 596: @@all_classes.values + @@all_modules.values 597: end
# File code_objects.rb, line 603 603: def TopLevel.find_class_named(name) 604: @@all_classes.each_value do |c| 605: res = c.find_class_named(name) 606: return res if res 607: end 608: nil 609: end
# File code_objects.rb, line 553 553: def initialize(file_name) 554: super() 555: @name = "TopLevel" 556: @file_relative_name = file_name 557: @file_absolute_name = file_name 558: @file_stat = File.stat(file_name) 559: @diagram = nil 560: @@all_files[file_name] = self 561: end
# File code_objects.rb, line 547 547: def TopLevel::reset 548: @@all_classes = {} 549: @@all_modules = {} 550: @@all_files = {} 551: 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 573 573: def add_class_or_module(collection, class_type, name, superclass) 574: cls = collection[name] 575: if cls 576: puts "Reusing class/module #{name}" if $DEBUG 577: else 578: if class_type == NormalModule 579: all = @@all_modules 580: else 581: all = @@all_classes 582: end 583: cls = all[name] 584: if !cls 585: cls = class_type.new(name, superclass) 586: all[name] = cls unless @done_documenting 587: end 588: puts "Adding class/module #{name} to #@name" if $DEBUG 589: collection[name] = cls unless @done_documenting 590: cls.parent = self 591: end 592: cls 593: end
# File code_objects.rb, line 615 615: def find_class_or_module_named(symbol, ignore_case=nil) 616: if !ignore_case 617: @@all_classes.each_value {|c| return c if c.name == symbol} 618: @@all_modules.each_value {|m| return m if m.name == symbol} 619: else 620: @@all_classes.each_value {|c| return c if c.name.upcase == symbol.upcase} 621: @@all_modules.each_value {|m| return m if m.name.upcase == symbol.upcase} 622: end 623: nil 624: end
Find a named file
# File code_objects.rb, line 632 632: def find_file_named(name, method=nil, ignore_case=nil) 633: return nil unless name 634: result = nil 635: @@all_files.each{|file_name, toplevel| 636: result = toplevel if file_name == name 637: } 638: dir = File.dirname(@file_relative_name) 639: @@all_files.each{|file_name, toplevel| 640: if /^#{dir}\/(.*)/ =~ file_name 641: result = toplevel if $1 == name 642: end 643: } 644: if result 645: if method 646: result_method = result.find_local_symbol(method, ignore_case) 647: return result_method 648: else 649: return result 650: end 651: else 652: return nil 653: end 654: end
# File code_objects.rb, line 611 611: def find_local_symbol(symbol, ignore_case=nil) 612: find_class_or_module_named(symbol, ignore_case) || super 613: end