Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(333)

Side by Side Diff: mojo/public/tools/bindings/generators/mojom_java_generator.py

Issue 306893010: Generate java bindings for structs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Follow review Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 """Generates java source files from a mojom.Module.""" 5 """Generates java source files from a mojom.Module."""
6 6
7 import argparse 7 import argparse
8 import os 8 import os
9 import re 9 import re
10 10
11 import mojom.generate.generator as generator 11 import mojom.generate.generator as generator
12 import mojom.generate.module as mojom 12 import mojom.generate.module as mojom
13 import mojom.generate.pack as pack
rmcilroy 2014/06/05 11:01:17 nit - remove unneeded import.
qsr 2014/06/05 11:46:11 Done.
13 from mojom.generate.template_expander import UseJinja 14 from mojom.generate.template_expander import UseJinja
14 15
15 16
16 GENERATOR_PREFIX = 'java' 17 GENERATOR_PREFIX = 'java'
17 18
18 _spec_to_java_type = { 19 _spec_to_java_type = {
19 'b': 'boolean', 20 'b': 'boolean',
20 'd': 'double', 21 'd': 'double',
21 'f': 'float', 22 'f': 'float',
22 'h:d:c': 'org.chromium.mojo.system.DataPipe.ConsumerHandle', 23 'h:d:c': 'org.chromium.mojo.system.DataPipe.ConsumerHandle',
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
55 uccc = UpperCamelCase(name) 56 uccc = UpperCamelCase(name)
56 return uccc[0].lower() + uccc[1:] 57 return uccc[0].lower() + uccc[1:]
57 58
58 def ConstantStyle(name): 59 def ConstantStyle(name):
59 components = NameToComponent(name) 60 components = NameToComponent(name)
60 if components[0] == 'k': 61 if components[0] == 'k':
61 components = components[1:] 62 components = components[1:]
62 return '_'.join([x.upper() for x in components]) 63 return '_'.join([x.upper() for x in components])
63 64
64 def GetNameForElement(element): 65 def GetNameForElement(element):
65 if (isinstance(element, mojom.Enum) or 66 if isinstance(element, (mojom.Enum,
66 isinstance(element, mojom.Interface) or 67 mojom.Interface,
67 isinstance(element, mojom.Struct)): 68 mojom.Struct)):
68 return UpperCamelCase(element.name) 69 return UpperCamelCase(element.name)
69 if (isinstance(element, mojom.Method) or 70 if isinstance(element, mojom.InterfaceRequest):
70 isinstance(element, mojom.Parameter) or 71 return GetNameForElement(element.kind)
71 isinstance(element, mojom.Field)): 72 if isinstance(element, (mojom.Method,
73 mojom.Parameter,
74 mojom.Field)):
72 return CamelCase(element.name) 75 return CamelCase(element.name)
73 if isinstance(element, mojom.EnumValue): 76 if isinstance(element, mojom.EnumValue):
74 return (UpperCamelCase(element.enum_name) + '.' + 77 return (UpperCamelCase(element.enum_name) + '.' +
75 ConstantStyle(element.name)) 78 ConstantStyle(element.name))
76 if (isinstance(element, mojom.NamedValue) or 79 if isinstance(element, (mojom.NamedValue,
77 isinstance(element, mojom.Constant)): 80 mojom.Constant)):
78 return ConstantStyle(element.name) 81 return ConstantStyle(element.name)
79 raise Exception("Unexpected element: " % element) 82 raise Exception("Unexpected element: " % element)
80 83
81 def ParseStringAttribute(attribute): 84 def ParseStringAttribute(attribute):
82 if isinstance(attribute, basestring): 85 if isinstance(attribute, basestring):
83 return attribute 86 return attribute
84 assert attribute[0] == 'EXPRESSION' 87 assert attribute[0] == 'EXPRESSION'
85 assert len(attribute[1]) == 1 88 assert len(attribute[1]) == 1
86 return attribute[1][0][1:-1].encode('string_escape') 89 return attribute[1][0][1:-1].encode('string_escape')
87 90
88 def GetPackage(module): 91 def GetPackage(module):
89 if 'JavaPackage' in module.attributes: 92 if 'JavaPackage' in module.attributes:
90 return ParseStringAttribute(module.attributes['JavaPackage']) 93 return ParseStringAttribute(module.attributes['JavaPackage'])
91 # Default package. 94 # Default package.
92 return "org.chromium.mojom." + module.namespace 95 return "org.chromium.mojom." + module.namespace
93 96
97 def GetSuperClass(method):
98 return "org.chromium.mojo.bindings.Struct"
99
94 def GetNameForKind(kind): 100 def GetNameForKind(kind):
95 def _GetNameHierachy(kind): 101 def _GetNameHierachy(kind):
96 hierachy = [] 102 hierachy = []
97 if kind.parent_kind: 103 if kind.parent_kind:
98 hierachy = _GetNameHierachy(kind.parent_kind) 104 hierachy = _GetNameHierachy(kind.parent_kind)
99 hierachy.append(kind.name) 105 hierachy.append(GetNameForElement(kind))
100 return hierachy 106 return hierachy
101 107
102 elements = [GetPackage(kind.module)] 108 elements = [GetPackage(kind.module)]
103 elements += _GetNameHierachy(kind) 109 elements += _GetNameHierachy(kind)
104 return '.'.join(elements) 110 return '.'.join(elements)
105 111
106 def GetJavaType(kind): 112 def GetJavaType(kind):
107 if isinstance(kind, (mojom.Struct, mojom.Interface)): 113 if isinstance(kind, (mojom.Struct, mojom.Interface)):
108 return GetNameForKind(kind) 114 return GetNameForKind(kind)
115 if isinstance(kind, mojom.InterfaceRequest):
116 return GetNameForKind(kind.kind)
109 if isinstance(kind, mojom.Array): 117 if isinstance(kind, mojom.Array):
110 return "%s[]" % GetJavaType(kind.kind) 118 return "%s[]" % GetJavaType(kind.kind)
111 if isinstance(kind, mojom.Enum): 119 if isinstance(kind, mojom.Enum):
112 return "int" 120 return "int"
113 return _spec_to_java_type[kind.spec] 121 return _spec_to_java_type[kind.spec]
114 122
123 def IsHandle(kind):
124 return kind.spec[0] == 'h'
125
115 def TranslateConstants(token, module): 126 def TranslateConstants(token, module):
116 def _TranslateNamedValue(named_value): 127 def _TranslateNamedValue(named_value):
117 entity_name = GetNameForElement(named_value) 128 entity_name = GetNameForElement(named_value)
118 if named_value.parent_kind: 129 if named_value.parent_kind:
119 return GetJavaType(named_value.parent_kind) + '.' + entity_name 130 return GetJavaType(named_value.parent_kind) + '.' + entity_name
120 # Handle the case where named_value is a module level constant: 131 # Handle the case where named_value is a module level constant:
121 if not isinstance(named_value, mojom.EnumValue): 132 if not isinstance(named_value, mojom.EnumValue):
122 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' + 133 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' +
123 entity_name) 134 entity_name)
124 return GetPackage(named_value.module) + '.' + entity_name 135 return GetPackage(named_value.module) + '.' + entity_name
(...skipping 16 matching lines...) Expand all
141 return ParseStringAttribute(module.attributes['JavaConstantsClassName']) 152 return ParseStringAttribute(module.attributes['JavaConstantsClassName'])
142 # This constructs the name of the embedding classes for module level constants 153 # This constructs the name of the embedding classes for module level constants
143 # by extracting the mojom's filename and prepending it to Constants. 154 # by extracting the mojom's filename and prepending it to Constants.
144 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) + 155 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) +
145 'Constants') 156 'Constants')
146 157
147 class Generator(generator.Generator): 158 class Generator(generator.Generator):
148 159
149 java_filters = { 160 java_filters = {
150 "expression_to_text": ExpressionToText, 161 "expression_to_text": ExpressionToText,
162 "is_handle": IsHandle,
151 "java_type": GetJavaType, 163 "java_type": GetJavaType,
152 "name": GetNameForElement, 164 "name": GetNameForElement,
165 "super_class": GetSuperClass,
153 "verify_token_type": generator.VerifyTokenType, 166 "verify_token_type": generator.VerifyTokenType,
154 } 167 }
155 168
156 def GetJinjaExports(self): 169 def GetJinjaExports(self):
157 return { 170 return {
158 "module": self.module, 171 "module": self.module,
159 "package": GetPackage(self.module), 172 "package": GetPackage(self.module),
160 } 173 }
161 174
175 @UseJinja("java_templates/enum.java.tmpl", filters=java_filters,
176 lstrip_blocks=True, trim_blocks=True)
177 def GenerateEnumSource(self, enum):
178 exports = self.GetJinjaExports()
179 exports.update({"enum": enum})
180 return exports
181
182 @UseJinja("java_templates/struct.java.tmpl", filters=java_filters,
183 lstrip_blocks=True, trim_blocks=True)
184 def GenerateStructSource(self, struct):
185 exports = self.GetJinjaExports()
186 exports.update({"struct": struct})
187 return exports
188
162 @UseJinja("java_templates/constants.java.tmpl", filters=java_filters, 189 @UseJinja("java_templates/constants.java.tmpl", filters=java_filters,
163 lstrip_blocks=True, trim_blocks=True) 190 lstrip_blocks=True, trim_blocks=True)
164 def GenerateConstantsSource(self, module): 191 def GenerateConstantsSource(self, module):
165 exports = self.GetJinjaExports() 192 exports = self.GetJinjaExports()
166 exports.update({"main_entity": GetConstantsMainEntityName(module), 193 exports.update({"main_entity": GetConstantsMainEntityName(module),
167 "constants": module.constants}) 194 "constants": module.constants})
168 return exports 195 return exports
169 196
170 def GenerateFiles(self, unparsed_args): 197 def GenerateFiles(self, unparsed_args):
171 parser = argparse.ArgumentParser() 198 parser = argparse.ArgumentParser()
172 parser.add_argument("--java_output_directory", dest="java_output_directory") 199 parser.add_argument("--java_output_directory", dest="java_output_directory")
173 args = parser.parse_args(unparsed_args) 200 args = parser.parse_args(unparsed_args)
174 if self.output_dir and args.java_output_directory: 201 if self.output_dir and args.java_output_directory:
175 self.output_dir = os.path.join(args.java_output_directory, 202 self.output_dir = os.path.join(args.java_output_directory,
176 GetPackage(self.module).replace('.', '/')) 203 GetPackage(self.module).replace('.', '/'))
177 if not os.path.exists(self.output_dir): 204 if not os.path.exists(self.output_dir):
178 try: 205 try:
179 os.makedirs(self.output_dir) 206 os.makedirs(self.output_dir)
180 except: 207 except:
181 # Ignore errors on directory creation. 208 # Ignore errors on directory creation.
182 pass 209 pass
183 210
211 for enum in self.module.enums:
212 self.Write(self.GenerateEnumSource(enum),
213 "%s.java" % GetNameForElement(enum))
214
215 for struct in self.module.structs:
216 self.Write(self.GenerateStructSource(struct),
217 "%s.java" % GetNameForElement(struct))
218
184 if self.module.constants: 219 if self.module.constants:
185 self.Write(self.GenerateConstantsSource(self.module), 220 self.Write(self.GenerateConstantsSource(self.module),
186 "%s.java" % GetConstantsMainEntityName(self.module)) 221 "%s.java" % GetConstantsMainEntityName(self.module))
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698