Class: Typedocs::Context

Inherits:
Object
  • Object
show all
Defined in:
lib/typedocs/context.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ Context

Returns a new instance of Context.



6
7
8
9
10
# File 'lib/typedocs/context.rb', line 6

def initialize(klass)
  @klass = klass
  # udt_name => spec
  @specs = {}
end

Class Method Details

.valid_udt_name?(name) ⇒ Boolean

Returns:

  • (Boolean)


2
3
4
# File 'lib/typedocs/context.rb', line 2

def self.valid_udt_name?(name)
  /\A@[A-Z][a-zA-Z0-9]*\Z/ =~ name.to_s
end

Instance Method Details

#defined_type(name) ⇒ Object



18
19
20
# File 'lib/typedocs/context.rb', line 18

def defined_type(name)
  self_defined_type(name) || outer_defined_type(name) || parent_defined_type(name)
end

#defined_type!(name) ⇒ Object



15
16
17
# File 'lib/typedocs/context.rb', line 15

def defined_type!(name)
  self_defined_type(name) || outer_defined_type(name) || (raise Typedocs::NoSuchType, "Type not found in #{@klass.name}: #{name}")
end

#outer_defined_type(name) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/typedocs/context.rb', line 24

def outer_defined_type(name)
  return nil unless @klass.name
  outer_name = @klass.name.split(/::/)[0..-2]
  unless outer_name.empty?
    outer_klass = outer_name.inject(::Object) {|ns, name| ns.const_get(name) }
    Typedocs.context(outer_klass).defined_type(name)
  end
end

#parent_defined_type(name) ⇒ Object



32
33
34
35
36
37
# File 'lib/typedocs/context.rb', line 32

def parent_defined_type(name)
  return nil unless @kass.kind_of? ::Class
  superclass = @klass.superclass
  return nil unless superclass
  Typedocs.context(superclass).defined_type(name)
end

#self_defined_type(name) ⇒ Object



21
22
23
# File 'lib/typedocs/context.rb', line 21

def self_defined_type(name)
  @specs[name]
end

#typedef(name, definition) ⇒ Object

Raises:



11
12
13
14
# File 'lib/typedocs/context.rb', line 11

def typedef(name, definition)
  raise ArgumentError, "Invalid user-defined type name: #{name}" unless self.class.valid_udt_name?(name)
  @specs[name.to_s] = Typedocs::Parser.new.parse(@klass, definition, :type)
end