| 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