Class: JsDuck::Relations

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#classesObject (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.

Returns:

  • (Boolean)


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

#lengthObject

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_aObject

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