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(): | |
356 import tempfile | |
357 import shutil | |
qsr
2014/09/26 15:57:12
import should not be local.
ppi
2014/09/26 16:12:16
Done.
| |
358 dirname = tempfile.mkdtemp() | |
359 try: | |
360 yield dirname | |
361 finally: | |
362 shutil.rmtree(dirname) | |
363 | |
364 def ZipContentInto(directory, root, zip_filename): | |
qsr
2014/09/26 15:57:12
You can only pass root here, and do a traversal fr
ppi
2014/09/26 16:12:16
Done.
ppi
2014/09/26 16:12:16
Done.
| |
365 import zipfile | |
qsr
2014/09/26 15:57:12
Same
ppi
2014/09/26 16:12:16
Done.
| |
366 with zipfile.ZipFile(zip_filename, 'w') as zip_file: | |
367 for dirname, subdirs, files in os.walk(directory): | |
qsr
2014/09/26 15:57:12
If you do not use a variable, use _.
ppi
2014/09/26 16:12:16
Done.
| |
368 for filename in files: | |
369 path = os.path.join(dirname, filename) | |
370 arcname = os.path.relpath(path, root) | |
qsr
2014/09/26 15:57:12
What does arcname mean? something more descriptive
ppi
2014/09/26 16:12:16
Done.
| |
371 zip_file.write(path, arcname) | |
372 | |
353 class Generator(generator.Generator): | 373 class Generator(generator.Generator): |
354 | 374 |
355 java_filters = { | 375 java_filters = { |
356 'interface_response_name': GetInterfaceResponseName, | 376 'interface_response_name': GetInterfaceResponseName, |
357 'constant_value': ConstantValue, | 377 'constant_value': ConstantValue, |
358 'default_value': DefaultValue, | 378 'default_value': DefaultValue, |
359 'decode_method': DecodeMethod, | 379 'decode_method': DecodeMethod, |
360 'expression_to_text': ExpressionToText, | 380 'expression_to_text': ExpressionToText, |
361 'encode_method': EncodeMethod, | 381 'encode_method': EncodeMethod, |
362 'has_method_with_response': HasMethodWithResponse, | 382 'has_method_with_response': HasMethodWithResponse, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
410 def GenerateInterfaceInternalSource(self, interface): | 430 def GenerateInterfaceInternalSource(self, interface): |
411 return self.GetJinjaExportsForInterface(interface) | 431 return self.GetJinjaExportsForInterface(interface) |
412 | 432 |
413 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters) | 433 @UseJinja('java_templates/constants.java.tmpl', filters=java_filters) |
414 def GenerateConstantsSource(self, module): | 434 def GenerateConstantsSource(self, module): |
415 exports = self.GetJinjaExports() | 435 exports = self.GetJinjaExports() |
416 exports.update({'main_entity': GetConstantsMainEntityName(module), | 436 exports.update({'main_entity': GetConstantsMainEntityName(module), |
417 'constants': module.constants}) | 437 'constants': module.constants}) |
418 return exports | 438 return exports |
419 | 439 |
420 def GenerateFiles(self, unparsed_args): | 440 def DoGenerateFiles(self): |
421 parser = argparse.ArgumentParser() | 441 if not os.path.exists(self.output_dir): |
422 parser.add_argument('--java_output_directory', dest='java_output_directory') | 442 try: |
423 args = parser.parse_args(unparsed_args) | 443 os.makedirs(self.output_dir) |
424 if self.output_dir and args.java_output_directory: | 444 except: |
425 self.output_dir = os.path.join(args.java_output_directory, | 445 # Ignore errors on directory creation. |
426 GetPackage(self.module).replace('.', '/')) | 446 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 | 447 |
434 # Keep this above the others as .GetStructs() changes the state of the | 448 # Keep this above the others as .GetStructs() changes the state of the |
435 # module, annotating structs with required information. | 449 # module, annotating structs with required information. |
436 for struct in self.GetStructs(): | 450 for struct in self.GetStructs(): |
437 self.Write(self.GenerateStructSource(struct), | 451 self.Write(self.GenerateStructSource(struct), |
438 '%s.java' % GetNameForElement(struct)) | 452 '%s.java' % GetNameForElement(struct)) |
439 | 453 |
440 for enum in self.module.enums: | 454 for enum in self.module.enums: |
441 self.Write(self.GenerateEnumSource(enum), | 455 self.Write(self.GenerateEnumSource(enum), |
442 '%s.java' % GetNameForElement(enum)) | 456 '%s.java' % GetNameForElement(enum)) |
443 | 457 |
444 for interface in self.module.interfaces: | 458 for interface in self.module.interfaces: |
445 self.Write(self.GenerateInterfaceSource(interface), | 459 self.Write(self.GenerateInterfaceSource(interface), |
446 '%s.java' % GetNameForElement(interface)) | 460 '%s.java' % GetNameForElement(interface)) |
447 self.Write(self.GenerateInterfaceInternalSource(interface), | 461 self.Write(self.GenerateInterfaceInternalSource(interface), |
448 '%s_Internal.java' % GetNameForElement(interface)) | 462 '%s_Internal.java' % GetNameForElement(interface)) |
449 | 463 |
450 if self.module.constants: | 464 if self.module.constants: |
451 self.Write(self.GenerateConstantsSource(self.module), | 465 self.Write(self.GenerateConstantsSource(self.module), |
452 '%s.java' % GetConstantsMainEntityName(self.module)) | 466 '%s.java' % GetConstantsMainEntityName(self.module)) |
453 | 467 |
468 def GenerateFiles(self, unparsed_args): | |
469 parser = argparse.ArgumentParser() | |
470 parser.add_argument('--java_output_directory', dest='java_output_directory') | |
471 args = parser.parse_args(unparsed_args) | |
472 package_path = GetPackage(self.module).replace('.', '/') | |
473 | |
474 if args.java_output_directory: | |
475 # If requested, generate the java files directly into indicated directory. | |
476 self.output_dir = os.path.join(args.java_output_directory, package_path) | |
477 self.DoGenerateFiles(); | |
478 else: | |
qsr
2014/09/26 15:57:12
You should always generate the srcjar, this is the
ppi
2014/09/26 16:12:17
Done.
| |
479 # Otherwise, generate the java files in a temporary directory and place a | |
480 # single srcjar in the output directory. | |
481 zip_filename = os.path.join(self.output_dir, | |
482 "%s.srcjar" % self.module.name) | |
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 | |
454 def GetJinjaParameters(self): | 488 def GetJinjaParameters(self): |
455 return { | 489 return { |
456 'lstrip_blocks': True, | 490 'lstrip_blocks': True, |
457 'trim_blocks': True, | 491 'trim_blocks': True, |
458 } | 492 } |
459 | 493 |
460 def GetGlobals(self): | 494 def GetGlobals(self): |
461 return { | 495 return { |
462 'namespace': self.module.namespace, | 496 'namespace': self.module.namespace, |
463 'module': self.module, | 497 'module': self.module, |
464 } | 498 } |
OLD | NEW |