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 9import re 10 11import module as mojom 12import pack 13 14def GetStructFromMethod(method): 15 """Converts a method's parameters into the fields of a struct.""" 16 params_class = "%s_%s_Params" % (method.interface.name, method.name) 17 struct = mojom.Struct(params_class, module=method.interface.module) 18 for param in method.parameters: 19 struct.AddField(param.name, param.kind, param.ordinal) 20 struct.packed = pack.PackedStruct(struct) 21 return struct 22 23def GetResponseStructFromMethod(method): 24 """Converts a method's response_parameters into the fields of a struct.""" 25 params_class = "%s_%s_ResponseParams" % (method.interface.name, method.name) 26 struct = mojom.Struct(params_class, module=method.interface.module) 27 for param in method.response_parameters: 28 struct.AddField(param.name, param.kind, param.ordinal) 29 struct.packed = pack.PackedStruct(struct) 30 return struct 31 32def GetDataHeader(exported, struct): 33 struct.packed = pack.PackedStruct(struct) 34 struct.bytes = pack.GetByteLayout(struct.packed) 35 struct.exported = exported 36 return struct 37 38def ExpectedArraySize(kind): 39 if mojom.IsFixedArrayKind(kind): 40 return kind.length 41 return 0 42 43def StudlyCapsToCamel(studly): 44 return studly[0].lower() + studly[1:] 45 46def CamelCaseToAllCaps(camel_case): 47 return '_'.join( 48 word for word in re.split(r'([A-Z][^A-Z]+)', camel_case) if word).upper() 49 50class Generator(object): 51 # Pass |output_dir| to emit files to disk. Omit |output_dir| to echo all 52 # files to stdout. 53 def __init__(self, module, output_dir=None): 54 self.module = module 55 self.output_dir = output_dir 56 57 def GetStructsFromMethods(self): 58 result = [] 59 for interface in self.module.interfaces: 60 for method in interface.methods: 61 result.append(GetStructFromMethod(method)) 62 if method.response_parameters != None: 63 result.append(GetResponseStructFromMethod(method)) 64 return map(partial(GetDataHeader, False), result) 65 66 def GetStructs(self): 67 return map(partial(GetDataHeader, True), self.module.structs) 68 69 def Write(self, contents, filename): 70 if self.output_dir is None: 71 print contents 72 return 73 with open(os.path.join(self.output_dir, filename), "w+") as f: 74 f.write(contents) 75 76 def GenerateFiles(self, args): 77 raise NotImplementedError("Subclasses must override/implement this method") 78 79 def GetJinjaParameters(self): 80 """Returns default constructor parameters for the jinja environment.""" 81 return {} 82 83 def GetGlobals(self): 84 """Returns global mappings for the template generation.""" 85 return {} 86