Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / mojo / public / bindings / pylib / generate / mojom_data.py
index 9723f58..9a575a8 100644 (file)
@@ -54,20 +54,38 @@ def KindFromData(kinds, data):
   kinds[data] = kind
   return kind
 
+def ImportFromData(module, data):
+  import_module = data['module']
+
+  import_item = {}
+  import_item['module_name'] = import_module.name
+  import_item['namespace'] = import_module.namespace
+  import_item['module'] = import_module
+
+  # Copy the struct kinds from our imports into the current module.
+  for kind in import_module.kinds.itervalues():
+    # TODO(mpcomplete): Handle enums
+    if isinstance(kind, mojom.Struct) and kind.imported_from is None:
+      kind = mojom.Struct.CreateFromImport(kind, import_item)
+      module.kinds[kind.spec] = kind
+  return import_item
+
 def StructToData(struct):
   return {
     istr(0, 'name'): struct.name,
     istr(1, 'fields'): map(FieldToData, struct.fields)
   }
 
-def StructFromData(kinds, data):
+def StructFromData(module, data):
   struct = mojom.Struct()
   struct.name = data['name']
-  struct.spec = 'x:' + struct.name
-  kinds[struct.spec] = struct
-  struct.fields = map(lambda field: FieldFromData(kinds, field), data['fields'])
+  struct.spec = 'x:' + module.namespace + '.' + struct.name
+  module.kinds[struct.spec] = struct
+  struct.fields = map(lambda field:
+      FieldFromData(module.kinds, field), data['fields'])
   if data.has_key('enums'):
-    struct.enums = map(lambda enum: EnumFromData(kinds, enum), data['enums'])
+    struct.enums = map(lambda enum:
+        EnumFromData(module.kinds, enum), data['enums'])
   return struct
 
 def FieldToData(field):
@@ -133,14 +151,17 @@ def InterfaceToData(interface):
     istr(2, 'methods'): map(MethodToData, interface.methods)
   }
 
-def InterfaceFromData(kinds, data):
+def InterfaceFromData(module, data):
   interface = mojom.Interface()
   interface.name = data['name']
+  interface.spec = 'x:' + module.namespace + '.' + interface.name
   interface.peer = data['peer'] if data.has_key('peer') else None
+  module.kinds[interface.spec] = interface
   interface.methods = map(
-      lambda method: MethodFromData(kinds, method), data['methods'])
+      lambda method: MethodFromData(module.kinds, method), data['methods'])
   if data.has_key('enums'):
-    interface.enums = map(lambda enum: EnumFromData(kinds, enum), data['enums'])
+    interface.enums = map(lambda enum:
+        EnumFromData(module.kinds, enum), data['enums'])
   return interface
 
 def EnumFieldFromData(kinds, data):
@@ -165,20 +186,26 @@ def ModuleToData(module):
   }
 
 def ModuleFromData(data):
-  kinds = {}
+  module = mojom.Module()
+  module.kinds = {}
   for kind in mojom.PRIMITIVES:
-    kinds[kind.spec] = kind
+    module.kinds[kind.spec] = kind
 
-  module = mojom.Module()
   module.name = data['name']
   module.namespace = data['namespace']
+  # Imports must come first, because they add to module.kinds which is used
+  # by by the others.
+  module.imports = map(
+      lambda import_data: ImportFromData(module, import_data),
+      data['imports'])
   module.structs = map(
-      lambda struct: StructFromData(kinds, struct), data['structs'])
+      lambda struct: StructFromData(module, struct), data['structs'])
   module.interfaces = map(
-      lambda interface: InterfaceFromData(kinds, interface), data['interfaces'])
+      lambda interface: InterfaceFromData(module, interface),
+      data['interfaces'])
   if data.has_key('enums'):
     module.enums = map(
-        lambda enum: EnumFromData(kinds, enum), data['enums'])
+        lambda enum: EnumFromData(module.kinds, enum), data['enums'])
   return module
 
 def OrderedModuleFromData(data):