public
Description: JavaScript inline documentation parser
Homepage: http://pdoc.org
Clone URL: git://github.com/tobie/pdoc.git
tobie (author)
Sun May 04 16:38:05 -0700 2008
commit  f46ae6877af6fd02125f8d61bf953413ae115fbf
tree    70761405769b03ed567ec7daebdbb33972ae5fb2
parent  68ee9266c6ffb9c8f198c8dc152aedf7c11df24f
pdoc / lib / pdoc / parser / ebnf_expression_nodes.rb
100644 167 lines (133 sloc) 2.583 kb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
module EbnfExpression
  class Base < Treetop::Runtime::SyntaxNode
    def klass_name
      js_namespace.to_a.last
    end
    
    def name
      js_variable.value
    end
    
    def full_name
      js_namespace.text_value
    end
    
    def namespace
      js_namespace.text_value
    end
    
    def returns
      return_value.value.text_value.strip
    end
    
    def to_s
      text_value
    end
    
    def inspect
      "#<#{self.class} @input=#{@input.inspect}>"
    end
  end
  
  class Method < Base
    def methodized?
      args.methodize.text_value == "@"
    end
    
    def arguments
      args.arguments.to_a
    end
    
    def methodized_arguments
      arguments.slice(1..-1)
    end
  end
  
  class KlassMethod < Method
    def klass_name
      js_namespace.to_a.slice(-2)
    end
    
    def name
      js_namespace.to_a.last
    end
 
    def namespace
      js_namespace.to_a.slice(0..-2).join(".")
    end
  end
  
  class Utility < Method
    def klass_name
      nil
    end
    
    def name
      utility_name.text_value
    end
    
    def full_name
      "#{name}"
    end
    
    def namespace
      ""
    end
  end
  
  class InstanceMethod < Method
    def full_name
      "#{super}##{name}"
    end
  end
  
  class Constructor < Method
    def name
      "new"
    end
    
    def full_name
      "new #{super}"
    end
  end
  
  class KlassProperty < Base
    def klass_name
      js_namespace.to_a.slice(-2)
    end
    
    def name
      js_namespace.to_a.last
    end
 
    def namespace
      js_namespace.to_a.slice(0..-2).join(".")
    end
  end
  
  class InstanceProperty < Base
    def full_name
      "#{super}##{name}"
    end
  end
  
  class Constant < Base
    def klass_name
      nil
    end
    
    def name
      js_namespace.to_a.last
    end
        
    def namespace
      js_namespace.to_a.slice(0..-2).join(".")
    end
    
    def returns
      value.text_value.strip
    end
  end
  
  class Namespace < Base
    def klass_name
      nil
    end
    
    def name
      js_namespace.to_a.last
    end
 
    def namespace
      js_namespace.to_a.slice(0..-2).join(".")
    end
    
    def mixins
      second_line = elements.last
      if second_line.empty?
        []
      else
        [second_line.js_namespace].concat(second_line.more.elements.map{|e| e.elements.last})
      end
    end
  end
  
  class Klass < Namespace
    def subklass?
      !extends.elements.nil?
    end
    
    def superklass
      subklass? ? extends.elements.last : nil
    end
  end
  
  class Mixin < Namespace
  end
end