Class: JsDuck::Relations
- Inherits:
-
Object
- Object
- JsDuck::Relations
- Defined in:
- lib/jsduck/relations.rb
Overview
Provides information about relations between classes.
Also provides a place to look up classes by name.
The constructor is initialized with array of all available classes and list of class names to ignore. By default the latter list contains only JavaScript base class “Object”.
Instance Attribute Summary collapse
-
#classes ⇒ Object
readonly
Returns list of all classes.
Instance Method Summary collapse
-
#[](classname) ⇒ Object
Looks up class by name, nil if not found.
- #each(&block) ⇒ Object
-
#ignore?(classname) ⇒ Boolean
Returns true if class is in list of ignored classes.
-
#implemented_by(cls) ⇒ Object
Returns classes having particular mixin, empty array if none.
-
#initialize(classes = [], ignorables = []) ⇒ Relations
constructor
A new instance of Relations.
-
#length ⇒ Object
Used in tests to check the nr of classes.
-
#mixed_into(cls) ⇒ Object
Returns classes having particular mixin, empty array if none.
- #reg_implemented(cls) ⇒ Object
- #reg_mixed_into(cls) ⇒ Object
- #reg_subclasses(cls) ⇒ Object
-
#subclasses(cls) ⇒ Object
Returns subclasses of particular class, empty array if none.
-
#to_a ⇒ Object
Returns list of all classes.
Constructor Details
#initialize(classes = [], ignorables = []) ⇒ Relations
Returns a new instance of Relations.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
# File 'lib/jsduck/relations.rb', line 16 def initialize(classes = [], ignorables = []) @classes = classes @external_classes = ExternalClasses.new(ignorables) # First build class lookup table; building lookup tables for # mixins and subclasses will depend on that. @lookup = {} @classes.each do |cls| @lookup[cls[:name]] = cls (cls[:alternateClassNames] || []).each do |alt_name| @lookup[alt_name] = cls end cls.relations = self end @subs = {} @mixes = {} @implements = {} @classes.each do |cls| reg_subclasses(cls) reg_mixed_into(cls) reg_implemented(cls) end end |
Instance Attribute Details
#classes ⇒ Object (readonly)
Returns list of all classes
14 15 16 |
# File 'lib/jsduck/relations.rb', line 14 def classes @classes end |
Instance Method Details
#[](classname) ⇒ Object
Looks up class by name, nil if not found
42 43 44 |
# File 'lib/jsduck/relations.rb', line 42 def [](classname) @lookup[classname] end |
#each(&block) ⇒ Object
51 52 53 |
# File 'lib/jsduck/relations.rb', line 51 def each(&block) @classes.each(&block) end |
#ignore?(classname) ⇒ Boolean
Returns true if class is in list of ignored classes.
47 48 49 |
# File 'lib/jsduck/relations.rb', line 47 def ignore?(classname) @external_classes.is?(classname) end |
#implemented_by(cls) ⇒ Object
Returns classes having particular mixin, empty array if none
107 108 109 |
# File 'lib/jsduck/relations.rb', line 107 def implemented_by(cls) @implements[cls[:name]] || [] end |
#length ⇒ Object
Used in tests to check the nr of classes.
56 57 58 |
# File 'lib/jsduck/relations.rb', line 56 def length @classes.length end |
#mixed_into(cls) ⇒ Object
Returns classes having particular mixin, empty array if none
102 103 104 |
# File 'lib/jsduck/relations.rb', line 102 def mixed_into(cls) @mixes[cls[:name]] || [] end |
#reg_implemented(cls) ⇒ Object
91 92 93 94 95 96 97 98 99 |
# File 'lib/jsduck/relations.rb', line 91 def reg_implemented(cls) cls.implements.each do |impl| if @implements[impl[:name]] @implements[impl[:name]] << cls else @implements[impl[:name]] = [cls] end end end |
#reg_mixed_into(cls) ⇒ Object
81 82 83 84 85 86 87 88 89 |
# File 'lib/jsduck/relations.rb', line 81 def reg_mixed_into(cls) cls.mixins.each do |mix| if @mixes[mix[:name]] @mixes[mix[:name]] << cls else @mixes[mix[:name]] = [cls] end end end |
#reg_subclasses(cls) ⇒ Object
66 67 68 69 70 71 72 73 74 |
# File 'lib/jsduck/relations.rb', line 66 def reg_subclasses(cls) if !cls.parent # do nothing elsif @subs[cls.parent[:name]] @subs[cls.parent[:name]] << cls else @subs[cls.parent[:name]] = [cls] end end |
#subclasses(cls) ⇒ Object
Returns subclasses of particular class, empty array if none
77 78 79 |
# File 'lib/jsduck/relations.rb', line 77 def subclasses(cls) @subs[cls[:name]] || [] end |
#to_a ⇒ Object
Returns list of all classes. This method allows us to treat Relations as array and therefore easily mock it
62 63 64 |
# File 'lib/jsduck/relations.rb', line 62 def to_a @classes end |