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 contextlib |
10 import os | 10 import os |
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 | 396 |
397 @contextlib.contextmanager | 397 @contextlib.contextmanager |
398 def TempDir(): | 398 def TempDir(): |
399 dirname = tempfile.mkdtemp() | 399 dirname = tempfile.mkdtemp() |
400 try: | 400 try: |
401 yield dirname | 401 yield dirname |
402 finally: | 402 finally: |
403 shutil.rmtree(dirname) | 403 shutil.rmtree(dirname) |
404 | 404 |
405 class Generator(generator.Generator): | 405 class Generator(generator.Generator): |
406 | 406 def _GetJinjaExports(self): |
407 java_filters = { | |
408 'array_expected_length': GetArrayExpectedLength, | |
409 'array': GetArrayKind, | |
410 'constant_value': ConstantValue, | |
411 'decode_method': DecodeMethod, | |
412 'default_value': DefaultValue, | |
413 'encode_method': EncodeMethod, | |
414 'expression_to_text': ExpressionToText, | |
415 'has_method_without_response': HasMethodWithoutResponse, | |
416 'has_method_with_response': HasMethodWithResponse, | |
417 'interface_response_name': GetInterfaceResponseName, | |
418 'is_array_kind': mojom.IsArrayKind, | |
419 'is_any_handle_kind': mojom.IsAnyHandleKind, | |
420 "is_enum_kind": mojom.IsEnumKind, | |
421 'is_interface_request_kind': mojom.IsInterfaceRequestKind, | |
422 'is_map_kind': mojom.IsMapKind, | |
423 'is_nullable_kind': mojom.IsNullableKind, | |
424 'is_pointer_array_kind': IsPointerArrayKind, | |
425 'is_reference_kind': mojom.IsReferenceKind, | |
426 'is_struct_kind': mojom.IsStructKind, | |
427 'is_union_array_kind': IsUnionArrayKind, | |
428 'is_union_kind': mojom.IsUnionKind, | |
429 'java_class_for_enum': GetJavaClassForEnum, | |
430 'java_true_false': GetJavaTrueFalse, | |
431 'java_type': GetJavaType, | |
432 'method_ordinal_name': GetMethodOrdinalName, | |
433 'name': GetNameForElement, | |
434 'new_array': NewArray, | |
435 'ucc': lambda x: UpperCamelCase(x.name), | |
436 } | |
437 | |
438 def GetJinjaExports(self): | |
439 return { | 407 return { |
440 'package': GetPackage(self.module), | 408 'package': GetPackage(self.module), |
441 } | 409 } |
442 | 410 |
443 @staticmethod | 411 @staticmethod |
444 def GetTemplatePrefix(): | 412 def GetTemplatePrefix(): |
445 return "java_templates" | 413 return "java_templates" |
446 | 414 |
447 @classmethod | 415 def GetFilters(self): |
448 def GetFilters(cls): | 416 java_filters = { |
449 return cls.java_filters | 417 'array_expected_length': GetArrayExpectedLength, |
| 418 'array': GetArrayKind, |
| 419 'constant_value': ConstantValue, |
| 420 'decode_method': DecodeMethod, |
| 421 'default_value': DefaultValue, |
| 422 'encode_method': EncodeMethod, |
| 423 'expression_to_text': ExpressionToText, |
| 424 'has_method_without_response': HasMethodWithoutResponse, |
| 425 'has_method_with_response': HasMethodWithResponse, |
| 426 'interface_response_name': GetInterfaceResponseName, |
| 427 'is_array_kind': mojom.IsArrayKind, |
| 428 'is_any_handle_kind': mojom.IsAnyHandleKind, |
| 429 "is_enum_kind": mojom.IsEnumKind, |
| 430 'is_interface_request_kind': mojom.IsInterfaceRequestKind, |
| 431 'is_map_kind': mojom.IsMapKind, |
| 432 'is_nullable_kind': mojom.IsNullableKind, |
| 433 'is_pointer_array_kind': IsPointerArrayKind, |
| 434 'is_reference_kind': mojom.IsReferenceKind, |
| 435 'is_struct_kind': mojom.IsStructKind, |
| 436 'is_union_array_kind': IsUnionArrayKind, |
| 437 'is_union_kind': mojom.IsUnionKind, |
| 438 'java_class_for_enum': GetJavaClassForEnum, |
| 439 'java_true_false': GetJavaTrueFalse, |
| 440 'java_type': GetJavaType, |
| 441 'method_ordinal_name': GetMethodOrdinalName, |
| 442 'name': GetNameForElement, |
| 443 'new_array': NewArray, |
| 444 'ucc': lambda x: UpperCamelCase(x.name), |
| 445 } |
| 446 return java_filters |
450 | 447 |
451 def GetJinjaExportsForInterface(self, interface): | 448 def _GetJinjaExportsForInterface(self, interface): |
452 exports = self.GetJinjaExports() | 449 exports = self._GetJinjaExports() |
453 exports.update({'interface': interface}) | 450 exports.update({'interface': interface}) |
454 return exports | 451 return exports |
455 | 452 |
456 @UseJinja('enum.java.tmpl') | 453 @UseJinja('enum.java.tmpl') |
457 def GenerateEnumSource(self, enum): | 454 def _GenerateEnumSource(self, enum): |
458 exports = self.GetJinjaExports() | 455 exports = self._GetJinjaExports() |
459 exports.update({'enum': enum}) | 456 exports.update({'enum': enum}) |
460 return exports | 457 return exports |
461 | 458 |
462 @UseJinja('struct.java.tmpl') | 459 @UseJinja('struct.java.tmpl') |
463 def GenerateStructSource(self, struct): | 460 def _GenerateStructSource(self, struct): |
464 exports = self.GetJinjaExports() | 461 exports = self._GetJinjaExports() |
465 exports.update({'struct': struct}) | 462 exports.update({'struct': struct}) |
466 return exports | 463 return exports |
467 | 464 |
468 @UseJinja('union.java.tmpl') | 465 @UseJinja('union.java.tmpl') |
469 def GenerateUnionSource(self, union): | 466 def _GenerateUnionSource(self, union): |
470 exports = self.GetJinjaExports() | 467 exports = self._GetJinjaExports() |
471 exports.update({'union': union}) | 468 exports.update({'union': union}) |
472 return exports | 469 return exports |
473 | 470 |
474 @UseJinja('interface.java.tmpl') | 471 @UseJinja('interface.java.tmpl') |
475 def GenerateInterfaceSource(self, interface): | 472 def _GenerateInterfaceSource(self, interface): |
476 return self.GetJinjaExportsForInterface(interface) | 473 return self._GetJinjaExportsForInterface(interface) |
477 | 474 |
478 @UseJinja('interface_internal.java.tmpl') | 475 @UseJinja('interface_internal.java.tmpl') |
479 def GenerateInterfaceInternalSource(self, interface): | 476 def _GenerateInterfaceInternalSource(self, interface): |
480 return self.GetJinjaExportsForInterface(interface) | 477 return self._GetJinjaExportsForInterface(interface) |
481 | 478 |
482 @UseJinja('constants.java.tmpl') | 479 @UseJinja('constants.java.tmpl') |
483 def GenerateConstantsSource(self, module): | 480 def _GenerateConstantsSource(self, module): |
484 exports = self.GetJinjaExports() | 481 exports = self._GetJinjaExports() |
485 exports.update({'main_entity': GetConstantsMainEntityName(module), | 482 exports.update({'main_entity': GetConstantsMainEntityName(module), |
486 'constants': module.constants}) | 483 'constants': module.constants}) |
487 return exports | 484 return exports |
488 | 485 |
489 def DoGenerateFiles(self): | 486 def _DoGenerateFiles(self): |
490 fileutil.EnsureDirectoryExists(self.output_dir) | 487 fileutil.EnsureDirectoryExists(self.output_dir) |
491 | 488 |
492 # Keep this above the others as .GetStructs() changes the state of the | 489 # Keep this above the others as .GetStructs() changes the state of the |
493 # module, annotating structs with required information. | 490 # module, annotating structs with required information. |
494 for struct in self.GetStructs(): | 491 for struct in self.GetStructs(): |
495 self.Write(self.GenerateStructSource(struct), | 492 self.Write(self._GenerateStructSource(struct), |
496 '%s.java' % GetNameForElement(struct)) | 493 '%s.java' % GetNameForElement(struct)) |
497 | 494 |
498 for union in self.module.unions: | 495 for union in self.module.unions: |
499 self.Write(self.GenerateUnionSource(union), | 496 self.Write(self._GenerateUnionSource(union), |
500 '%s.java' % GetNameForElement(union)) | 497 '%s.java' % GetNameForElement(union)) |
501 | 498 |
502 for enum in self.module.enums: | 499 for enum in self.module.enums: |
503 self.Write(self.GenerateEnumSource(enum), | 500 self.Write(self._GenerateEnumSource(enum), |
504 '%s.java' % GetNameForElement(enum)) | 501 '%s.java' % GetNameForElement(enum)) |
505 | 502 |
506 for interface in self.GetInterfaces(): | 503 for interface in self.GetInterfaces(): |
507 self.Write(self.GenerateInterfaceSource(interface), | 504 self.Write(self._GenerateInterfaceSource(interface), |
508 '%s.java' % GetNameForElement(interface)) | 505 '%s.java' % GetNameForElement(interface)) |
509 self.Write(self.GenerateInterfaceInternalSource(interface), | 506 self.Write(self._GenerateInterfaceInternalSource(interface), |
510 '%s_Internal.java' % GetNameForElement(interface)) | 507 '%s_Internal.java' % GetNameForElement(interface)) |
511 | 508 |
512 if self.module.constants: | 509 if self.module.constants: |
513 self.Write(self.GenerateConstantsSource(self.module), | 510 self.Write(self._GenerateConstantsSource(self.module), |
514 '%s.java' % GetConstantsMainEntityName(self.module)) | 511 '%s.java' % GetConstantsMainEntityName(self.module)) |
515 | 512 |
516 def GenerateFiles(self, unparsed_args): | 513 def GenerateFiles(self, unparsed_args): |
517 # TODO(rockot): Support variant output for Java. | 514 # TODO(rockot): Support variant output for Java. |
518 if self.variant: | 515 if self.variant: |
519 raise Exception("Variants not supported in Java bindings.") | 516 raise Exception("Variants not supported in Java bindings.") |
520 | 517 |
521 parser = argparse.ArgumentParser() | 518 parser = argparse.ArgumentParser() |
522 parser.add_argument('--java_output_directory', dest='java_output_directory') | 519 parser.add_argument('--java_output_directory', dest='java_output_directory') |
523 args = parser.parse_args(unparsed_args) | 520 args = parser.parse_args(unparsed_args) |
524 package_path = GetPackage(self.module).replace('.', '/') | 521 package_path = GetPackage(self.module).replace('.', '/') |
525 | 522 |
526 # Generate the java files in a temporary directory and place a single | 523 # Generate the java files in a temporary directory and place a single |
527 # srcjar in the output directory. | 524 # srcjar in the output directory. |
528 basename = self.MatchMojomFilePath("%s.srcjar" % self.module.name) | 525 basename = self.MatchMojomFilePath("%s.srcjar" % self.module.name) |
529 zip_filename = os.path.join(self.output_dir, basename) | 526 zip_filename = os.path.join(self.output_dir, basename) |
530 with TempDir() as temp_java_root: | 527 with TempDir() as temp_java_root: |
531 self.output_dir = os.path.join(temp_java_root, package_path) | 528 self.output_dir = os.path.join(temp_java_root, package_path) |
532 self.DoGenerateFiles(); | 529 self._DoGenerateFiles(); |
533 build_utils.ZipDir(zip_filename, temp_java_root) | 530 build_utils.ZipDir(zip_filename, temp_java_root) |
534 | 531 |
535 if args.java_output_directory: | 532 if args.java_output_directory: |
536 # If requested, generate the java files directly into indicated directory. | 533 # If requested, generate the java files directly into indicated directory. |
537 self.output_dir = os.path.join(args.java_output_directory, package_path) | 534 self.output_dir = os.path.join(args.java_output_directory, package_path) |
538 self.DoGenerateFiles(); | 535 self._DoGenerateFiles(); |
539 | 536 |
540 def GetJinjaParameters(self): | 537 def GetJinjaParameters(self): |
541 return { | 538 return { |
542 'lstrip_blocks': True, | 539 'lstrip_blocks': True, |
543 'trim_blocks': True, | 540 'trim_blocks': True, |
544 } | 541 } |
545 | 542 |
546 def GetGlobals(self): | 543 def GetGlobals(self): |
547 return { | 544 return { |
548 'namespace': self.module.namespace, | 545 'namespace': self.module.namespace, |
549 'module': self.module, | 546 'module': self.module, |
550 } | 547 } |
OLD | NEW |