Class | RDoc::Context |
In: |
code_objects.rb
parsers/parse_f95.rb |
Parent: | CodeObject |
Extend Context class for parse_f95.rb Original class is defined in code_objects.rb.
aliases | [R] | |
attributes | [R] | |
constants | [R] | |
in_files | [R] | |
includes | [R] | |
method_list | [R] | |
name | [R] | |
requires | [R] | |
sections | [R] | |
visibility | [R] |
# File code_objects.rb, line 163 163: def initialize 164: super() 165: 166: @in_files = [] 167: 168: @name ||= "unknown" 169: @comment ||= "" 170: @parent = nil 171: @visibility = :public 172: 173: @current_section = Section.new(nil, nil) 174: @sections = [ @current_section ] 175: 176: initialize_methods_etc 177: initialize_classes_and_modules 178: end
# File parsers/parse_f95.rb, line 381 381: def add_alias(an_alias, ignore_case=nil) 382: meth = find_instance_method_named(an_alias.old_name, ignore_case) 383: if meth 384: new_meth = AnyMethod.new(an_alias.text, an_alias.new_name) 385: new_meth.is_alias_for = meth 386: new_meth.singleton = meth.singleton 387: new_meth.params = meth.params 388: new_meth.comment = "Alias for \##{meth.name}" 389: meth.add_alias(new_meth) 390: add_method(new_meth) 391: else 392: add_to(@aliases, an_alias) 393: end 394: end
# File code_objects.rb, line 247 247: def add_attribute(an_attribute) 248: add_to(@attributes, an_attribute) 249: end
# File code_objects.rb, line 229 229: def add_class(class_type, name, superclass) 230: add_class_or_module(@classes, class_type, name, superclass) 231: end
# File code_objects.rb, line 289 289: def add_class_or_module(collection, class_type, name, superclass=nil) 290: cls = collection[name] 291: if cls 292: puts "Reusing class/module #{name}" if $DEBUG 293: else 294: cls = class_type.new(name, superclass) 295: puts "Adding class/module #{name} to #@name" if $DEBUG 296: # collection[name] = cls if @document_self && !@done_documenting 297: collection[name] = cls if !@done_documenting 298: cls.parent = self 299: cls.section = @current_section 300: end 301: cls 302: end
# File code_objects.rb, line 276 276: def add_constant(const) 277: add_to(@constants, const) 278: end
moved to parse_f95.rb #
!# !# def add_alias(an_alias, ignore_case=nil) !# meth = find_instance_method_named(an_alias.old_name, ignore_case) !# if meth !# new_meth = AnyMethod.new(an_alias.text, an_alias.new_name) !# new_meth.is_alias_for = meth !# new_meth.singleton = meth.singleton !# new_meth.params = meth.params !# new_meth.comment = "Alias for \##{meth.name}" !# meth.add_alias(new_meth) !# add_method(new_meth) !# else !# add_to(@aliases, an_alias) !# end !# end !#
moved to parse_f95.rb #
# File code_objects.rb, line 272 272: def add_include(an_include) 273: add_to(@includes, an_include) 274: end
# File code_objects.rb, line 237 237: def add_method(a_method) 238: if !(a_method.visibility == :public) && 239: !(a_method.visibility == :private) && 240: !(a_method.visibility == :protected) 241: a_method.visibility = @visibility 242: end 243: puts "Adding #{a_method.visibility} method #{a_method.name} to #@name" if $DEBUG 244: add_to(@method_list, a_method) 245: end
# File code_objects.rb, line 233 233: def add_module(class_type, name) 234: add_class_or_module(@modules, class_type, name, nil) 235: end
Requires always get added to the top-level (file) context
# File code_objects.rb, line 281 281: def add_require(a_require) 282: if self.kind_of? TopLevel 283: add_to(@requires, a_require) 284: else 285: parent.add_require(a_require) 286: end 287: end
# File code_objects.rb, line 304 304: def add_to(array, thing) 305: array << thing if @document_self && !@done_documenting 306: thing.parent = self 307: thing.section = @current_section 308: end
map the class hash to an array externally
# File code_objects.rb, line 181 181: def classes 182: @classes.values 183: end
Return true if at least part of this thing was defined in file
# File code_objects.rb, line 225 225: def defined_in?(file) 226: @in_files.include?(file) 227: end
# File code_objects.rb, line 386 386: def each_attribute 387: @attributes.each {|a| yield a} 388: end
# File parsers/parse_f95.rb, line 427 427: def each_includes 428: @includes.each {|i| yield i} 429: end
Find a named attribute, or return nil
# File parsers/parse_f95.rb, line 546 546: def find_attribute_named(name, ignore_case=nil) 547: if !ignore_case 548: @attributes.find {|m| m.name == name} 549: else 550: @attributes.find {|m| m.name.upcase == name.upcase} 551: end 552: end
Find a named constant, or return nil
# File parsers/parse_f95.rb, line 537 537: def find_constant_named(name, ignore_case=nil) 538: if !ignore_case 539: @constants.find {|m| m.name == name} 540: else 541: @constants.find {|m| m.name.upcase == name.upcase} 542: end 543: end
find a module at a higher scope
# File parsers/parse_f95.rb, line 423 423: def find_enclosing_module_named(name, ignore_case=nil) 424: parent && parent.find_module_named(name, ignore_case) 425: end
Look up the given filename.
# File parsers/parse_f95.rb, line 432 432: def find_file(file, method=nil, ignore_case=nil) 433: find_file_named(file, method, ignore_case) 434: end
Find a named instance method, or return nil
# File parsers/parse_f95.rb, line 526 526: def find_instance_method_named(name, ignore_case=nil) 527: if !ignore_case 528: @method_list.find {|meth| meth.name == name && !meth.singleton} 529: else 530: @method_list.find {|meth| 531: meth.name.upcase == name.upcase && !meth.singleton 532: } 533: end 534: end
# File parsers/parse_f95.rb, line 485 485: def find_local_symbol(symbol, ignore_case=nil) 486: res = find_method_named(symbol, ignore_case) || 487: find_constant_named(symbol, ignore_case) || 488: find_attribute_named(symbol, ignore_case) || 489: find_module_named(symbol, ignore_case) 490: end
Find a named method, or return nil
# File parsers/parse_f95.rb, line 517 517: def find_method_named(name, ignore_case=nil) 518: if !ignore_case 519: @method_list.find {|meth| meth.name == name} 520: else 521: @method_list.find {|meth| meth.name.upcase == name.upcase} 522: end 523: end
Find a named module
# File parsers/parse_f95.rb, line 397 397: def find_module_named(name, ignore_case=nil) 398: res = nil 399: if !ignore_case 400: return self if self.name == name 401: else 402: return self if self.name.upcase == name.upcase 403: end 404: if !ignore_case 405: res = @modules[name] || @classes[name] 406: else 407: @modules.each{ |n, v| 408: if n.upcase == name.upcase 409: res = v ; break 410: end 411: } 412: @classes.each{ |n, v| 413: if n.upcase == name.upcase 414: res = v ; break 415: end 416: } if !res 417: end 418: return res if res 419: find_enclosing_module_named(name, ignore_case) 420: end
Look up the given symbol. If method is non-nil, then we assume the symbol references a module that contains that method
# File parsers/parse_f95.rb, line 439 439: def find_symbol(symbol, method=nil, ignore_case=nil) 440: result = nil 441: case symbol 442: when /^::(.*)/ 443: result = toplevel.find_symbol($1, nil, ignore_case) 444: when /::/ 445: modules = symbol.split(/::/) 446: unless modules.empty? 447: module_name = modules.shift 448: result = find_module_named(module_name, ignore_case) 449: if result 450: modules.each do |module_name| 451: result = result.find_module_named(module_name, ignore_case) 452: break unless result 453: end 454: end 455: end 456: else 457: # if a method is specified, then we're definitely looking for 458: # a module, otherwise it could be any symbol 459: if method 460: result = find_module_named(symbol, ignore_case) 461: else 462: result = find_local_symbol(symbol, ignore_case) 463: if result.nil? 464: if symbol =~ /^[A-Z]/ || 465: symbol =~ /^[A-Za-z]/ && ignore_case 466: result = parent 467: while result && result.name != symbol 468: result = result.parent 469: end 470: end 471: end 472: end 473: end 474: if result && method 475: if !result.respond_to?(:find_local_symbol) 476: p result.name 477: p method 478: fail 479: end 480: result = result.find_local_symbol(method, ignore_case) 481: end 482: result 483: end
# File parsers/parse_f95.rb, line 506 506: def include_includes?(name, ignore_case=nil) 507: self.includes.each{|i| 508: if i.name == name || 509: i.name.upcase == name.upcase && ignore_case 510: return true 511: end 512: } 513: return false 514: end
# File parsers/parse_f95.rb, line 492 492: def include_requires?(name, ignore_case=nil) 493: if self.kind_of? TopLevel 494: self.requires.each{|r| 495: if r.name == name || 496: r.name.upcase == name.upcase && ignore_case 497: return true 498: end 499: } 500: return false 501: else 502: parent.include_requires?(name) 503: end 504: end
# File code_objects.rb, line 332 332: def initialize_classes_and_modules 333: @classes = {} 334: @modules = {} 335: end
# File code_objects.rb, line 318 318: def initialize_methods_etc 319: @method_list = [] 320: @attributes = [] 321: @aliases = [] 322: @requires = [] 323: @includes = [] 324: @constants = [] 325: end
map the module hash to an array externally
# File code_objects.rb, line 186 186: def modules 187: @modules.values 188: end
Record the file that we happen to find it in
# File code_objects.rb, line 220 220: def record_location(toplevel) 221: @in_files << toplevel unless @in_files.include?(toplevel) 222: end
If a class‘s documentation is turned off after we‘ve started collecting methods etc., we need to remove the ones we have
# File code_objects.rb, line 314 314: def remove_methods_etc 315: initialize_methods_etc 316: end
Handle sections
# File code_objects.rb, line 511 511: def set_current_section(title, comment) 512: @current_section = Section.new(title, comment) 513: @sections << @current_section 514: end
Given an array methods of method names, set the visibility of the corresponding AnyMethod object
# File code_objects.rb, line 198 198: def set_visibility_for(methods, vis, singleton=false) 199: count = 0 200: @method_list.each do |m| 201: if methods.include?(m.name) && m.singleton == singleton 202: m.visibility = vis 203: count += 1 204: end 205: end 206: 207: return if count == methods.size || singleton 208: 209: # perhaps we need to look at attributes 210: 211: @attributes.each do |a| 212: if methods.include?(a.name) 213: a.visibility = vis 214: count += 1 215: end 216: end 217: end