Index: mojo/public/tools/bindings/pylib/mojom/generate/data.py |
diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/data.py b/mojo/public/tools/bindings/pylib/mojom/generate/data.py |
index cbe65a7c51d1b375866493ff1fa887d82f0c3451..aa7ddcaca335fd7ba65e81f62a35678996079c12 100644 |
--- a/mojo/public/tools/bindings/pylib/mojom/generate/data.py |
+++ b/mojo/public/tools/bindings/pylib/mojom/generate/data.py |
@@ -65,17 +65,17 @@ def LookupKind(kinds, spec, scope): |
return kinds.get(spec) |
-def LookupConstant(constants, name, scope): |
- """Like LookupKind, but for constants.""" |
+def LookupValue(values, name, scope): |
+ """Like LookupKind, but for constant values.""" |
for i in xrange(len(scope), -1, -1): |
if i > 0: |
test_spec = '.'.join(scope[:i]) + '.' |
test_spec += name |
- constant = constants.get(test_spec) |
- if constant: |
- return constant |
+ value = values.get(test_spec) |
+ if value: |
+ return value |
- return constants.get(name) |
+ return values.get(name) |
def KindToData(kind): |
return kind.spec |
@@ -114,12 +114,12 @@ def ImportFromData(module, data): |
kind.imported_from is None): |
kind = KindFromImport(kind, import_item) |
module.kinds[kind.spec] = kind |
- # Ditto for constants. |
- for constant in import_module.constants.itervalues(): |
- if constant.imported_from is None: |
- constant = copy.deepcopy(constant) |
- constant.imported_from = import_item |
- module.constants[constant.GetSpec()] = constant |
+ # Ditto for values. |
+ for value in import_module.values.itervalues(): |
+ if value.imported_from is None: |
+ value = copy.deepcopy(value) |
+ value.imported_from = import_item |
+ module.values[value.GetSpec()] = value |
return import_item |
@@ -137,6 +137,8 @@ def StructFromData(module, data): |
module.kinds[struct.spec] = struct |
struct.enums = map(lambda enum: |
EnumFromData(module, enum, struct), data['enums']) |
+ struct.constants = map(lambda constant: |
+ ConstantFromData(module, constant, struct), data['constants']) |
# Stash fields data here temporarily. |
struct.fields_data = data['fields'] |
return struct |
@@ -160,9 +162,9 @@ def FixupExpression(module, value, scope): |
else: |
value[i] = FixupExpression(module, value[i], scope) |
elif value: |
- constant = LookupConstant(module.constants, value, scope) |
- if constant: |
- return constant |
+ result = LookupValue(module.values, value, scope) |
+ if result: |
+ return result |
return value |
def FieldFromData(module, data, struct): |
@@ -235,6 +237,8 @@ def InterfaceFromData(module, data): |
module.kinds[interface.spec] = interface |
interface.enums = map(lambda enum: |
EnumFromData(module, enum, interface), data['enums']) |
+ interface.constants = map(lambda constant: |
+ ConstantFromData(module, constant, interface), data['constants']) |
# Stash methods data here temporarily. |
interface.methods_data = data['methods'] |
return interface |
@@ -242,14 +246,18 @@ def InterfaceFromData(module, data): |
def EnumFieldFromData(module, enum, data, parent_kind): |
field = mojom.EnumField() |
field.name = data['name'] |
+ # TODO(mpcomplete): FixupExpression should be done in the second pass, |
+ # so constants and enums can refer to each other. |
+ # TODO(mpcomplete): But then, what if constants are initialized to an enum? Or |
+ # vice versa? |
if parent_kind: |
field.value = FixupExpression( |
module, data['value'], (module.namespace, parent_kind.name)) |
else: |
field.value = FixupExpression( |
module, data['value'], (module.namespace, )) |
- constant = mojom.Constant(module, enum, field) |
- module.constants[constant.GetSpec()] = constant |
+ value = mojom.EnumValue(module, enum, field) |
+ module.values[value.GetSpec()] = value |
return field |
def EnumFromData(module, data, parent_kind): |
@@ -267,6 +275,21 @@ def EnumFromData(module, data, parent_kind): |
module.kinds[enum.spec] = enum |
return enum |
+def ConstantFromData(module, data, parent_kind): |
+ constant = mojom.Constant() |
+ constant.name = data['name'] |
+ if parent_kind: |
+ scope = (module.namespace, parent_kind.name) |
+ else: |
+ scope = (module.namespace, ) |
+ # TODO(mpcomplete): maybe we should only support POD kinds. |
+ constant.kind = KindFromData(module.kinds, data['kind'], scope) |
+ constant.value = FixupExpression(module, data.get('value'), scope) |
+ |
+ value = mojom.NamedValue(module, parent_kind, constant.name) |
+ module.values[value.GetSpec()] = value |
+ return constant |
+ |
def ModuleToData(module): |
return { |
istr(0, 'name'): module.name, |
@@ -281,7 +304,7 @@ def ModuleFromData(data): |
for kind in mojom.PRIMITIVES: |
module.kinds[kind.spec] = kind |
- module.constants = {} |
+ module.values = {} |
module.name = data['name'] |
module.namespace = data['namespace'] |
@@ -300,6 +323,9 @@ def ModuleFromData(data): |
module.interfaces = map( |
lambda interface: InterfaceFromData(module, interface), |
data['interfaces']) |
+ module.constants = map( |
+ lambda constant: ConstantFromData(module, constant, None), |
+ data['constants']) |
# Second pass expands fields and methods. This allows fields and parameters |
# to refer to kinds defined anywhere in the mojom. |