• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2013 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
5"""Code shared by the various language-specific code generators."""
6
7from functools import partial
8import os.path
9
10import module as mojom
11import pack
12
13def GetStructFromMethod(method):
14  """Converts a method's parameters into the fields of a struct."""
15  params_class = "%s_%s_Params" % (method.interface.name, method.name)
16  struct = mojom.Struct(params_class, module=method.interface.module)
17  for param in method.parameters:
18    struct.AddField(param.name, param.kind, param.ordinal)
19  struct.packed = pack.PackedStruct(struct)
20  return struct
21
22def GetResponseStructFromMethod(method):
23  """Converts a method's response_parameters into the fields of a struct."""
24  params_class = "%s_%s_ResponseParams" % (method.interface.name, method.name)
25  struct = mojom.Struct(params_class, module=method.interface.module)
26  for param in method.response_parameters:
27    struct.AddField(param.name, param.kind, param.ordinal)
28  struct.packed = pack.PackedStruct(struct)
29  return struct
30
31def GetDataHeader(exported, struct):
32  struct.packed = pack.PackedStruct(struct)
33  struct.bytes = pack.GetByteLayout(struct.packed)
34  struct.exported = exported
35  return struct
36
37def IsStringKind(kind):
38  return kind.spec == 's'
39
40def IsEnumKind(kind):
41  return isinstance(kind, mojom.Enum)
42
43def IsObjectKind(kind):
44  return isinstance(kind, (mojom.Struct, mojom.Array)) or IsStringKind(kind)
45
46def IsHandleKind(kind):
47  return kind.spec.startswith('h') or \
48         isinstance(kind, mojom.Interface) or \
49         isinstance(kind, mojom.InterfaceRequest)
50
51def IsInterfaceKind(kind):
52  return isinstance(kind, mojom.Interface)
53
54def IsInterfaceRequestKind(kind):
55  return isinstance(kind, mojom.InterfaceRequest)
56
57def IsMoveOnlyKind(kind):
58  return IsObjectKind(kind) or IsHandleKind(kind)
59
60def StudlyCapsToCamel(studly):
61  return studly[0].lower() + studly[1:]
62
63class Generator(object):
64  # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all
65  # files to stdout.
66  def __init__(self, module, output_dir=None):
67    self.module = module
68    self.output_dir = output_dir
69
70  def GetStructsFromMethods(self):
71    result = []
72    for interface in self.module.interfaces:
73      for method in interface.methods:
74        result.append(GetStructFromMethod(method))
75        if method.response_parameters != None:
76          result.append(GetResponseStructFromMethod(method))
77    return map(partial(GetDataHeader, False), result)
78
79  def GetStructs(self):
80    return map(partial(GetDataHeader, True), self.module.structs)
81
82  def Write(self, contents, filename):
83    if self.output_dir is None:
84      print contents
85      return
86    with open(os.path.join(self.output_dir, filename), "w+") as f:
87      f.write(contents)
88
89  def GenerateFiles(self, args):
90    raise NotImplementedError("Subclasses must override/implement this method")
91