OLD | NEW |
---|---|
(Empty) | |
1 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
nit: might be worth having an overview comment her
| |
5 import os.path | |
6 import sys | |
7 | |
8 idl_generators_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), | |
9 os.pardir, os.pardir, 'ppapi', 'generators') | |
10 if idl_generators_path not in sys.path: | |
11 sys.path.insert(0, idl_generators_path) | |
12 import idl_parser | |
13 | |
14 class Callspec(object): | |
15 ''' | |
16 Given a Callspec node representing an IDL namespace, converts into a Python | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
"an IDL namespace" -> "an IDL function declaration
| |
17 dictionary that the JSON schema compiler expects to see. | |
18 ''' | |
19 def __init__(self, callspec_node): | |
20 self.node = callspec_node | |
21 | |
22 def process(self, refs): | |
23 parameters = [] | |
24 for node in self.node.children: | |
25 parameters.append(Param(node).process(refs)) | |
26 return self.node.GetName(), parameters | |
27 | |
28 class Param(object): | |
29 ''' | |
30 Given a Param node representing an IDL namespace, converts into a Python | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
"an IDL namespace" -> "a function parameter"
| |
31 dictionary that the JSON schema compiler expects to see. | |
32 ''' | |
33 def __init__(self, param_node): | |
34 self.node = param_node | |
35 | |
36 def process(self, refs): | |
37 properties = { 'name': self.node.GetName() } | |
38 return dict(properties.items() + | |
39 Typeref(self.node.GetProperty( | |
40 'TYPEREF'), self.node).process(refs).items()) | |
41 | |
42 class Dictionary(object): | |
43 ''' | |
44 Given a Dictionary node representing an IDL namespace, converts into a Python | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
"an IDL namespace" -> "an IDL dictionary"
| |
45 dictionary that the JSON schema compiler expects to see. | |
46 ''' | |
47 def __init__(self, dictionary_node): | |
48 self.node = dictionary_node | |
49 | |
50 def process(self, refs): | |
51 properties = {} | |
52 for node in self.node.children: | |
53 if node.cls == 'Member': | |
54 k, v = Member(node).process(refs) | |
55 properties[k] = v | |
56 return { 'id': self.node.GetName(), | |
57 'properties': properties, | |
58 'type': 'object' } | |
59 | |
60 class Member(object): | |
61 ''' | |
62 Given a Member node representing an IDL namespace, converts into a Python | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
"an IDL namespace" -> "an IDL dictionary or interf
| |
63 dictionary that the JSON schema compiler expects to see. | |
64 ''' | |
65 def __init__(self, member_node): | |
66 self.node = member_node | |
67 | |
68 def process(self, refs): | |
69 properties = {} | |
70 name = self.node.GetName() | |
71 if self.node.GetProperty('OPTIONAL'): | |
72 properties['optional'] = True | |
73 if self.node.GetProperty('nodoc'): | |
74 properties['nodoc'] = True | |
75 for node in self.node.children: | |
76 if node.cls == 'Callspec': | |
77 name, parameters = Callspec(node).process(refs) | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
It would be nice to enforce somewhere that this ca
| |
78 properties['parameters'] = parameters | |
79 properties['name'] = name | |
80 typeref = self.node.GetProperty('TYPEREF') | |
81 if typeref == 'void': | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
Instead of looking for typeref==void to tell if th
miket_OOO
2012/03/07 00:23:01
Done.
| |
82 properties['type'] = 'function' | |
83 else: | |
84 properties = dict(properties.items() + | |
85 Typeref(typeref, self.node).process(refs).items()) | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
would it be clearer if instead of merging dict's h
miket_OOO
2012/03/07 00:23:01
Yes, great idea! Done.
| |
86 return name, properties | |
87 | |
88 class Typeref(object): | |
89 ''' | |
90 Given a TYPEREF property representing an IDL namespace, converts into a | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
"an IDL namespace" -> "the type of a dictionary me
| |
91 Python dictionary that the JSON schema compiler expects to see. | |
92 ''' | |
93 def __init__(self, typeref, parent): | |
94 self.typeref = typeref | |
95 self.parent = parent | |
96 | |
97 def process(self, refs): | |
98 properties = {} | |
99 if self.typeref == 'DOMString': | |
100 properties['type'] = 'string' | |
101 elif self.typeref == 'boolean': | |
102 properties['type'] = 'boolean' | |
103 elif self.typeref == 'long': | |
104 properties['type'] = 'integer' | |
105 elif self.typeref is None: | |
106 properties['type'] = 'function' | |
107 else: | |
108 try: | |
109 properties = refs[self.typeref] | |
110 except KeyError, e: | |
111 properties['$ref'] = self.typeref | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
Someday it would be cool to take note of not-yet-d
miket_OOO
2012/03/07 00:23:01
Agreed -- though at present, it's caught loudly an
asargent_no_longer_on_chrome
2012/03/07 00:42:09
Good point!
| |
112 return properties | |
113 | |
114 class Namespace(object): | |
115 ''' | |
116 Given an IDLNode representing an IDL namespace, converts into a Python | |
117 dictionary that the JSON schema compiler expects to see. | |
118 ''' | |
119 | |
120 def __init__(self, namespace_node): | |
121 self.namespace = namespace_node | |
122 self.events = [] | |
123 self.functions = [] | |
124 self.types = [] | |
125 self.refs = {} | |
126 | |
127 def process(self): | |
128 for node in self.namespace.children: | |
129 cls = node.cls | |
130 if cls == "Dictionary": | |
131 self.types.append(Dictionary(node).process(self.refs)) | |
132 elif cls == "Callback": | |
133 k, v = Member(node).process(self.refs) | |
134 self.refs[k] = v | |
135 elif cls == "Interface" and node.GetName() == "Functions": | |
136 self.functions = self.process_interface(node) | |
137 elif cls == "Interface" and node.GetName() == "Events": | |
138 self.events = self.process_interface(node) | |
139 | |
140 return { 'events': self.events, | |
141 'functions': self.functions, | |
142 'types': self.types, | |
143 'namespace': self.namespace.GetName() } | |
asargent_no_longer_on_chrome
2012/03/06 22:27:57
looks like you're missing the 'nodoc' attribute if
miket_OOO
2012/03/07 00:23:01
Fixed. I know I'm being inconsistent here because
asargent_no_longer_on_chrome
2012/03/07 00:42:09
Good point. (It was actually seeing the code elsew
| |
144 | |
145 def process_interface(self, node): | |
146 members = [] | |
147 for member in node.children: | |
148 if member.cls == 'Member': | |
149 name, properties = Member(member).process(self.refs) | |
150 members.append(properties) | |
151 return members | |
152 | |
153 class IDLSchema(object): | |
154 ''' | |
155 Given a list of IDLNodes and IDLAttributes, converts into a Python list | |
156 of api_defs that the JSON schema compiler expects to see. | |
157 ''' | |
158 | |
159 def __init__(self, idl): | |
160 self.idl = idl | |
161 | |
162 def process(self): | |
163 namespaces = [] | |
164 for node in self.idl: | |
165 if node.cls == 'Namespace': | |
166 namespace = Namespace(node) | |
167 namespaces.append(namespace.process()) | |
168 return namespaces | |
169 | |
170 def Load(filename): | |
171 ''' | |
172 Given the filename of an IDL file, parses it and returns an equivalent | |
173 Python dictionary in a format that the JSON schema compiler expects to see. | |
174 ''' | |
175 | |
176 f = open(filename, 'r') | |
177 contents = f.read() | |
178 f.close() | |
179 | |
180 idl = idl_parser.IDLParser().ParseData(contents, filename) | |
181 idl_schema = IDLSchema(idl) | |
182 return idl_schema.process() | |
OLD | NEW |