webidl 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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