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

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

Issue 396063006: Mojo: Always suffix int literals with L in generated Java bindings. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 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
« no previous file with comments | « mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 ast
8 import os 9 import os
9 import re 10 import re
10 11
11 from jinja2 import contextfilter 12 from jinja2 import contextfilter
12 13
13 import mojom.generate.generator as generator 14 import mojom.generate.generator as generator
14 import mojom.generate.module as mojom 15 import mojom.generate.module as mojom
15 from mojom.generate.template_expander import UseJinja 16 from mojom.generate.template_expander import UseJinja
16 17
17 18
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 202
202 def IsHandle(kind): 203 def IsHandle(kind):
203 return kind.spec[0] == 'h' 204 return kind.spec[0] == 'h'
204 205
205 @contextfilter 206 @contextfilter
206 def DefaultValue(context, field): 207 def DefaultValue(context, field):
207 assert field.default 208 assert field.default
208 if isinstance(field.kind, mojom.Struct): 209 if isinstance(field.kind, mojom.Struct):
209 assert field.default == "default" 210 assert field.default == "default"
210 return "new %s()" % GetJavaType(context, field.kind) 211 return "new %s()" % GetJavaType(context, field.kind)
211 return "(%s) %s" % (GetJavaType(context, field.kind), 212 return "(%s) %s" % (
212 ExpressionToText(context, field.default)) 213 GetJavaType(context, field.kind),
214 ExpressionToText(context, field.default, kind_spec=field.kind.spec))
215
216 @contextfilter
217 def ConstantValue(context, constant):
218 return "(%s) %s" % (
219 GetJavaType(context, constant.kind),
220 ExpressionToText(context, constant.value, kind_spec=constant.kind.spec))
213 221
214 @contextfilter 222 @contextfilter
215 def NewArray(context, kind, size): 223 def NewArray(context, kind, size):
216 if IsArray(kind.kind): 224 if IsArray(kind.kind):
217 return NewArray(context, kind.kind, size) + '[]' 225 return NewArray(context, kind.kind, size) + '[]'
218 return 'new %s[%s]' % (GetJavaType(context, kind.kind), size) 226 return 'new %s[%s]' % (GetJavaType(context, kind.kind), size)
219 227
220 @contextfilter 228 @contextfilter
221 def ExpressionToText(context, token): 229 def ExpressionToText(context, token, kind_spec=''):
222 def _TranslateNamedValue(named_value): 230 def _TranslateNamedValue(named_value):
223 entity_name = GetNameForElement(named_value) 231 entity_name = GetNameForElement(named_value)
224 if named_value.parent_kind: 232 if named_value.parent_kind:
225 return GetJavaType(context, named_value.parent_kind) + '.' + entity_name 233 return GetJavaType(context, named_value.parent_kind) + '.' + entity_name
226 # Handle the case where named_value is a module level constant: 234 # Handle the case where named_value is a module level constant:
227 if not isinstance(named_value, mojom.EnumValue): 235 if not isinstance(named_value, mojom.EnumValue):
228 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' + 236 entity_name = (GetConstantsMainEntityName(named_value.module) + '.' +
229 entity_name) 237 entity_name)
230 if GetPackage(named_value.module) == GetPackage(context.resolve('module')): 238 if GetPackage(named_value.module) == GetPackage(context.resolve('module')):
231 return entity_name 239 return entity_name
232 return GetPackage(named_value.module) + '.' + entity_name 240 return GetPackage(named_value.module) + '.' + entity_name
233 241
234 if isinstance(token, mojom.NamedValue): 242 if isinstance(token, mojom.NamedValue):
235 return _TranslateNamedValue(token) 243 return _TranslateNamedValue(token)
236 # Add Long suffix to all number literals. 244 if kind_spec.startswith('i') or kind_spec.startswith('u'):
qsr 2014/07/16 09:08:38 What would happen for enum value >= 2**31? Or is i
Sam McNally 2014/07/16 09:38:49 I expect they would be treated the same as uint32
237 if re.match('^[0-9]+$', token): 245 # Add Long suffix to all integer literals.
238 number = int(token) 246 try:
247 number = ast.literal_eval(token)
248 except ValueError:
qsr 2014/07/16 09:08:38 Hum... You need this when an integer reference a c
Sam McNally 2014/07/16 09:38:49 References to other constants or enum values are h
qsr 2014/07/16 09:41:35 Thanks.
249 return token
250 if not isinstance(number, (int, long)):
251 return token
239 # If the literal is too large to fit a signed long, convert it to the 252 # If the literal is too large to fit a signed long, convert it to the
240 # equivalent signed long. 253 # equivalent signed long.
241 if number >= 2 ** 63: 254 if number >= 2 ** 63:
242 number -= 2 ** 64 255 number -= 2 ** 64
243 return '%dL' % number 256 return '%dL' % number
244 return token 257 return token
245 258
246 def IsPointerArrayKind(kind): 259 def IsPointerArrayKind(kind):
247 if not IsArray(kind): 260 if not IsArray(kind):
248 return False 261 return False
249 sub_kind = kind.kind 262 sub_kind = kind.kind
250 return generator.IsObjectKind(sub_kind) 263 return generator.IsObjectKind(sub_kind)
251 264
252 def GetConstantsMainEntityName(module): 265 def GetConstantsMainEntityName(module):
253 if 'JavaConstantsClassName' in module.attributes: 266 if 'JavaConstantsClassName' in module.attributes:
254 return ParseStringAttribute(module.attributes['JavaConstantsClassName']) 267 return ParseStringAttribute(module.attributes['JavaConstantsClassName'])
255 # This constructs the name of the embedding classes for module level constants 268 # This constructs the name of the embedding classes for module level constants
256 # by extracting the mojom's filename and prepending it to Constants. 269 # by extracting the mojom's filename and prepending it to Constants.
257 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) + 270 return (UpperCamelCase(module.path.split('/')[-1].rsplit('.', 1)[0]) +
258 'Constants') 271 'Constants')
259 272
260 class Generator(generator.Generator): 273 class Generator(generator.Generator):
261 274
262 java_filters = { 275 java_filters = {
263 "interface_response_name": GetInterfaceResponseName, 276 "interface_response_name": GetInterfaceResponseName,
277 "constant_value": ConstantValue,
264 "default_value": DefaultValue, 278 "default_value": DefaultValue,
265 "decode_method": DecodeMethod, 279 "decode_method": DecodeMethod,
266 "expression_to_text": ExpressionToText, 280 "expression_to_text": ExpressionToText,
267 "encode_method": EncodeMethod, 281 "encode_method": EncodeMethod,
268 "is_handle": IsHandle, 282 "is_handle": IsHandle,
269 "is_pointer_array_kind": IsPointerArrayKind, 283 "is_pointer_array_kind": IsPointerArrayKind,
270 "is_struct_kind": lambda kind: isinstance(kind, mojom.Struct), 284 "is_struct_kind": lambda kind: isinstance(kind, mojom.Struct),
271 "java_type": GetJavaType, 285 "java_type": GetJavaType,
272 "name": GetNameForElement, 286 "name": GetNameForElement,
273 "new_array": NewArray, 287 "new_array": NewArray,
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 def GetJinjaParameters(self): 356 def GetJinjaParameters(self):
343 return { 357 return {
344 'lstrip_blocks': True, 358 'lstrip_blocks': True,
345 'trim_blocks': True, 359 'trim_blocks': True,
346 } 360 }
347 361
348 def GetGlobals(self): 362 def GetGlobals(self):
349 return { 363 return {
350 'module': self.module, 364 'module': self.module,
351 } 365 }
OLDNEW
« no previous file with comments | « mojo/public/tools/bindings/generators/java_templates/enum_definition.tmpl ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698