| 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