webidl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/.autotest +9 -0
  2. data/.document +5 -0
  3. data/.gitignore +5 -0
  4. data/LICENSE +20 -0
  5. data/README.rdoc +31 -0
  6. data/Rakefile +65 -0
  7. data/VERSION +1 -0
  8. data/bin/webidl2ruby +13 -0
  9. data/examples/html5.rb +6 -0
  10. data/lib/webidl.rb +47 -0
  11. data/lib/webidl/ast/argument.rb +25 -0
  12. data/lib/webidl/ast/attribute.rb +29 -0
  13. data/lib/webidl/ast/const.rb +17 -0
  14. data/lib/webidl/ast/exception.rb +15 -0
  15. data/lib/webidl/ast/extended_attribute.rb +14 -0
  16. data/lib/webidl/ast/field.rb +14 -0
  17. data/lib/webidl/ast/implements_statement.rb +14 -0
  18. data/lib/webidl/ast/interface.rb +24 -0
  19. data/lib/webidl/ast/module.rb +17 -0
  20. data/lib/webidl/ast/node.rb +29 -0
  21. data/lib/webidl/ast/operation.rb +43 -0
  22. data/lib/webidl/ast/scoped_name.rb +28 -0
  23. data/lib/webidl/ast/type.rb +20 -0
  24. data/lib/webidl/ast/typedef.rb +15 -0
  25. data/lib/webidl/extensions/string.rb +22 -0
  26. data/lib/webidl/extensions/syntax_node.rb +5 -0
  27. data/lib/webidl/generator.rb +38 -0
  28. data/lib/webidl/generator/ruby_sexp_visitor.rb +118 -0
  29. data/lib/webidl/parse_tree/absolute_scoped_name.rb +11 -0
  30. data/lib/webidl/parse_tree/argument.rb +20 -0
  31. data/lib/webidl/parse_tree/argument_list.rb +14 -0
  32. data/lib/webidl/parse_tree/attribute.rb +17 -0
  33. data/lib/webidl/parse_tree/const.rb +9 -0
  34. data/lib/webidl/parse_tree/definitions.rb +25 -0
  35. data/lib/webidl/parse_tree/exception.rb +15 -0
  36. data/lib/webidl/parse_tree/exception_field.rb +11 -0
  37. data/lib/webidl/parse_tree/extended_attributes.rb +41 -0
  38. data/lib/webidl/parse_tree/implements_statement.rb +20 -0
  39. data/lib/webidl/parse_tree/interface.rb +21 -0
  40. data/lib/webidl/parse_tree/interface_inheritance.rb +11 -0
  41. data/lib/webidl/parse_tree/interface_members.rb +21 -0
  42. data/lib/webidl/parse_tree/module.rb +15 -0
  43. data/lib/webidl/parse_tree/nullable_type.rb +11 -0
  44. data/lib/webidl/parse_tree/operation.rb +30 -0
  45. data/lib/webidl/parse_tree/relative_scoped_name.rb +15 -0
  46. data/lib/webidl/parse_tree/scoped_name_list.rb +16 -0
  47. data/lib/webidl/parse_tree/specials.rb +17 -0
  48. data/lib/webidl/parse_tree/stringifier_attribute_or_operation.rb +16 -0
  49. data/lib/webidl/parse_tree/typedef.rb +11 -0
  50. data/lib/webidl/parser/debug_helper.rb +17 -0
  51. data/lib/webidl/parser/idl.treetop +369 -0
  52. data/spec/ast_spec.rb +218 -0
  53. data/spec/fixtures/empty_interface.idl +3 -0
  54. data/spec/fixtures/empty_module.idl +3 -0
  55. data/spec/fixtures/framework.idl +48 -0
  56. data/spec/fixtures/html5.idl +1440 -0
  57. data/spec/fixtures/interface_with_attribute.idl +7 -0
  58. data/spec/fixtures/interface_with_inheritance.idl +9 -0
  59. data/spec/fixtures/interface_with_members.idl +5 -0
  60. data/spec/fixtures/interface_with_stringifiers.idl +5 -0
  61. data/spec/fixtures/module_with_exception.idl +13 -0
  62. data/spec/fixtures/module_with_implements_statement.idl +6 -0
  63. data/spec/fixtures/module_with_typedef.idl +4 -0
  64. data/spec/fixtures/module_with_xattr_ident.idl +4 -0
  65. data/spec/fixtures/module_with_xattr_named_args.idl +5 -0
  66. data/spec/fixtures/module_with_xattr_no_arg.idl +5 -0
  67. data/spec/fixtures/module_with_xattr_scoped.idl +4 -0
  68. data/spec/fixtures/module_with_xattr_two_args.idl +4 -0
  69. data/spec/fixtures/nested.idl +4 -0
  70. data/spec/fixtures/websocket.idl +19 -0
  71. data/spec/generator_spec.rb +92 -0
  72. data/spec/parser_spec.rb +64 -0
  73. data/spec/spec_helper.rb +45 -0
  74. metadata +161 -0
