| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 """Node classes for the AST for a Mojo IDL file.""" | 5 """Node classes for the AST for a Mojo IDL file.""" |
| 6 | 6 |
| 7 # Note: For convenience of testing, you probably want to define __eq__() methods | 7 # Note: For convenience of testing, you probably want to define __eq__() methods |
| 8 # for all node types; it's okay to be slightly lax (e.g., not compare filename | 8 # for all node types; it's okay to be slightly lax (e.g., not compare filename |
| 9 # and lineno). You may also define __repr__() to help with analyzing test | 9 # and lineno). You may also define __repr__() to help with analyzing test |
| 10 # failures, especially for more complex types. | 10 # failures, especially for more complex types. |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 77 if self.items: | 77 if self.items: |
| 78 self.filename = self.items[0].filename | 78 self.filename = self.items[0].filename |
| 79 self.lineno = self.items[0].lineno | 79 self.lineno = self.items[0].lineno |
| 80 | 80 |
| 81 | 81 |
| 82 class Definition(NodeBase): | 82 class Definition(NodeBase): |
| 83 """Represents a definition of anything that has a global name (e.g., enums, | 83 """Represents a definition of anything that has a global name (e.g., enums, |
| 84 enum values, consts, structs, struct fields, interfaces). (This does not | 84 enum values, consts, structs, struct fields, interfaces). (This does not |
| 85 include parameter definitions.) This class is meant to be subclassed.""" | 85 include parameter definitions.) This class is meant to be subclassed.""" |
| 86 | 86 |
| 87 def __init__(self, name, **kwargs): | 87 def __init__(self, mojom_name, **kwargs): |
| 88 assert isinstance(name, str) | 88 assert isinstance(mojom_name, str) |
| 89 NodeBase.__init__(self, **kwargs) | 89 NodeBase.__init__(self, **kwargs) |
| 90 self.name = name | 90 self.mojom_name = mojom_name |
| 91 | 91 |
| 92 | 92 |
| 93 ################################################################################ | 93 ################################################################################ |
| 94 | 94 |
| 95 | 95 |
| 96 class Attribute(NodeBase): | 96 class Attribute(NodeBase): |
| 97 """Represents an attribute.""" | 97 """Represents an attribute.""" |
| 98 | 98 |
| 99 def __init__(self, key, value, **kwargs): | 99 def __init__(self, key, value, **kwargs): |
| 100 assert isinstance(key, str) | 100 assert isinstance(key, str) |
| 101 super(Attribute, self).__init__(**kwargs) | 101 super(Attribute, self).__init__(**kwargs) |
| 102 self.key = key | 102 self.key = key |
| 103 self.value = value | 103 self.value = value |
| 104 | 104 |
| 105 def __eq__(self, other): | 105 def __eq__(self, other): |
| 106 return super(Attribute, self).__eq__(other) and \ | 106 return super(Attribute, self).__eq__(other) and \ |
| 107 self.key == other.key and \ | 107 self.key == other.key and \ |
| 108 self.value == other.value | 108 self.value == other.value |
| 109 | 109 |
| 110 | 110 |
| 111 class AttributeList(NodeListBase): | 111 class AttributeList(NodeListBase): |
| 112 """Represents a list attributes.""" | 112 """Represents a list attributes.""" |
| 113 | 113 |
| 114 _list_item_type = Attribute | 114 _list_item_type = Attribute |
| 115 | 115 |
| 116 | 116 |
| 117 class Const(Definition): | 117 class Const(Definition): |
| 118 """Represents a const definition.""" | 118 """Represents a const definition.""" |
| 119 | 119 |
| 120 def __init__(self, name, typename, value, **kwargs): | 120 def __init__(self, mojom_name, typename, value, **kwargs): |
| 121 # The typename is currently passed through as a string. | 121 # The typename is currently passed through as a string. |
| 122 assert isinstance(typename, str) | 122 assert isinstance(typename, str) |
| 123 # The value is either a literal (currently passed through as a string) or a | 123 # The value is either a literal (currently passed through as a string) or a |
| 124 # "wrapped identifier". | 124 # "wrapped identifier". |
| 125 assert isinstance(value, str) or isinstance(value, tuple) | 125 assert isinstance(value, str) or isinstance(value, tuple) |
| 126 super(Const, self).__init__(name, **kwargs) | 126 super(Const, self).__init__(mojom_name, **kwargs) |
| 127 self.typename = typename | 127 self.typename = typename |
| 128 self.value = value | 128 self.value = value |
| 129 | 129 |
| 130 def __eq__(self, other): | 130 def __eq__(self, other): |
| 131 return super(Const, self).__eq__(other) and \ | 131 return super(Const, self).__eq__(other) and \ |
| 132 self.typename == other.typename and \ | 132 self.typename == other.typename and \ |
| 133 self.value == other.value | 133 self.value == other.value |
| 134 | 134 |
| 135 | 135 |
| 136 class Enum(Definition): | 136 class Enum(Definition): |
| 137 """Represents an enum definition.""" | 137 """Represents an enum definition.""" |
| 138 | 138 |
| 139 def __init__(self, name, attribute_list, enum_value_list, **kwargs): | 139 def __init__(self, mojom_name, attribute_list, enum_value_list, **kwargs): |
| 140 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 140 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 141 assert enum_value_list is None or isinstance(enum_value_list, EnumValueList) | 141 assert enum_value_list is None or isinstance(enum_value_list, EnumValueList) |
| 142 super(Enum, self).__init__(name, **kwargs) | 142 super(Enum, self).__init__(mojom_name, **kwargs) |
| 143 self.attribute_list = attribute_list | 143 self.attribute_list = attribute_list |
| 144 self.enum_value_list = enum_value_list | 144 self.enum_value_list = enum_value_list |
| 145 | 145 |
| 146 def __eq__(self, other): | 146 def __eq__(self, other): |
| 147 return super(Enum, self).__eq__(other) and \ | 147 return super(Enum, self).__eq__(other) and \ |
| 148 self.attribute_list == other.attribute_list and \ | 148 self.attribute_list == other.attribute_list and \ |
| 149 self.enum_value_list == other.enum_value_list | 149 self.enum_value_list == other.enum_value_list |
| 150 | 150 |
| 151 | 151 |
| 152 class EnumValue(Definition): | 152 class EnumValue(Definition): |
| 153 """Represents a definition of an enum value.""" | 153 """Represents a definition of an enum value.""" |
| 154 | 154 |
| 155 def __init__(self, name, attribute_list, value, **kwargs): | 155 def __init__(self, mojom_name, attribute_list, value, **kwargs): |
| 156 # The optional value is either an int (which is current a string) or a | 156 # The optional value is either an int (which is current a string) or a |
| 157 # "wrapped identifier". | 157 # "wrapped identifier". |
| 158 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 158 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 159 assert value is None or isinstance(value, (str, tuple)) | 159 assert value is None or isinstance(value, (str, tuple)) |
| 160 super(EnumValue, self).__init__(name, **kwargs) | 160 super(EnumValue, self).__init__(mojom_name, **kwargs) |
| 161 self.attribute_list = attribute_list | 161 self.attribute_list = attribute_list |
| 162 self.value = value | 162 self.value = value |
| 163 | 163 |
| 164 def __eq__(self, other): | 164 def __eq__(self, other): |
| 165 return super(EnumValue, self).__eq__(other) and \ | 165 return super(EnumValue, self).__eq__(other) and \ |
| 166 self.attribute_list == other.attribute_list and \ | 166 self.attribute_list == other.attribute_list and \ |
| 167 self.value == other.value | 167 self.value == other.value |
| 168 | 168 |
| 169 | 169 |
| 170 class EnumValueList(NodeListBase): | 170 class EnumValueList(NodeListBase): |
| (...skipping 18 matching lines...) Expand all Loading... |
| 189 | 189 |
| 190 class ImportList(NodeListBase): | 190 class ImportList(NodeListBase): |
| 191 """Represents a list (i.e., sequence) of import statements.""" | 191 """Represents a list (i.e., sequence) of import statements.""" |
| 192 | 192 |
| 193 _list_item_type = Import | 193 _list_item_type = Import |
| 194 | 194 |
| 195 | 195 |
| 196 class Interface(Definition): | 196 class Interface(Definition): |
| 197 """Represents an interface definition.""" | 197 """Represents an interface definition.""" |
| 198 | 198 |
| 199 def __init__(self, name, attribute_list, body, **kwargs): | 199 def __init__(self, mojom_name, attribute_list, body, **kwargs): |
| 200 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 200 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 201 assert isinstance(body, InterfaceBody) | 201 assert isinstance(body, InterfaceBody) |
| 202 super(Interface, self).__init__(name, **kwargs) | 202 super(Interface, self).__init__(mojom_name, **kwargs) |
| 203 self.attribute_list = attribute_list | 203 self.attribute_list = attribute_list |
| 204 self.body = body | 204 self.body = body |
| 205 | 205 |
| 206 def __eq__(self, other): | 206 def __eq__(self, other): |
| 207 return super(Interface, self).__eq__(other) and \ | 207 return super(Interface, self).__eq__(other) and \ |
| 208 self.attribute_list == other.attribute_list and \ | 208 self.attribute_list == other.attribute_list and \ |
| 209 self.body == other.body | 209 self.body == other.body |
| 210 | 210 |
| 211 | 211 |
| 212 class Method(Definition): | 212 class Method(Definition): |
| 213 """Represents a method definition.""" | 213 """Represents a method definition.""" |
| 214 | 214 |
| 215 def __init__(self, name, attribute_list, ordinal, parameter_list, | 215 def __init__(self, mojom_name, attribute_list, ordinal, parameter_list, |
| 216 response_parameter_list, **kwargs): | 216 response_parameter_list, **kwargs): |
| 217 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 217 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 218 assert ordinal is None or isinstance(ordinal, Ordinal) | 218 assert ordinal is None or isinstance(ordinal, Ordinal) |
| 219 assert isinstance(parameter_list, ParameterList) | 219 assert isinstance(parameter_list, ParameterList) |
| 220 assert response_parameter_list is None or \ | 220 assert response_parameter_list is None or \ |
| 221 isinstance(response_parameter_list, ParameterList) | 221 isinstance(response_parameter_list, ParameterList) |
| 222 super(Method, self).__init__(name, **kwargs) | 222 super(Method, self).__init__(mojom_name, **kwargs) |
| 223 self.attribute_list = attribute_list | 223 self.attribute_list = attribute_list |
| 224 self.ordinal = ordinal | 224 self.ordinal = ordinal |
| 225 self.parameter_list = parameter_list | 225 self.parameter_list = parameter_list |
| 226 self.response_parameter_list = response_parameter_list | 226 self.response_parameter_list = response_parameter_list |
| 227 | 227 |
| 228 def __eq__(self, other): | 228 def __eq__(self, other): |
| 229 return super(Method, self).__eq__(other) and \ | 229 return super(Method, self).__eq__(other) and \ |
| 230 self.attribute_list == other.attribute_list and \ | 230 self.attribute_list == other.attribute_list and \ |
| 231 self.ordinal == other.ordinal and \ | 231 self.ordinal == other.ordinal and \ |
| 232 self.parameter_list == other.parameter_list and \ | 232 self.parameter_list == other.parameter_list and \ |
| 233 self.response_parameter_list == other.response_parameter_list | 233 self.response_parameter_list == other.response_parameter_list |
| 234 | 234 |
| 235 | 235 |
| 236 # This needs to be declared after |Method|. | 236 # This needs to be declared after |Method|. |
| 237 class InterfaceBody(NodeListBase): | 237 class InterfaceBody(NodeListBase): |
| 238 """Represents the body of (i.e., list of definitions inside) an interface.""" | 238 """Represents the body of (i.e., list of definitions inside) an interface.""" |
| 239 | 239 |
| 240 _list_item_type = (Const, Enum, Method) | 240 _list_item_type = (Const, Enum, Method) |
| 241 | 241 |
| 242 | 242 |
| 243 class Module(NodeBase): | 243 class Module(NodeBase): |
| 244 """Represents a module statement.""" | 244 """Represents a module statement.""" |
| 245 | 245 |
| 246 def __init__(self, name, attribute_list, **kwargs): | 246 def __init__(self, mojom_namespace, attribute_list, **kwargs): |
| 247 # |name| is either none or a "wrapped identifier". | 247 # |mojom_namespace| is either none or a "wrapped identifier". |
| 248 assert name is None or isinstance(name, tuple) | 248 assert mojom_namespace is None or isinstance(mojom_namespace, tuple) |
| 249 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 249 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 250 super(Module, self).__init__(**kwargs) | 250 super(Module, self).__init__(**kwargs) |
| 251 self.name = name | 251 self.mojom_namespace = mojom_namespace |
| 252 self.attribute_list = attribute_list | 252 self.attribute_list = attribute_list |
| 253 | 253 |
| 254 def __eq__(self, other): | 254 def __eq__(self, other): |
| 255 return super(Module, self).__eq__(other) and \ | 255 return super(Module, self).__eq__(other) and \ |
| 256 self.name == other.name and \ | 256 self.mojom_namespace == other.mojom_namespace and \ |
| 257 self.attribute_list == other.attribute_list | 257 self.attribute_list == other.attribute_list |
| 258 | 258 |
| 259 | 259 |
| 260 class Mojom(NodeBase): | 260 class Mojom(NodeBase): |
| 261 """Represents an entire .mojom file. (This is the root node.)""" | 261 """Represents an entire .mojom file. (This is the root node.)""" |
| 262 | 262 |
| 263 def __init__(self, module, import_list, definition_list, **kwargs): | 263 def __init__(self, module, import_list, definition_list, **kwargs): |
| 264 assert module is None or isinstance(module, Module) | 264 assert module is None or isinstance(module, Module) |
| 265 assert isinstance(import_list, ImportList) | 265 assert isinstance(import_list, ImportList) |
| 266 assert isinstance(definition_list, list) | 266 assert isinstance(definition_list, list) |
| (...skipping 22 matching lines...) Expand all Loading... |
| 289 self.value = value | 289 self.value = value |
| 290 | 290 |
| 291 def __eq__(self, other): | 291 def __eq__(self, other): |
| 292 return super(Ordinal, self).__eq__(other) and \ | 292 return super(Ordinal, self).__eq__(other) and \ |
| 293 self.value == other.value | 293 self.value == other.value |
| 294 | 294 |
| 295 | 295 |
| 296 class Parameter(NodeBase): | 296 class Parameter(NodeBase): |
| 297 """Represents a method request or response parameter.""" | 297 """Represents a method request or response parameter.""" |
| 298 | 298 |
| 299 def __init__(self, name, attribute_list, ordinal, typename, **kwargs): | 299 def __init__(self, mojom_name, attribute_list, ordinal, typename, **kwargs): |
| 300 assert isinstance(name, str) | 300 assert isinstance(mojom_name, str) |
| 301 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 301 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 302 assert ordinal is None or isinstance(ordinal, Ordinal) | 302 assert ordinal is None or isinstance(ordinal, Ordinal) |
| 303 assert isinstance(typename, str) | 303 assert isinstance(typename, str) |
| 304 super(Parameter, self).__init__(**kwargs) | 304 super(Parameter, self).__init__(**kwargs) |
| 305 self.name = name | 305 self.mojom_name = mojom_name |
| 306 self.attribute_list = attribute_list | 306 self.attribute_list = attribute_list |
| 307 self.ordinal = ordinal | 307 self.ordinal = ordinal |
| 308 self.typename = typename | 308 self.typename = typename |
| 309 | 309 |
| 310 def __eq__(self, other): | 310 def __eq__(self, other): |
| 311 return super(Parameter, self).__eq__(other) and \ | 311 return super(Parameter, self).__eq__(other) and \ |
| 312 self.name == other.name and \ | 312 self.mojom_name == other.mojom_name and \ |
| 313 self.attribute_list == other.attribute_list and \ | 313 self.attribute_list == other.attribute_list and \ |
| 314 self.ordinal == other.ordinal and \ | 314 self.ordinal == other.ordinal and \ |
| 315 self.typename == other.typename | 315 self.typename == other.typename |
| 316 | 316 |
| 317 | 317 |
| 318 class ParameterList(NodeListBase): | 318 class ParameterList(NodeListBase): |
| 319 """Represents a list of (method request or response) parameters.""" | 319 """Represents a list of (method request or response) parameters.""" |
| 320 | 320 |
| 321 _list_item_type = Parameter | 321 _list_item_type = Parameter |
| 322 | 322 |
| 323 | 323 |
| 324 class Struct(Definition): | 324 class Struct(Definition): |
| 325 """Represents a struct definition.""" | 325 """Represents a struct definition.""" |
| 326 | 326 |
| 327 def __init__(self, name, attribute_list, body, **kwargs): | 327 def __init__(self, mojom_name, attribute_list, body, **kwargs): |
| 328 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 328 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 329 assert isinstance(body, StructBody) or body is None | 329 assert isinstance(body, StructBody) or body is None |
| 330 super(Struct, self).__init__(name, **kwargs) | 330 super(Struct, self).__init__(mojom_name, **kwargs) |
| 331 self.attribute_list = attribute_list | 331 self.attribute_list = attribute_list |
| 332 self.body = body | 332 self.body = body |
| 333 | 333 |
| 334 def __eq__(self, other): | 334 def __eq__(self, other): |
| 335 return super(Struct, self).__eq__(other) and \ | 335 return super(Struct, self).__eq__(other) and \ |
| 336 self.attribute_list == other.attribute_list and \ | 336 self.attribute_list == other.attribute_list and \ |
| 337 self.body == other.body | 337 self.body == other.body |
| 338 | 338 |
| 339 | 339 |
| 340 class StructField(Definition): | 340 class StructField(Definition): |
| 341 """Represents a struct field definition.""" | 341 """Represents a struct field definition.""" |
| 342 | 342 |
| 343 def __init__(self, name, attribute_list, ordinal, typename, default_value, | 343 def __init__(self, mojom_name, attribute_list, ordinal, typename, |
| 344 **kwargs): | 344 default_value, **kwargs): |
| 345 assert isinstance(name, str) | 345 assert isinstance(mojom_name, str) |
| 346 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 346 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 347 assert ordinal is None or isinstance(ordinal, Ordinal) | 347 assert ordinal is None or isinstance(ordinal, Ordinal) |
| 348 assert isinstance(typename, str) | 348 assert isinstance(typename, str) |
| 349 # The optional default value is currently either a value as a string or a | 349 # The optional default value is currently either a value as a string or a |
| 350 # "wrapped identifier". | 350 # "wrapped identifier". |
| 351 assert default_value is None or isinstance(default_value, (str, tuple)) | 351 assert default_value is None or isinstance(default_value, (str, tuple)) |
| 352 super(StructField, self).__init__(name, **kwargs) | 352 super(StructField, self).__init__(mojom_name, **kwargs) |
| 353 self.attribute_list = attribute_list | 353 self.attribute_list = attribute_list |
| 354 self.ordinal = ordinal | 354 self.ordinal = ordinal |
| 355 self.typename = typename | 355 self.typename = typename |
| 356 self.default_value = default_value | 356 self.default_value = default_value |
| 357 | 357 |
| 358 def __eq__(self, other): | 358 def __eq__(self, other): |
| 359 return super(StructField, self).__eq__(other) and \ | 359 return super(StructField, self).__eq__(other) and \ |
| 360 self.attribute_list == other.attribute_list and \ | 360 self.attribute_list == other.attribute_list and \ |
| 361 self.ordinal == other.ordinal and \ | 361 self.ordinal == other.ordinal and \ |
| 362 self.typename == other.typename and \ | 362 self.typename == other.typename and \ |
| 363 self.default_value == other.default_value | 363 self.default_value == other.default_value |
| 364 | 364 |
| 365 | 365 |
| 366 # This needs to be declared after |StructField|. | 366 # This needs to be declared after |StructField|. |
| 367 class StructBody(NodeListBase): | 367 class StructBody(NodeListBase): |
| 368 """Represents the body of (i.e., list of definitions inside) a struct.""" | 368 """Represents the body of (i.e., list of definitions inside) a struct.""" |
| 369 | 369 |
| 370 _list_item_type = (Const, Enum, StructField) | 370 _list_item_type = (Const, Enum, StructField) |
| 371 | 371 |
| 372 | 372 |
| 373 class Union(Definition): | 373 class Union(Definition): |
| 374 """Represents a union definition.""" | 374 """Represents a union definition.""" |
| 375 | 375 |
| 376 def __init__(self, name, attribute_list, body, **kwargs): | 376 def __init__(self, mojom_name, attribute_list, body, **kwargs): |
| 377 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 377 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 378 assert isinstance(body, UnionBody) | 378 assert isinstance(body, UnionBody) |
| 379 super(Union, self).__init__(name, **kwargs) | 379 super(Union, self).__init__(mojom_name, **kwargs) |
| 380 self.attribute_list = attribute_list | 380 self.attribute_list = attribute_list |
| 381 self.body = body | 381 self.body = body |
| 382 | 382 |
| 383 def __eq__(self, other): | 383 def __eq__(self, other): |
| 384 return super(Union, self).__eq__(other) and \ | 384 return super(Union, self).__eq__(other) and \ |
| 385 self.attribute_list == other.attribute_list and \ | 385 self.attribute_list == other.attribute_list and \ |
| 386 self.body == other.body | 386 self.body == other.body |
| 387 | 387 |
| 388 | 388 |
| 389 class UnionField(Definition): | 389 class UnionField(Definition): |
| 390 | 390 |
| 391 def __init__(self, name, attribute_list, ordinal, typename, **kwargs): | 391 def __init__(self, mojom_name, attribute_list, ordinal, typename, **kwargs): |
| 392 assert isinstance(name, str) | 392 assert isinstance(mojom_name, str) |
| 393 assert attribute_list is None or isinstance(attribute_list, AttributeList) | 393 assert attribute_list is None or isinstance(attribute_list, AttributeList) |
| 394 assert ordinal is None or isinstance(ordinal, Ordinal) | 394 assert ordinal is None or isinstance(ordinal, Ordinal) |
| 395 assert isinstance(typename, str) | 395 assert isinstance(typename, str) |
| 396 super(UnionField, self).__init__(name, **kwargs) | 396 super(UnionField, self).__init__(mojom_name, **kwargs) |
| 397 self.attribute_list = attribute_list | 397 self.attribute_list = attribute_list |
| 398 self.ordinal = ordinal | 398 self.ordinal = ordinal |
| 399 self.typename = typename | 399 self.typename = typename |
| 400 | 400 |
| 401 def __eq__(self, other): | 401 def __eq__(self, other): |
| 402 return super(UnionField, self).__eq__(other) and \ | 402 return super(UnionField, self).__eq__(other) and \ |
| 403 self.attribute_list == other.attribute_list and \ | 403 self.attribute_list == other.attribute_list and \ |
| 404 self.ordinal == other.ordinal and \ | 404 self.ordinal == other.ordinal and \ |
| 405 self.typename == other.typename | 405 self.typename == other.typename |
| 406 | 406 |
| 407 | 407 |
| 408 class UnionBody(NodeListBase): | 408 class UnionBody(NodeListBase): |
| 409 | 409 |
| 410 _list_item_type = UnionField | 410 _list_item_type = UnionField |
| OLD | NEW |