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.



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/jsduck/relations.rb', line 14

def initialize(classes = [], ignorables = [])
  @classes = classes
  @ignorables = {}
  ignorables.each {|classname| @ignorables[classname] = true }

  # First build class lookup table; building lookup tables for
  # mixins and subclasses will depend on that.
  @lookup = {}
  @classes.each do |cls|
    @lookup[cls.full_name] = cls
    (cls[:alternateClassNames] || []).each do |alt_name|
      @lookup[alt_name] = cls
    end
    cls.relations = self
  end

  @subs = {}
  @mixes = {}
  @classes.each do |cls|
    reg_subclasses(cls)
    reg_mixed_into(cls)
  end
end

Instance Attribute Details

#classesObject (readonly)

Returns list of all classes



12
13
14
# File 'lib/jsduck/relations.rb', line 12

def classes
  @classes
end

Instance Method Details

#[](classname) ⇒ Object

Looks up class by name, nil if not found



39
40
41
# File 'lib/jsduck/relations.rb', line 39

def [](classname)
  @lookup[classname]
end

#each(&block) ⇒ Object



48
49
50
# File 'lib/jsduck/relations.rb', line 48

def each(&block)
  @classes.each(&block)
end

#ignore?(classname) ⇒ Boolean

Returns true if class is in list of ignored classes.

Returns:

  • (Boolean)


44
45
46
# File 'lib/jsduck/relations.rb', line 44

def ignore?(classname)
  @ignorables[classname]
end

#mixed_into(cls) ⇒ Object

Returns classes having particular mixin, empty array if none



84
85
86
# File 'lib/jsduck/relations.rb', line 84

def mixed_into(cls)
  @mixes[cls.full_name] || []
end

#reg_mixed_into(cls) ⇒ Object



73
74
75
76
77
78
79
80
81
# File 'lib/jsduck/relations.rb', line 73

def reg_mixed_into(cls)
  cls.mixins.each do |mix|
    if @mixes[mix.full_name]
      @mixes[mix.full_name] << cls
    else
      @mixes[mix.full_name] = [cls]
    end
  end
end

#reg_subclasses(cls) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/jsduck/relations.rb', line 58

def reg_subclasses(cls)
  if !cls.parent
    # do nothing
  elsif @subs[cls.parent.full_name]
    @subs[cls.parent.full_name] << cls
  else
    @subs[cls.parent.full_name] = [cls]
  end
end

#subclasses(cls) ⇒ Object

Returns subclasses of particular class, empty array if none



69
70
71
# File 'lib/jsduck/relations.rb', line 69

def subclasses(cls)
  @subs[cls.full_name] || []
end

#to_aObject

Returns list of all classes. This method allows us to treat Relations as array and therefore easily mock it



54
55
56
# File 'lib/jsduck/relations.rb', line 54

def to_a
  @classes
end