@@ -0,0 +1,21 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class Interface < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ intf = Ast::Interface.new(parent, name.text_value)
7
+
8
+ unless members.empty?
9
+ members.build(intf)
10
+ end
11
+
12
+ unless inherits.empty?
13
+ intf.inherits = inherits.build(parent)
14
+ end
15
+
16
+ intf
17
+ end
18
+
19
+ end # Interface
20
+ end # ParseTree
21
+ end # WebIDL
@@ -0,0 +1,11 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class InterfaceInheritance < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ names.build(parent)
7
+ end
8
+
9
+ end # InterfaceInheritance
10
+ end # ParseTree
11
+ end # WebIDL
@@ -0,0 +1,21 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class InterfaceMembers < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ m = member.build(parent)
7
+ m.extended_attributes = eal.build(parent) unless eal.empty?
8
+
9
+ list = [m]
10
+ list += members.build(parent) unless members.empty?
11
+
12
+ if parent
13
+ parent.members = list
14
+ end
15
+
16
+ list
17
+ end
18
+
19
+ end # InterfaceMembers
20
+ end # ParseTree
21
+ end # WebIDL
@@ -0,0 +1,15 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class Module < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent = nil)
6
+ m = Ast::Module.new(parent, name.text_value)
7
+
8
+ defs.build(m)
9
+
10
+ m
11
+ end
12
+
13
+ end # Module
14
+ end # ParseTree
15
+ end # WebIDL
@@ -0,0 +1,11 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class NullableType < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ Ast::Type.new parent, type.text_value, :nullable => null.any?
7
+ end
8
+
9
+ end # NullableType
10
+ end # ParseTree
11
+ end # WebIDL
@@ -0,0 +1,30 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class Operation < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ if respond_to?(:specials)
7
+ special_list = specials.build unless specials.empty?
8
+ operation = op
9
+ else
10
+ special_list = []
11
+ operation = self
12
+ end
13
+
14
+ debugger unless operation.type.respond_to?(:build)
15
+ typ = operation.type.build(parent)
16
+ name = operation.optional_id.text_value unless operation.optional_id.empty?
17
+ arguments = operation.args.build(parent) unless operation.args.empty?
18
+ raise_list = operation.raises.build unless operation.raises.empty?
19
+
20
+ Ast::Operation.new(
21
+ parent, typ, :name => name,
22
+ :specials => special_list,
23
+ :args => arguments,
24
+ :raises => raise_list
25
+ )
26
+ end
27
+
28
+ end # Operation
29
+ end # ParseTree
30
+ end # WebIDL
@@ -0,0 +1,15 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class RelativeScopedName < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ n = ''
7
+ n << name.text_value
8
+ n << parts.text_value
9
+
10
+ sn = Ast::ScopedName.new(parent, n, :relative => true)
11
+ end
12
+
13
+ end # RelativeScopedName
14
+ end # ParseTree
15
+ end # WebIDL
@@ -0,0 +1,16 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class ScopedNameList < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ result = []
7
+
8
+ result << name.build(parent)
9
+ result += names.build(parent) unless names.empty?
10
+
11
+ result
12
+ end
13
+
14
+ end # ScopedNameList
15
+ end # ParseTree
16
+ end # WebIDL
@@ -0,0 +1,17 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class Specials < Treetop::Runtime::SyntaxNode
4
+
5
+ def build
6
+ result = []
7
+
8
+ result << first.text_value
9
+ result += rest.build unless rest.empty?
10
+
11
+ result
12
+ end
13
+
14
+
15
+ end # Specials
16
+ end # ParseTree
17
+ end # WebIDL
@@ -0,0 +1,16 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class StringifierAttributeOrOperation < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ unless a_or_op.empty? || a_or_op.text_value == ";"
7
+ elem = a_or_op.build(parent)
8
+ elem.stringifier = true
9
+
10
+ elem
11
+ end
12
+ end
13
+
14
+ end # StringifierAttributeOrOperation
15
+ end # ParseTree
16
+ end # WebIDL
@@ -0,0 +1,11 @@
1
+ module WebIDL
2
+ module ParseTree
3
+ class TypeDef < Treetop::Runtime::SyntaxNode
4
+
5
+ def build(parent)
6
+ Ast::TypeDef.new(parent, type.text_value, name.text_value)
7
+ end
8
+
9
+ end # TypeDef
10
+ end # ParseTree
11
+ end # WebIDL
@@ -0,0 +1,17 @@
1
+ module WebIDL
2
+ module Parser
3
+ module DebugHelper
4
+
5
+ def terminal_parse_failure(*args)
6
+ p :terminal_parse_failure => args
7
+ super
8
+ end
9
+
10
+ def instantiate_node(node, input, interval, *args)
11
+ p :instantiating_from => caller.first[/in `(.+)'/, 1], :str => input[interval]
12
+ super
13
+ end
14
+
15
+ end # DebugHelper
16
+ end # Parser
17
+ end # WebIDL
@@ -0,0 +1,369 @@
1
+ module WebIDL
2
+ module Parser
3
+
4
+ # http://dev.w3.org/2006/webapi/WebIDL/#idl-grammar
5
+ grammar IDL
6
+
7
+ rule Definitions
8
+ ws metadef:(eal:ExtendedAttributeList ws d:Definition ws defs:Definitions)? ws <ParseTree::Definitions>
9
+ end
10
+
11
+ rule Definition
12
+ Module
13
+ / Interface
14
+ / Exception
15
+ / TypeDef
16
+ / ImplementsStatement
17
+ end
18
+
19
+ rule Module
20
+ "module" ws name:identifier ws "{" ws defs:Definitions ws "}" ws ";" <ParseTree::Module>
21
+ end
22
+
23
+ rule Interface
24
+ "interface" ws name:identifier ws inherits:InterfaceInheritance ws "{" ws members:InterfaceMembers ws "}" ws ";" <ParseTree::Interface>
25
+ end
26
+
27
+ rule InterfaceInheritance
28
+ (":" ws names:ScopedNameList <ParseTree::InterfaceInheritance>)?
29
+ end
30
+
31
+ # extract to a generic Members syntax node?
32
+ rule InterfaceMembers
33
+ (eal:ExtendedAttributeList ws member:InterfaceMember ws members:InterfaceMembers ws <ParseTree::InterfaceMembers>)?
34
+ end
35
+
36
+ rule InterfaceMember
37
+ Const / AttributeOrOperation
38
+ end
39
+
40
+ rule Exception
41
+ "exception" ws name:identifier ws "{" ws members:ExceptionMembers ws "}" ws ";" <ParseTree::Exception>
42
+ end
43
+
44
+ # extract to a generic Members syntax node?
45
+ rule ExceptionMembers
46
+ (eal:ExtendedAttributeList ws member:ExceptionMember ws members:ExceptionMembers ws <ParseTree::InterfaceMembers>)?
47
+ end
48
+
49
+ rule TypeDef
50
+ "typedef" ws type:Type ws name:identifier ws ";" <ParseTree::TypeDef>
51
+ end
52
+
53
+ rule ImplementsStatement
54
+ implementor:ScopedName ws "implements" ws implementee:ScopedName ws ";" <ParseTree::ImplementsStatement>
55
+ end
56
+
57
+ rule Const
58
+ "const" ws type:Type ws name:identifier ws "=" ws const_expr:ConstExpr ws ";" <ParseTree::Const>
59
+ end
60
+
61
+ rule ConstExpr
62
+ BooleanLiteral / integer / float
63
+ end
64
+
65
+ rule BooleanLiteral
66
+ ("true" / "false") { def build() text_value == "true" end }
67
+ end
68
+
69
+ rule AttributeOrOperation
70
+ StringifierAttributeOrOperation / Attribute / Operation
71
+ end
72
+
73
+ rule StringifierAttributeOrOperation
74
+ "stringifier" ws a_or_op:(Attribute / OperationRest / ";") <ParseTree::StringifierAttributeOrOperation>
75
+ end
76
+
77
+ rule Attribute
78
+ readonly:ReadOnly ws "attribute" ws type:Type ws name:identifier ws getraises:GetRaises ws setraises:SetRaises ws ";" <ParseTree::Attribute>
79
+ end
80
+
81
+ rule ReadOnly
82
+ "readonly"?
83
+ end
84
+
85
+ rule GetRaises
86
+ ("getraises" ws list:ExceptionList)?
87
+ end
88
+
89
+ rule SetRaises
90
+ ("setraises" ws list:ExceptionList)?
91
+ end
92
+
93
+ rule Operation
94
+ specials:(OmittableSpecials / Specials) ws op:OperationRest <ParseTree::Operation>
95
+ end
96
+
97
+ rule OmittableSpecials
98
+ omit:"omittable" ws Specials <ParseTree::OmittableSpecials>
99
+ end
100
+
101
+ rule Specials
102
+ (first:Special ws rest:Specials <ParseTree::Specials>)?
103
+ end
104
+
105
+ rule Special
106
+ "getter"
107
+ / "setter"
108
+ / "creator"
109
+ / "deleter"
110
+ / "caller"
111
+ end
112
+
113
+ rule OperationRest
114
+ type:ReturnType ws optional_id:OptionalIdentifier ws "(" ws args:ArgumentList ws ")" ws raises:Raises ws ";" <ParseTree::Operation>
115
+ end
116
+
117
+ rule OptionalIdentifier
118
+ identifier?
119
+ end
120
+
121
+ rule Raises
122
+ ("raises" ExceptionList)?
123
+ end
124
+
125
+ rule ExceptionList
126
+ "(" ScopedNameList ")"
127
+ end
128
+
129
+ rule ArgumentList
130
+ (arg:Argument ws args:Arguments <ParseTree::ArgumentList>)?
131
+ end
132
+
133
+ rule Arguments
134
+ ("," ws arg:Argument ws args:Arguments <ParseTree::ArgumentList>)?
135
+ end
136
+
137
+ rule Argument
138
+ eal:ExtendedAttributeList ws In ws optional:Optional ws type:Type ws variadic:Ellipsis ws id:identifier <ParseTree::Argument>
139
+ end
140
+
141
+ rule In
142
+ "in"?
143
+ end
144
+
145
+ rule Optional
146
+ "optional"?
147
+ end
148
+
149
+ rule Ellipsis
150
+ "..."?
151
+ end
152
+
153
+ rule ExceptionMember
154
+ Const / ExceptionField
155
+ end
156
+
157
+ rule ExceptionField
158
+ type:Type ws id:identifier ws ";" <ParseTree::ExceptionField>
159
+ end
160
+
161
+ rule ExtendedAttributeList
162
+ ("[" ws attribute:ExtendedAttribute ws attributes:ExtendedAttributes ws "]" <ParseTree::ExtendedAttributeList>)?
163
+ end
164
+
165
+ rule ExtendedAttributes
166
+ ("," ws attribute:ExtendedAttribute ws attributes:ExtendedAttributes <ParseTree::ExtendedAttributeList>)?
167
+ end
168
+
169
+
170
+ #
171
+ # avoid infinite recursion trouble with the actual spec by using the "more restricted" ones
172
+ #
173
+
174
+ rule ExtendedAttribute
175
+ ExtendedAttributeNamedArgList
176
+ / ExtendedAttributeIdent
177
+ / ExtendedAttributeScopedName
178
+ / ExtendedAttributeArgList
179
+ / ExtendedAttributeNoArg
180
+ end
181
+
182
+ rule ExtendedAttributeNoArg
183
+ identifier {
184
+ def build(parent)
185
+ Ast::ExtendedAttribute.new(text_value)
186
+ end
187
+ }
188
+ end
189
+
190
+ rule ExtendedAttributeArgList
191
+ name:identifier "(" ws args:ArgumentList ws ")" <ParseTree::ExtendedAttributeArgList>
192
+ end
193
+
194
+ rule ExtendedAttributeScopedName
195
+ key:identifier "=" scoped_name:ScopedName <ParseTree::ExtendedAttributeScopedName>
196
+ end
197
+
198
+ rule ExtendedAttributeIdent
199
+ key:identifier "=" value:identifier !"::" <ParseTree::ExtendedAttributeIdent>
200
+ end
201
+
202
+ rule ExtendedAttributeNamedArgList
203
+ key:identifier "=" value:(name:identifier "(" ws args:ArgumentList ws ")" <ParseTree::ExtendedAttributeArgList>) <ParseTree::ExtendedAttributeNamedArgList>
204
+ end
205
+
206
+
207
+ # rule ExtendedAttribute
208
+ # "(" ws ExtendedAttributeInner ws ")" ws ExtendedAttributeRest
209
+ # / "[" ws ExtendedAttributeInner ws "]" ws ExtendedAttributeRest
210
+ # / "{" ws ExtendedAttributeInner ws "}" ws ExtendedAttributeRest
211
+ # / Other ws ExtendedAttributeRest
212
+ # end
213
+ #
214
+ # rule ExtendedAttributeRest
215
+ # ExtendedAttribute?
216
+ # end
217
+ #
218
+ # rule ExtendedAttributeInner
219
+ # ( "(" ws ExtendedAttributeInner ws ")" ws ExtendedAttributeInner
220
+ # / "[" ws ExtendedAttributeInner ws "]" ws ExtendedAttributeInner
221
+ # / "{" ws ExtendedAttributeInner ws "}" ws ExtendedAttributeInner
222
+ # / OtherOrComma ExtendedAttributeInner)?
223
+ # end
224
+ #
225
+ rule Other
226
+ integer
227
+ / float
228
+ / identifier
229
+ / string
230
+ / other
231
+ / ":"
232
+ / "::"
233
+ / ";"
234
+ / "<"
235
+ / "="
236
+ / ">"
237
+ / "DOMString"
238
+ / "FALSE"
239
+ / "Object"
240
+ / "TRUE"
241
+ / "any"
242
+ / "attribute"
243
+ / "boolean"
244
+ / "const"
245
+ / "exception"
246
+ / "float"
247
+ / "getraises"
248
+ / "in"
249
+ / "interface"
250
+ / "long"
251
+ / "module"
252
+ / "octet"
253
+ / "raises"
254
+ / "sequence"
255
+ / "setraises"
256
+ / "short"
257
+ / "typedef"
258
+ / "unsigned"
259
+ / "valuetype"
260
+ end
261
+
262
+ rule OtherOrComma
263
+ Other / ","
264
+ end
265
+
266
+ rule Type
267
+ NullableType
268
+ / ScopedName
269
+ / "any"
270
+ / "object"
271
+ end
272
+
273
+ #
274
+ # added: cannot be followed by a NonSpace character, since e.g. DOMStringMap would break parsing
275
+ #
276
+
277
+ rule NullableType
278
+ type:UnsignedIntegerType null:Nullable <ParseTree::NullableType>
279
+ / type:"boolean" null:Nullable !NonSpace <ParseTree::NullableType>
280
+ / type:"octet" null:Nullable !NonSpace <ParseTree::NullableType>
281
+ / type:"float" null:Nullable !NonSpace <ParseTree::NullableType>
282
+ / type:"double" null:Nullable !NonSpace <ParseTree::NullableType>
283
+ / type:"DOMString" null:Nullable !NonSpace <ParseTree::NullableType>
284
+ / type:"sequence" ws "<" ws Type ws ">" null:Nullable !NonSpace <ParseTree::NullableType>
285
+ end
286
+
287
+ rule UnsignedIntegerType
288
+ "unsigned" ws IntegerType / IntegerType
289
+ end
290
+
291
+ rule IntegerType
292
+ ("short" / "long" ws OptionalLong)
293
+ end
294
+
295
+ rule OptionalLong
296
+ "long"?
297
+ end
298
+
299
+ rule Nullable
300
+ "?"?
301
+ end
302
+
303
+ rule NonSpace
304
+ (!' ' .)
305
+ end
306
+
307
+ rule ReturnType
308
+ Type / "void" <ParseTree::VoidType>
309
+ end
310
+
311
+ rule ScopedNameList
312
+ name:ScopedName ws names:ScopedNames <ParseTree::ScopedNameList>
313
+ end
314
+
315
+ rule ScopedNames
316
+ ("," ScopedName ws ScopedNames)?
317
+ end
318
+
319
+ rule ScopedName
320
+ AbsoluteScopedName / RelativeScopedName
321
+ end
322
+
323
+ rule AbsoluteScopedName
324
+ "::" name:identifier parts:ScopedNameParts <ParseTree::AbsoluteScopedName>
325
+ end
326
+
327
+ rule RelativeScopedName
328
+ name:identifier parts:ScopedNameParts <ParseTree::RelativeScopedName>
329
+ end
330
+
331
+ rule ScopedNameParts
332
+ ("::" ws name:identifier parts:ScopedNameParts)?
333
+ end
334
+
335
+ rule integer
336
+ ("-"? "0" ([0-7]* / [Xx] [0-9A-Fa-f]+) / [1-9] [0-9]*) { def build() Integer(text_value) end} # TODO: check edge cases
337
+ end
338
+
339
+ rule float
340
+ ("-"? ([0-9]+ "." [0-9]* / [0-9]* "." [0-9]+) ([Ee] [+-]? [0-9]+)? / [0-9]+ [Ee] [+-]? [0-9]+) { def build() Float(text_value) end} # TODO: check edge cases
341
+ end
342
+
343
+ rule identifier
344
+ [A-Z_a-z] [0-9A-Z_a-z]* { def build() text_value[/^_?(.+)/, 1] end}
345
+ end
346
+
347
+ rule string
348
+ "\"" [^"]* "\""
349
+ end
350
+
351
+ rule ws
352
+ ([\t\n\r ]* ((line_comment / block_comment) [\t\n\r ]*)+ / [\t\n\r ]+)?
353
+ end
354
+
355
+ rule other
356
+ [^\t\n\r 0-9A-Z_a-z]
357
+ end
358
+
359
+ rule line_comment
360
+ "//" (![\n\r] . )*
361
+ end
362
+
363
+ rule block_comment
364
+ '/*' (!'*/' . )* '*/'
365
+ end
366
+
367
+ end # IDL
368
+ end # Parser
369
+ end # WebIDL