OLD | NEW |
---|---|
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 ast |
9 import contextlib | |
9 import os | 10 import os |
10 import re | 11 import re |
11 | 12 |
12 from jinja2 import contextfilter | 13 from jinja2 import contextfilter |
13 | 14 |
14 import mojom.generate.generator as generator | 15 import mojom.generate.generator as generator |
15 import mojom.generate.module as mojom | 16 import mojom.generate.module as mojom |
16 from mojom.generate.template_expander import UseJinja | 17 from mojom.generate.template_expander import UseJinja |
17 | 18 |
18 | 19 |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
343 if method.response_parameters: | 344 if method.response_parameters: |
344 return True | 345 return True |
345 return False | 346 return False |
346 | 347 |
347 def HasMethodWithoutResponse(interface): | 348 def HasMethodWithoutResponse(interface): |
348 for method in interface.methods: | 349 for method in interface.methods: |
349 if not method.response_parameters: | 350 if not method.response_parameters: |
350 return True | 351 return True |
351 return False | 352 return False |
352 | 353 |
354 @contextlib.contextmanager | |
355 def TempDir(): | |
ppi
2014/09/25 18:16:49
Do you think these two should be extracted to, say
| |
356 import tempfile | |
357 import shutil | |
358 dirname = tempfile.mkdtemp() | |
359 try: | |
360 yield dirname | |
361 finally: | |
362 shutil.rmtree(dirname) | |
363 | |
364 def ZipContentInto(directory, root, zip_filename): | |
365 import zipfile | |
366 with zipfile.ZipFile(zip_filename, 'w') as zip_file: | |
367 for dirname, subdirs, files in os.walk(directory): | |
368 for filename in files: | |
369 path = os.path.join(dirname, filename) | |
370 arcname = os.path.relpath(path, root) | |
371 zip_file.write(path, arcname) | |
372 print "%s -> %s" % (path, arcname,) | |
373 | |
353 class Generator(generator.Generator): | 374 class Generator(generator.Generator): |
354 | 375 |
355 java_filters = { | 376 java_filters = { |
356 'interface_response_name': GetInterfaceResponseName, | 377 'interface_response_name': GetInterfaceResponseName, |
357 'constant_value': ConstantValue, | 378 'constant_value': ConstantValue, |
358 'default_value': DefaultValue, | 379 'default_value': DefaultValue, |
359 'decode_method': DecodeMethod, | 380 'decode_method': DecodeMethod, |
360 'expression_to_text': ExpressionToText, | 381 'expression_to_text': ExpressionToText, |
361 'encode_method': EncodeMethod, | 382 'encode_method': EncodeMethod, |
362 'has_method_with_response': HasMethodWithResponse, | 383 'has_method_with_response': HasMethodWithResponse, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 def GenerateInterfaceInternalSource(self, interface): | 431 def GenerateInterfaceInternalSource(self, interface): |
411 return self.GetJinjaExportsForInterface(interface) | 432 return self.GetJinjaExportsForInterface(interface) |
412 | 433 |
413 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters) | 434 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters) |
414 def GenerateConstantsSource(self, module): | 435 def GenerateConstantsSource(self, module): |
415 exports = self.GetJinjaExports() | 436 exports = self.GetJinjaExports() |
416 exports.update({'main_entity': GetConstantsMainEntityName(module), | 437 exports.update({'main_entity': GetConstantsMainEntityName(module), |
417 'constants': module.constants}) | 438 'constants': module.constants}) |
418 return exports | 439 return exports |
419 | 440 |
420 def GenerateFiles(self, unparsed_args): | 441 def DoGenerateFiles(self): |
421 parser = argparse.ArgumentParser() | 442 if not os.path.exists(self.output_dir): |
422 parser.add_argument('--java_output_directory', dest='java_output_directory') | 443 try: |
423 args = parser.parse_args(unparsed_args) | 444 os.makedirs(self.output_dir) |
424 if self.output_dir and args.java_output_directory: | 445 except: |
425 self.output_dir = os.path.join(args.java_output_directory, | 446 # Ignore errors on directory creation. |
426 GetPackage(self.module).replace('.', '/')) | 447 pass |
427 if not os.path.exists(self.output_dir): | |
428 try: | |
429 os.makedirs(self.output_dir) | |
430 except: | |
431 # Ignore errors on directory creation. | |
432 pass | |
433 | 448 |
434 # Keep this above the others as .GetStructs() changes the state of the | 449 # Keep this above the others as .GetStructs() changes the state of the |
435 # module, annotating structs with required information. | 450 # module, annotating structs with required information. |
436 for struct in self.GetStructs(): | 451 for struct in self.GetStructs(): |
437 self.Write(self.GenerateStructSource(struct), | 452 self.Write(self.GenerateStructSource(struct), |
438 '%s.java' % GetNameForElement(struct)) | 453 '%s.java' % GetNameForElement(struct)) |
439 | 454 |
440 for enum in self.module.enums: | 455 for enum in self.module.enums: |
441 self.Write(self.GenerateEnumSource(enum), | 456 self.Write(self.GenerateEnumSource(enum), |
442 '%s.java' % GetNameForElement(enum)) | 457 '%s.java' % GetNameForElement(enum)) |
443 | 458 |
444 for interface in self.module.interfaces: | 459 for interface in self.module.interfaces: |
445 self.Write(self.GenerateInterfaceSource(interface), | 460 self.Write(self.GenerateInterfaceSource(interface), |
446 '%s.java' % GetNameForElement(interface)) | 461 '%s.java' % GetNameForElement(interface)) |
447 self.Write(self.GenerateInterfaceInternalSource(interface), | 462 self.Write(self.GenerateInterfaceInternalSource(interface), |
448 '%s_Internal.java' % GetNameForElement(interface)) | 463 '%s_Internal.java' % GetNameForElement(interface)) |
449 | 464 |
450 if self.module.constants: | 465 if self.module.constants: |
451 self.Write(self.GenerateConstantsSource(self.module), | 466 self.Write(self.GenerateConstantsSource(self.module), |
452 '%s.java' % GetConstantsMainEntityName(self.module)) | 467 '%s.java' % GetConstantsMainEntityName(self.module)) |
453 | 468 |
469 def GenerateFiles(self, unparsed_args): | |
470 parser = argparse.ArgumentParser() | |
471 parser.add_argument('--java_output_directory', dest='java_output_directory') | |
472 parser.add_argument('--java_srcjar', dest='java_srcjar', | |
473 action='store_true', | |
474 help='output a single srcjar in the regular output ' | |
475 'directory (overrides --java_output_directory)') | |
476 args = parser.parse_args(unparsed_args) | |
477 package_path = GetPackage(self.module).replace('.', '/') | |
478 if args.java_srcjar: | |
479 # Place the output srcjar in the regular output directory. | |
480 zip_filename = os.path.join(self.output_dir, | |
481 "%s.srcjar" % self.module.name) | |
482 # Generate the files in a temporary directory. | |
483 with TempDir() as temp_java_root: | |
484 self.output_dir = os.path.join(temp_java_root, package_path) | |
485 self.DoGenerateFiles(); | |
486 ZipContentInto(self.output_dir, temp_java_root, zip_filename) | |
487 else: | |
488 if self.output_dir and args.java_output_directory: | |
489 self.output_dir = os.path.join(args.java_output_directory, package_path) | |
490 self.DoGenerateFiles(); | |
491 | |
454 def GetJinjaParameters(self): | 492 def GetJinjaParameters(self): |
455 return { | 493 return { |
456 'lstrip_blocks': True, | 494 'lstrip_blocks': True, |
457 'trim_blocks': True, | 495 'trim_blocks': True, |
458 } | 496 } |
459 | 497 |
460 def GetGlobals(self): | 498 def GetGlobals(self): |
461 return { | 499 return { |
462 'namespace': self.module.namespace, | 500 'namespace': self.module.namespace, |
463 'module': self.module, | 501 'module': self.module, |
464 } | 502 } |
OLD | NEW |