reproto 0.0.9__py3-none-any.whl → 0.1.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. .git/COMMIT_EDITMSG +1 -14
  2. .git/index +0 -0
  3. .git/logs/HEAD +4 -0
  4. .git/logs/refs/heads/iyue +4 -0
  5. .git/logs/refs/remotes/gitlab/iyue +4 -0
  6. .git/logs/refs/remotes/origin/iyue +4 -0
  7. .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9 +0 -0
  8. .git/objects/1a/4435c23bdf5543e3270aa69361c9c68f205efb +0 -0
  9. .git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269 +0 -0
  10. .git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d +0 -0
  11. .git/objects/38/907894973091f8e9b224a13fe596e1cb309cf5 +0 -0
  12. .git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427 +0 -0
  13. .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c +0 -0
  14. .git/objects/4b/442fccf86631bf5196ee5b48ab8d58228ab59c +0 -0
  15. .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20 +0 -0
  16. .git/objects/67/f27f77274917580e687fd00ca18da0660215c1 +0 -0
  17. .git/objects/6f/90fcf9eacdc794313471f54279011a787c8760 +0 -0
  18. .git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f +1 -0
  19. .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470 +0 -0
  20. .git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa +0 -0
  21. .git/objects/ae/046e08176523e8a98dc7294436319f724db13c +0 -0
  22. .git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde +0 -0
  23. .git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2 +0 -0
  24. .git/objects/c8/cb3bb9552dcf6a368a1418996c4b925db2d8ab +0 -0
  25. .git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42 +0 -0
  26. .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f +0 -0
  27. .git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211 +0 -0
  28. .git/refs/heads/iyue +1 -1
  29. .git/refs/remotes/gitlab/iyue +1 -1
  30. .git/refs/remotes/origin/iyue +1 -1
  31. core/info_decoder.py +1 -1
  32. core/reconstructor.py +178 -9
  33. generation/proto_generator.py +136 -58
  34. parsing/java_parser.py +1 -1
  35. pyproject.toml +1 -1
  36. {reproto-0.0.9.dist-info → reproto-0.1.1.dist-info}/METADATA +1 -1
  37. {reproto-0.0.9.dist-info → reproto-0.1.1.dist-info}/RECORD +39 -18
  38. {reproto-0.0.9.dist-info → reproto-0.1.1.dist-info}/WHEEL +0 -0
  39. {reproto-0.0.9.dist-info → reproto-0.1.1.dist-info}/entry_points.txt +0 -0
.git/COMMIT_EDITMSG CHANGED
@@ -1,14 +1 @@
1
- 📚 更新文档:反映最新架构变化和性能优化
2
-
3
- 主要更新:
4
- - ARCHITECTURE.md: 新增性能优化章节,详细记录索引系统移除和文件缓存优化
5
- - README.md: 更新特性介绍,新增性能优化亮点和特殊类型支持说明
6
-
7
- 文档变化:
8
- ✅ 架构图更新:反映新增的文件缓存和类型工具模块
9
- ✅ 性能基准:记录20%+执行效率提升的具体数据
10
- ✅ 新增功能:MapFieldLite、Internal.ProtobufList、Well-Known Types支持
11
- ✅ 技术细节:文件缓存系统、智能路径构造、统一类型检测器
12
- ✅ 故障排除:新增性能监控和缓存统计指导
13
-
14
- 版本标识:v2.0 - 重大性能优化版本
1
+ feat(build): update version
.git/index CHANGED
Binary file
.git/logs/HEAD CHANGED
@@ -8,3 +8,7 @@ fce15b9dbffd9f37b1f2d46944ee2d0394df6565 70ded03ee69f30850c938a8129be308cb30772d
8
8
  70ded03ee69f30850c938a8129be308cb30772d9 67f54a4a3ede6749acc7c718ad97a86634215b5e iyue <ys1231@126.com> 1751004413 +0800 commit: feat: 重构类型处理系统,统一Java到Protobuf类型映射
9
9
  67f54a4a3ede6749acc7c718ad97a86634215b5e 9771dd4958faa94d3db229c129f6af35b508905a iyue <ys1231@126.com> 1751006389 +0800 commit: 🚀 性能优化:移除未使用的索引系统,提升执行效率
10
10
  9771dd4958faa94d3db229c129f6af35b508905a 9fb57064e0c53ed80af8507acaab718a1e80184e iyue <ys1231@126.com> 1751006683 +0800 commit: 📚 更新文档:反映最新架构变化和性能优化
11
+ 9fb57064e0c53ed80af8507acaab718a1e80184e e41e5aa2bc3074c2014d01ab1f603f69c327a83f iyue <ys1231@126.com> 1751010339 +0800 commit: feat: 直接使用Java源码中的实际枚举类名
12
+ e41e5aa2bc3074c2014d01ab1f603f69c327a83f b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde iyue <ys1231@126.com> 1751010729 +0800 commit: fix: 改进日志级别和错误处理
13
+ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962c iyue <ys1231@126.com> 1751011389 +0800 commit: release: v2.1.0 - 重大性能优化和功能增强
14
+ 3d3cc6aab4eefed46c77dda27503bebcce88962c 7e5935774ee7a85f2523427c9100f9c578ac172f iyue <ys1231@126.com> 1751011558 +0800 commit: feat(build): update version
.git/logs/refs/heads/iyue CHANGED
@@ -8,3 +8,7 @@ fce15b9dbffd9f37b1f2d46944ee2d0394df6565 70ded03ee69f30850c938a8129be308cb30772d
8
8
  70ded03ee69f30850c938a8129be308cb30772d9 67f54a4a3ede6749acc7c718ad97a86634215b5e iyue <ys1231@126.com> 1751004413 +0800 commit: feat: 重构类型处理系统,统一Java到Protobuf类型映射
9
9
  67f54a4a3ede6749acc7c718ad97a86634215b5e 9771dd4958faa94d3db229c129f6af35b508905a iyue <ys1231@126.com> 1751006389 +0800 commit: 🚀 性能优化:移除未使用的索引系统,提升执行效率
10
10
  9771dd4958faa94d3db229c129f6af35b508905a 9fb57064e0c53ed80af8507acaab718a1e80184e iyue <ys1231@126.com> 1751006683 +0800 commit: 📚 更新文档:反映最新架构变化和性能优化
11
+ 9fb57064e0c53ed80af8507acaab718a1e80184e e41e5aa2bc3074c2014d01ab1f603f69c327a83f iyue <ys1231@126.com> 1751010339 +0800 commit: feat: 直接使用Java源码中的实际枚举类名
12
+ e41e5aa2bc3074c2014d01ab1f603f69c327a83f b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde iyue <ys1231@126.com> 1751010729 +0800 commit: fix: 改进日志级别和错误处理
13
+ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962c iyue <ys1231@126.com> 1751011389 +0800 commit: release: v2.1.0 - 重大性能优化和功能增强
14
+ 3d3cc6aab4eefed46c77dda27503bebcce88962c 7e5935774ee7a85f2523427c9100f9c578ac172f iyue <ys1231@126.com> 1751011558 +0800 commit: feat(build): update version
@@ -7,3 +7,7 @@ fce15b9dbffd9f37b1f2d46944ee2d0394df6565 70ded03ee69f30850c938a8129be308cb30772d
7
7
  70ded03ee69f30850c938a8129be308cb30772d9 67f54a4a3ede6749acc7c718ad97a86634215b5e iyue <ys1231@126.com> 1751004471 +0800 update by push
8
8
  67f54a4a3ede6749acc7c718ad97a86634215b5e 9771dd4958faa94d3db229c129f6af35b508905a iyue <ys1231@126.com> 1751006413 +0800 update by push
9
9
  9771dd4958faa94d3db229c129f6af35b508905a 9fb57064e0c53ed80af8507acaab718a1e80184e iyue <ys1231@126.com> 1751006704 +0800 update by push
10
+ 9fb57064e0c53ed80af8507acaab718a1e80184e e41e5aa2bc3074c2014d01ab1f603f69c327a83f iyue <ys1231@126.com> 1751010362 +0800 update by push
11
+ e41e5aa2bc3074c2014d01ab1f603f69c327a83f b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde iyue <ys1231@126.com> 1751010753 +0800 update by push
12
+ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962c iyue <ys1231@126.com> 1751011478 +0800 update by push
13
+ 3d3cc6aab4eefed46c77dda27503bebcce88962c 7e5935774ee7a85f2523427c9100f9c578ac172f iyue <ys1231@126.com> 1751011568 +0800 update by push
@@ -7,3 +7,7 @@ fce15b9dbffd9f37b1f2d46944ee2d0394df6565 70ded03ee69f30850c938a8129be308cb30772d
7
7
  70ded03ee69f30850c938a8129be308cb30772d9 67f54a4a3ede6749acc7c718ad97a86634215b5e iyue <ys1231@126.com> 1751004455 +0800 update by push
8
8
  67f54a4a3ede6749acc7c718ad97a86634215b5e 9771dd4958faa94d3db229c129f6af35b508905a iyue <ys1231@126.com> 1751006400 +0800 update by push
9
9
  9771dd4958faa94d3db229c129f6af35b508905a 9fb57064e0c53ed80af8507acaab718a1e80184e iyue <ys1231@126.com> 1751006693 +0800 update by push
10
+ 9fb57064e0c53ed80af8507acaab718a1e80184e e41e5aa2bc3074c2014d01ab1f603f69c327a83f iyue <ys1231@126.com> 1751010348 +0800 update by push
11
+ e41e5aa2bc3074c2014d01ab1f603f69c327a83f b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde iyue <ys1231@126.com> 1751010741 +0800 update by push
12
+ b07a43f0462bf25a8b1f4c0ca60c1b533dae1dde 3d3cc6aab4eefed46c77dda27503bebcce88962c iyue <ys1231@126.com> 1751011447 +0800 update by push
13
+ 3d3cc6aab4eefed46c77dda27503bebcce88962c 7e5935774ee7a85f2523427c9100f9c578ac172f iyue <ys1231@126.com> 1751011577 +0800 update by push
@@ -0,0 +1 @@
1
+ x��]j�0E�>k��R(����RB�2����:�\��%���Ƕu] ����1��UѩJ,�i��,��Y�̐���2(y2+�}��X��*5������\Ă�g�i�����%�7K��m=�̑9�F����5�4g�x����o�t\]��m�.��tCr
.git/refs/heads/iyue CHANGED
@@ -1 +1 @@
1
- 9fb57064e0c53ed80af8507acaab718a1e80184e
1
+ 7e5935774ee7a85f2523427c9100f9c578ac172f
@@ -1 +1 @@
1
- 9fb57064e0c53ed80af8507acaab718a1e80184e
1
+ 7e5935774ee7a85f2523427c9100f9c578ac172f
@@ -1 +1 @@
1
- 9fb57064e0c53ed80af8507acaab718a1e80184e
1
+ 7e5935774ee7a85f2523427c9100f9c578ac172f
core/info_decoder.py CHANGED
@@ -547,7 +547,7 @@ class InfoDecoder:
547
547
  return real_type # 返回原始Java类型
548
548
  return None
549
549
  except Exception as e:
550
- self.logger.warning(f" ⚠️ 源码分析失败: {e}")
550
+ self.logger.debug(f" 🔍 源码分析失败: {e}")
551
551
  return None
552
552
 
553
553
  def _infer_message_type_from_field_name(self, field_name_raw: str) -> str:
core/reconstructor.py CHANGED
@@ -10,6 +10,7 @@ Author: AI Assistant
10
10
  """
11
11
 
12
12
  import re
13
+ import os
13
14
  from pathlib import Path
14
15
  from collections import deque
15
16
  from typing import Set, Dict, List, Optional, Tuple
@@ -408,7 +409,7 @@ class ProtoReconstructor:
408
409
  target_package = '.'.join(first_class.split('.')[:-1])
409
410
 
410
411
  if not target_package:
411
- self.logger.warning("⚠️ 无法推断目标包名,跳过枚举解析")
412
+ self.logger.error("无法推断目标包名,跳过枚举解析")
412
413
  return
413
414
 
414
415
  # 解析目标包下的所有枚举
@@ -446,7 +447,7 @@ class ProtoReconstructor:
446
447
  if not java_file_path:
447
448
  error_msg = "找不到对应的Java文件"
448
449
  self.failed_classes[class_name] = error_msg
449
- self.logger.warning(f" ❌ {error_msg}: {class_name}")
450
+ self.logger.error(f" ❌ {error_msg}: {class_name}")
450
451
  return
451
452
 
452
453
  # 2. 尝试解析为枚举
@@ -463,7 +464,7 @@ class ProtoReconstructor:
463
464
  if not info_string:
464
465
  error_msg = "无法从Java文件中提取protobuf信息"
465
466
  self.failed_classes[class_name] = error_msg
466
- self.logger.warning(f" ❌ {error_msg}: {class_name}")
467
+ self.logger.error(f" ❌ {error_msg}: {class_name}")
467
468
  return
468
469
 
469
470
  # 4. 解码字节码为消息定义
@@ -480,7 +481,7 @@ class ProtoReconstructor:
480
481
  else:
481
482
  error_msg = "字节码解码失败,可能不是protobuf消息类"
482
483
  self.failed_classes[class_name] = error_msg
483
- self.logger.warning(f" ❌ {error_msg}: {class_name}")
484
+ self.logger.error(f" ❌ {error_msg}: {class_name}")
484
485
 
485
486
  except Exception as e:
486
487
  error_msg = f"处理异常: {str(e)}"
@@ -507,6 +508,18 @@ class ProtoReconstructor:
507
508
  self.pending_classes.append(dep)
508
509
  self.logger.info(f" 🔗 发现依赖: {dep}")
509
510
 
511
+ # 处理枚举依赖
512
+ self.logger.info(f" 🔍 开始处理枚举依赖...")
513
+ enum_count = 0
514
+ for field in message_def.fields:
515
+ if self._is_enum_type(field.type_name):
516
+ self.logger.info(f" 🔢 发现枚举字段: {field.name} -> {field.type_name}")
517
+ self._process_enum_dependency(field.type_name)
518
+ enum_count += 1
519
+
520
+ if enum_count == 0:
521
+ self.logger.info(f" 📊 未发现枚举依赖")
522
+
510
523
  def _extract_dependencies(self, message_def: MessageDefinition) -> List[str]:
511
524
  """
512
525
  从消息定义中提取所有依赖的类名
@@ -535,7 +548,7 @@ class ProtoReconstructor:
535
548
 
536
549
  def _extract_field_dependencies(self, type_name: str, current_package: str) -> List[str]:
537
550
  """
538
- 从字段类型中提取所有依赖(包括map类型的键值类型)
551
+ 从字段类型中提取所有依赖(包括map类型的键值类型和枚举类型)
539
552
 
540
553
  Args:
541
554
  type_name: 字段类型名
@@ -561,12 +574,168 @@ class ProtoReconstructor:
561
574
 
562
575
  # 处理普通类型
563
576
  else:
564
- dep = self._resolve_field_dependency(type_name, current_package)
565
- if dep:
566
- dependencies.append(dep)
577
+ # 检查是否为枚举类型(以Enum开头或已知的枚举模式)
578
+ if self._is_enum_type(type_name):
579
+ # 直接处理枚举类型,尝试解析并添加到枚举定义中
580
+ self._process_enum_dependency(type_name)
581
+ else:
582
+ # 处理消息类型依赖
583
+ dep = self._resolve_field_dependency(type_name, current_package)
584
+ if dep:
585
+ dependencies.append(dep)
567
586
 
568
587
  return dependencies
569
588
 
589
+ def _is_enum_type(self, type_name: str) -> bool:
590
+ """
591
+ 判断类型名是否为枚举类型
592
+
593
+ Args:
594
+ type_name: 类型名
595
+
596
+ Returns:
597
+ 是否为枚举类型
598
+ """
599
+ # 检查是否以Enum开头(混淆后的枚举名)
600
+ if type_name.startswith('Enum'):
601
+ return True
602
+
603
+ # 检查是否在已知的枚举类型列表中
604
+ # 这里可以添加更多的枚举类型判断逻辑
605
+ return False
606
+
607
+ def _process_enum_dependency(self, type_name: str) -> None:
608
+ """
609
+ 处理枚举依赖,查找并解析枚举类
610
+
611
+ Args:
612
+ type_name: 枚举类型名
613
+ """
614
+ try:
615
+ self.logger.info(f" 🔍 搜索枚举文件: {type_name}")
616
+ # 尝试在所有包中查找这个枚举类
617
+ enum_file_path = self._find_enum_file(type_name)
618
+ if enum_file_path:
619
+ self.logger.info(f" ✅ 找到枚举文件: {enum_file_path}")
620
+ # 解析枚举文件
621
+ enum_values = self.java_parser.parse_enum_file(enum_file_path)
622
+ if enum_values:
623
+ # 构造完整的枚举类名
624
+ enum_class_name = self._get_enum_class_name_from_path(enum_file_path)
625
+ self.logger.info(f" 📝 枚举类名: {enum_class_name}")
626
+
627
+ # 创建枚举定义
628
+ enum_def = self._create_enum_definition(enum_class_name, enum_values)
629
+
630
+ # 检查是否有原始名称,如果有则使用原始名称
631
+ original_name = self._extract_original_enum_name(enum_file_path)
632
+ if original_name:
633
+ self.logger.info(f" 🏷️ 使用原始名称: {original_name}")
634
+ enum_def.name = original_name
635
+
636
+ # 添加到枚举定义中
637
+ self.enum_definitions[enum_class_name] = enum_def
638
+ self.logger.info(f" ✅ 成功处理枚举依赖: {enum_def.name} ({len(enum_def.values)} 个值)")
639
+ else:
640
+ self.logger.error(f" ❌ 枚举值解析失败: {enum_file_path}")
641
+ else:
642
+ self.logger.error(f" ❌ 未找到枚举文件: {type_name}")
643
+
644
+ except Exception as e:
645
+ self.logger.error(f" ❌ 处理枚举依赖失败 {type_name}: {e}")
646
+ import traceback
647
+ self.logger.debug(f" 详细错误: {traceback.format_exc()}")
648
+
649
+ def _find_enum_file(self, type_name: str) -> Optional[Path]:
650
+ """
651
+ 在所有包中查找枚举文件
652
+
653
+ Args:
654
+ type_name: 枚举类型名
655
+
656
+ Returns:
657
+ 枚举文件路径或None
658
+ """
659
+ # 在整个源码目录中搜索匹配的枚举文件
660
+ for root, dirs, files in os.walk(self.sources_dir):
661
+ for file in files:
662
+ if file.endswith('.java') and type_name in file:
663
+ file_path = Path(root) / file
664
+ # 检查是否确实是这个枚举类
665
+ if self._is_target_enum_file(file_path, type_name):
666
+ return file_path
667
+ return None
668
+
669
+ def _is_target_enum_file(self, file_path: Path, type_name: str) -> bool:
670
+ """
671
+ 检查文件是否是目标枚举类
672
+
673
+ Args:
674
+ file_path: Java文件路径
675
+ type_name: 目标枚举类型名
676
+
677
+ Returns:
678
+ 是否为目标枚举文件
679
+ """
680
+ try:
681
+ content = file_path.read_text(encoding='utf-8')
682
+ # 检查是否包含目标枚举类声明
683
+ enum_pattern = f'public\\s+enum\\s+{re.escape(type_name)}\\s+implements\\s+Internal\\.EnumLite'
684
+ return bool(re.search(enum_pattern, content))
685
+ except Exception:
686
+ return False
687
+
688
+ def _get_enum_class_name_from_path(self, file_path: Path) -> str:
689
+ """
690
+ 从文件路径构造完整的枚举类名
691
+
692
+ Args:
693
+ file_path: 枚举文件路径
694
+
695
+ Returns:
696
+ 完整的枚举类名
697
+ """
698
+ # 获取相对于源码目录的路径
699
+ relative_path = file_path.relative_to(self.sources_dir)
700
+
701
+ # 移除.java后缀并转换为类名
702
+ class_path = str(relative_path)[:-5] # 移除.java
703
+ class_name = class_path.replace('/', '.')
704
+
705
+ return class_name
706
+
707
+ def _extract_original_enum_name(self, file_path: Path) -> Optional[str]:
708
+ """
709
+ 从Java源码中提取实际的枚举类名
710
+
711
+ Args:
712
+ file_path: Java文件路径
713
+
714
+ Returns:
715
+ Java源码中定义的实际枚举类名
716
+ """
717
+ try:
718
+ content = file_path.read_text(encoding='utf-8')
719
+
720
+ # 查找枚举类定义: public enum ClassName 或 enum ClassName
721
+ enum_pattern = r'(?:public\s+)?enum\s+(\w+)'
722
+ match = re.search(enum_pattern, content)
723
+
724
+ if match:
725
+ enum_name = match.group(1)
726
+ self.logger.info(f" 🏷️ 从Java源码提取枚举名: {enum_name}")
727
+ return enum_name
728
+ else:
729
+ # 如果没找到enum定义,可能是接口或其他类型,使用文件名
730
+ file_name = file_path.stem
731
+ self.logger.info(f" 🏷️ 未找到enum定义,使用文件名: {file_name}")
732
+ return file_name
733
+
734
+ except Exception as e:
735
+ self.logger.debug(f" 提取枚举名失败: {e}")
736
+ # 出错时使用文件名作为fallback
737
+ return file_path.stem
738
+
570
739
  def _parse_map_types(self, map_content: str) -> tuple:
571
740
  """
572
741
  解析map类型的键值类型
@@ -1143,7 +1312,7 @@ class ProtoReconstructor:
1143
1312
  try:
1144
1313
  # 生成proto文件内容
1145
1314
  proto_content = self.proto_generator.generate_proto_file(
1146
- message_def, self.message_definitions
1315
+ message_def, self.message_definitions, self.enum_definitions
1147
1316
  )
1148
1317
 
1149
1318
  # 确定输出路径并创建目录
@@ -25,39 +25,55 @@ class ProtoGenerator:
25
25
  - 符合Protobuf命名规范
26
26
  """
27
27
 
28
- def generate_proto_file(self, message_def: MessageDefinition, all_messages: Dict[str, MessageDefinition]) -> str:
28
+ def generate_proto_file(self, message_def: MessageDefinition,
29
+ all_messages: Dict[str, MessageDefinition],
30
+ all_enums: Dict[str, EnumDefinition] = None) -> str:
29
31
  """
30
32
  生成完整的proto文件内容
31
33
 
32
34
  Args:
33
35
  message_def: 要生成的消息定义
34
36
  all_messages: 所有消息定义的字典,用于依赖解析
37
+ all_enums: 所有枚举定义的字典,用于依赖解析
35
38
 
36
39
  Returns:
37
40
  完整的proto文件内容字符串
38
41
  """
39
- lines = []
40
-
41
- # 1. 文件头
42
- lines.extend(self._generate_file_header())
43
-
44
- # 2. 包声明
45
- if message_def.package_name:
46
- lines.extend(self._generate_package_declaration(message_def.package_name))
47
-
48
- # 3. 导入语句
49
- imports = self._collect_imports(message_def, all_messages)
50
- if imports:
51
- lines.extend(self._generate_imports(imports))
52
-
53
- # 4. Java选项
54
- if message_def.package_name:
55
- lines.extend(self._generate_java_options(message_def.package_name))
56
-
57
- # 5. 消息定义
58
- lines.extend(self._generate_message_definition(message_def))
59
-
60
- return '\n'.join(lines)
42
+ try:
43
+ if not message_def:
44
+ raise ValueError("消息定义不能为空")
45
+
46
+ if not message_def.name:
47
+ raise ValueError("消息名称不能为空")
48
+
49
+ lines = []
50
+
51
+ # 1. 文件头
52
+ lines.extend(self._generate_file_header())
53
+
54
+ # 2. 包声明
55
+ if message_def.package_name:
56
+ lines.extend(self._generate_package_declaration(message_def.package_name))
57
+
58
+ # 3. 导入语句
59
+ imports = self._collect_imports(message_def, all_messages, all_enums)
60
+ if imports:
61
+ lines.extend(self._generate_imports(imports))
62
+
63
+ # 4. Java选项
64
+ if message_def.package_name:
65
+ lines.extend(self._generate_java_options(message_def.package_name))
66
+
67
+ # 5. 消息定义
68
+ lines.extend(self._generate_message_definition(message_def, all_enums))
69
+
70
+ return '\n'.join(lines)
71
+
72
+ except Exception as e:
73
+ from utils.logger import get_logger
74
+ logger = get_logger("proto_generator")
75
+ logger.error(f"❌ 生成proto文件失败 {message_def.name if message_def else 'Unknown'}: {e}")
76
+ raise
61
77
 
62
78
  def generate_enum_proto_file(self, enum_def: EnumDefinition,
63
79
  all_messages: Dict[str, MessageDefinition] = None,
@@ -73,23 +89,39 @@ class ProtoGenerator:
73
89
  Returns:
74
90
  完整的proto文件内容字符串
75
91
  """
76
- lines = []
77
-
78
- # 1. 文件头
79
- lines.extend(self._generate_file_header())
80
-
81
- # 2. 包声明
82
- if enum_def.package_name:
83
- lines.extend(self._generate_package_declaration(enum_def.package_name))
84
-
85
- # 3. Java选项
86
- if enum_def.package_name:
87
- lines.extend(self._generate_java_options(enum_def.package_name))
88
-
89
- # 4. 枚举定义
90
- lines.extend(self._generate_enum_definition(enum_def))
91
-
92
- return '\n'.join(lines)
92
+ try:
93
+ if not enum_def:
94
+ raise ValueError("枚举定义不能为空")
95
+
96
+ if not enum_def.name:
97
+ raise ValueError("枚举名称不能为空")
98
+
99
+ if not enum_def.values:
100
+ raise ValueError(f"枚举 {enum_def.name} 没有定义任何值")
101
+
102
+ lines = []
103
+
104
+ # 1. 文件头
105
+ lines.extend(self._generate_file_header())
106
+
107
+ # 2. 包声明
108
+ if enum_def.package_name:
109
+ lines.extend(self._generate_package_declaration(enum_def.package_name))
110
+
111
+ # 3. Java选项
112
+ if enum_def.package_name:
113
+ lines.extend(self._generate_java_options(enum_def.package_name))
114
+
115
+ # 4. 枚举定义
116
+ lines.extend(self._generate_enum_definition(enum_def))
117
+
118
+ return '\n'.join(lines)
119
+
120
+ except Exception as e:
121
+ from utils.logger import get_logger
122
+ logger = get_logger("proto_generator")
123
+ logger.error(f"❌ 生成枚举proto文件失败 {enum_def.name if enum_def else 'Unknown'}: {e}")
124
+ raise
93
125
 
94
126
  def generate_enums_file(self, enum_defs: List[EnumDefinition], package_name: str) -> str:
95
127
  """
@@ -147,12 +179,13 @@ class ProtoGenerator:
147
179
  ''
148
180
  ]
149
181
 
150
- def _generate_message_definition(self, message_def: MessageDefinition) -> List[str]:
182
+ def _generate_message_definition(self, message_def: MessageDefinition, all_enums: Dict[str, EnumDefinition] = None) -> List[str]:
151
183
  """
152
184
  生成消息定义
153
185
 
154
186
  Args:
155
187
  message_def: 消息定义对象
188
+ all_enums: 所有枚举定义的字典
156
189
 
157
190
  Returns:
158
191
  消息定义的行列表
@@ -161,12 +194,12 @@ class ProtoGenerator:
161
194
 
162
195
  # 生成oneof字段(oneof字段内部也按tag排序)
163
196
  for oneof in message_def.oneofs:
164
- lines.extend(self._generate_oneof_definition(oneof))
197
+ lines.extend(self._generate_oneof_definition(oneof, all_enums))
165
198
 
166
199
  # 生成常规字段(按tag排序)
167
200
  sorted_fields = sorted(message_def.fields, key=lambda field: field.tag)
168
201
  for field in sorted_fields:
169
- lines.append(self._generate_field_definition(field))
202
+ lines.append(self._generate_field_definition(field, all_enums))
170
203
 
171
204
  lines.append('}')
172
205
  return lines
@@ -191,43 +224,69 @@ class ProtoGenerator:
191
224
  lines.append('}')
192
225
  return lines
193
226
 
194
- def _generate_oneof_definition(self, oneof) -> List[str]:
227
+ def _generate_oneof_definition(self, oneof, all_enums: Dict[str, EnumDefinition] = None) -> List[str]:
195
228
  """生成oneof字段定义(字段按tag排序)"""
196
229
  lines = [f' oneof {oneof.name} {{']
197
230
 
198
231
  # 对oneof内部的字段按tag排序
199
232
  sorted_fields = sorted(oneof.fields, key=lambda field: field.tag)
200
233
  for field in sorted_fields:
201
- field_type = self._resolve_field_type(field)
234
+ field_type = self._resolve_field_type(field, all_enums)
202
235
  lines.append(f' {field_type} {field.name} = {field.tag};')
203
236
 
204
237
  lines.append(' }')
205
238
  return lines
206
239
 
207
- def _generate_field_definition(self, field: FieldDefinition) -> str:
240
+ def _generate_field_definition(self, field: FieldDefinition, all_enums: Dict[str, EnumDefinition] = None) -> str:
208
241
  """
209
242
  生成单个字段定义
210
243
 
211
244
  Args:
212
245
  field: 字段定义对象
246
+ all_enums: 所有枚举定义的字典
213
247
 
214
248
  Returns:
215
249
  字段定义字符串
216
250
  """
217
- field_type = self._resolve_field_type(field)
218
-
219
- if field.rule == 'repeated':
220
- return f' repeated {field_type} {field.name} = {field.tag};'
221
- else:
222
- return f' {field_type} {field.name} = {field.tag};'
251
+ try:
252
+ if not field:
253
+ raise ValueError("字段定义不能为空")
254
+
255
+ if not field.name:
256
+ raise ValueError("字段名称不能为空")
257
+
258
+ if field.tag is None or field.tag <= 0:
259
+ raise ValueError(f"字段 {field.name} 的标签无效: {field.tag}")
260
+
261
+ if not field.type_name:
262
+ raise ValueError(f"字段 {field.name} 的类型不能为空")
263
+
264
+ field_type = self._resolve_field_type(field, all_enums)
265
+
266
+ if not field_type:
267
+ raise ValueError(f"字段 {field.name} 无法解析类型: {field.type_name}")
268
+
269
+ if field.rule == 'repeated':
270
+ return f' repeated {field_type} {field.name} = {field.tag};'
271
+ else:
272
+ return f' {field_type} {field.name} = {field.tag};'
273
+
274
+ except Exception as e:
275
+ from utils.logger import get_logger
276
+ logger = get_logger("proto_generator")
277
+ logger.error(f"❌ 生成字段定义失败 {field.name if field else 'Unknown'}: {e}")
278
+ raise
223
279
 
224
- def _collect_imports(self, message_def: MessageDefinition, all_messages: Dict[str, MessageDefinition]) -> Set[str]:
280
+ def _collect_imports(self, message_def: MessageDefinition,
281
+ all_messages: Dict[str, MessageDefinition],
282
+ all_enums: Dict[str, EnumDefinition] = None) -> Set[str]:
225
283
  """
226
284
  收集需要导入的proto文件
227
285
 
228
286
  Args:
229
287
  message_def: 当前消息定义
230
288
  all_messages: 所有消息定义的字典
289
+ all_enums: 所有枚举定义的字典
231
290
 
232
291
  Returns:
233
292
  导入路径的集合
@@ -236,21 +295,22 @@ class ProtoGenerator:
236
295
 
237
296
  # 检查常规字段依赖
238
297
  for field in message_def.fields:
239
- import_path = self._get_field_import_path(field, message_def.package_name, all_messages)
298
+ import_path = self._get_field_import_path(field, message_def.package_name, all_messages, all_enums)
240
299
  if import_path:
241
300
  imports.add(import_path)
242
301
 
243
302
  # 检查oneof字段依赖
244
303
  for oneof in message_def.oneofs:
245
304
  for field in oneof.fields:
246
- import_path = self._get_field_import_path(field, message_def.package_name, all_messages)
305
+ import_path = self._get_field_import_path(field, message_def.package_name, all_messages, all_enums)
247
306
  if import_path:
248
307
  imports.add(import_path)
249
308
 
250
309
  return imports
251
310
 
252
311
  def _get_field_import_path(self, field: FieldDefinition, current_package: str,
253
- all_messages: Dict[str, MessageDefinition]) -> str:
312
+ all_messages: Dict[str, MessageDefinition],
313
+ all_enums: Dict[str, EnumDefinition] = None) -> str:
254
314
  """
255
315
  根据字段获取导入路径
256
316
 
@@ -258,6 +318,7 @@ class ProtoGenerator:
258
318
  field: 字段定义
259
319
  current_package: 当前包名
260
320
  all_messages: 所有消息定义
321
+ all_enums: 所有枚举定义
261
322
 
262
323
  Returns:
263
324
  导入路径字符串,如果不需要导入则返回None
@@ -296,7 +357,16 @@ class ProtoGenerator:
296
357
  if field.type_name in generic_types:
297
358
  return None
298
359
 
299
- # 解析完整类名
360
+ # 检查是否为枚举类型
361
+ if all_enums:
362
+ for enum_full_name, enum_def in all_enums.items():
363
+ # 检查是否匹配混淆的枚举名或原始枚举名
364
+ enum_class_name = enum_full_name.split('.')[-1] # 获取类名部分
365
+ if field.type_name == enum_class_name or field.type_name == enum_def.name:
366
+ # 生成枚举文件的导入路径
367
+ return self._class_name_to_import_path(enum_full_name)
368
+
369
+ # 解析完整类名(消息类型)
300
370
  full_class_name = self._resolve_full_class_name(field.type_name, current_package, all_messages)
301
371
  if full_class_name:
302
372
  return self._class_name_to_import_path(full_class_name)
@@ -354,7 +424,7 @@ class ProtoGenerator:
354
424
  package_path = '/'.join(parts[:-1])
355
425
  return f"{package_path}/{proto_name}"
356
426
 
357
- def _resolve_field_type(self, field: FieldDefinition) -> str:
427
+ def _resolve_field_type(self, field: FieldDefinition, all_enums: Dict[str, EnumDefinition] = None) -> str:
358
428
  """
359
429
  解析字段的最终类型名
360
430
 
@@ -394,6 +464,14 @@ class ProtoGenerator:
394
464
  if field.type_name == 'message':
395
465
  return self._generate_message_type_name(field.name)
396
466
 
467
+ # 检查是否为枚举类型,如果是则使用原始枚举名
468
+ if all_enums:
469
+ for enum_full_name, enum_def in all_enums.items():
470
+ enum_class_name = enum_full_name.split('.')[-1] # 获取类名部分
471
+ if field.type_name == enum_class_name:
472
+ # 使用原始枚举名而不是混淆名
473
+ return enum_def.name
474
+
397
475
  # 已知的具体类型名,提取简单类型名
398
476
  if '.' in field.type_name:
399
477
  # 从完整类名中提取简单类型名
parsing/java_parser.py CHANGED
@@ -224,7 +224,7 @@ class JavaParser:
224
224
  return (
225
225
  'implements Internal.EnumLite' in content and
226
226
  'enum ' in content and
227
- 'forNumber(' in content
227
+ ('forNumber(' in content or 'getNumber()' in content)
228
228
  )
229
229
 
230
230
  def _extract_enum_values(self, content: str) -> List[tuple]:
pyproject.toml CHANGED
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [tool.poetry]
6
6
  name = "reproto"
7
- version = "0.0.9"
7
+ version = "0.1.1"
8
8
  description = "一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构."
9
9
  readme = "README.md"
10
10
  license = "Proprietary"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: reproto
3
- Version: 0.0.9
3
+ Version: 0.1.1
4
4
  Summary: 一个强大的逆向工程工具, 能够从任何使用Google Protobuf Lite的Android应用中自动重构出完整的.proto文件结构.
5
5
  License: Proprietary
6
6
  Keywords: protobuf,reverse-engineering,android,jadx,proto
@@ -1,4 +1,4 @@
1
- .git/COMMIT_EDITMSG,sha256=f7YiPfJff1yNgjPRfmD8mYTljSiz5aQvEIfwH3TqtCc,683
1
+ .git/COMMIT_EDITMSG,sha256=OJTijUraf8zRGEsGyQ_Q3EFxeT206AEhvBZe9ph_cdI,28
2
2
  .git/FETCH_HEAD,sha256=1W_vttZCTHf9DXnCOhWjilD3kVx9WT2Xu85YBetV3ok,191
3
3
  .git/HEAD,sha256=ly8yuQLWQE8njkYAapHLPJ1xVg6_fMgQjCoHqKvFIdw,21
4
4
  .git/config,sha256=9ZAySfDWBdI-K9eOXyrEQOhiX68AiaP0Z4CLzH07H10,399
@@ -17,34 +17,42 @@
17
17
  .git/hooks/push-to-checkout.sample,sha256=pT0HQXmLKHxt16-mSu5HPzBeZdP0lGO7nXQI7DsSv18,2783
18
18
  .git/hooks/sendemail-validate.sample,sha256=ROv8kj3FRmvACWAvDs8Ge5xlRZq_6IaN3Em3jmztepI,2308
19
19
  .git/hooks/update.sample,sha256=jV8vqD4QPPCLV-qmdSHfkZT0XL28s32lKtWGCXoU0QY,3650
20
- .git/index,sha256=H3N6fAu_qEXal8X0k_4Zioz9AUDGeBtlnCGJsmnn-Ak,2255
20
+ .git/index,sha256=1ZM4jn-WDgRjp1f-_9M6vBnK5C1UuidTQaIKeFiExKs,2255
21
21
  .git/info/exclude,sha256=ZnH-g7egfIky7okWTR8nk7IxgFjri5jcXAbuClo7DsE,240
22
- .git/logs/HEAD,sha256=Zy6alEsv_L04s2VP7Gxm3YDVCLNe5MtHabDIeCZlGj4,1827
23
- .git/logs/refs/heads/iyue,sha256=Zy6alEsv_L04s2VP7Gxm3YDVCLNe5MtHabDIeCZlGj4,1827
24
- .git/logs/refs/remotes/gitlab/iyue,sha256=s-5DlIRcdV81dLF6FzRwj1JDOnGI0myIxAfKWE88otw,1224
22
+ .git/logs/HEAD,sha256=KQbF4Gvsf1mX1Oincff6xO_eckSlWyiiuaEuggXtB3c,2515
23
+ .git/logs/refs/heads/iyue,sha256=KQbF4Gvsf1mX1Oincff6xO_eckSlWyiiuaEuggXtB3c,2515
24
+ .git/logs/refs/remotes/gitlab/iyue,sha256=MXaTNGsoegnTSIVXcmAVD4v2x2eYUJ7mT_klhYK_POY,1768
25
25
  .git/logs/refs/remotes/origin/HEAD,sha256=4vCPTgC0N80jhmkFXNUlYvHtGllYJkQTGZEn6LlqZgs,163
26
- .git/logs/refs/remotes/origin/iyue,sha256=6kHIydv6sCMdRdbla-7hwUsIRfmU2VIM2ScTZtgwopk,1224
26
+ .git/logs/refs/remotes/origin/iyue,sha256=q1Kmpw0iGhVPUH8py7HBY_0VtLLXRvfzwoKBRx9JBbc,1768
27
27
  .git/objects/09/a92517fe9eeb33d2fd7c979e01d163665f7abc,sha256=wyFL5jJ16f0xCpL1MB5EiJvs2opieE0hMEmyDpUV3ps,9356
28
+ .git/objects/0c/7b11b535a18f311aedadbe91e14fc9fe6b50d9,sha256=1nmf96foQAXQrObKn9gOPugLMlpj7soMif1MBARmKd8,427
28
29
  .git/objects/14/d323d58fb90c209a730c17e23fd82a6c735fc1,sha256=rTCuhPM5LYusLIMDv7CLC557SlRFvvbBzgr4jwrjMVg,426
29
30
  .git/objects/15/eb3f02479e633439ec83c143e703f8448043a1,sha256=duJXtvq_NNhYKG7WdejXgoMlyHIaCUG5jv9SJpU_orc,14711
30
31
  .git/objects/18/89a4fb55eb3abdc528ce87f0cea039278c06fd,sha256=Uz8TPtDNnPWR5pfsIx7tMDCDFBdWLIkaPcnYPIJ12oM,2880
32
+ .git/objects/1a/4435c23bdf5543e3270aa69361c9c68f205efb,sha256=iNhiztqM2EYiQYjGpjBWg9h0l6YNbQHYafclGl1DB5I,96
31
33
  .git/objects/20/cf56ec106bcd66420dd000279f983571b918b6,sha256=0dwZwG7CpR7yYYNvgYDxHLPj2P7eRLK7fTW_En419pk,166
32
34
  .git/objects/21/55b64d52922c88527c102d62f23e5c2abbae79,sha256=6LLW2HrSfqqVwvO59yc-EcUp6MHw6zfHwu8TB775dII,13853
33
35
  .git/objects/23/bfbca38e177bcbb423dd782c35b19d127a5ab0,sha256=hYW2b3t3bVGNh4pqyyA7DMlyF4LfNZco5NwedWMwwuI,3700
34
36
  .git/objects/26/1f67f3b731b32f6d77de9dd7be2d61e2a14ace,sha256=mcasCBpCulVy2N-X_d2hg8567PdhZRof4ea5nYoelJM,96
35
37
  .git/objects/29/4708b82b343e04e7a6685f5cd1287f3d17f7a9,sha256=YE3F4zucGeMHEw7bTEvQc0uJEUUCfEgw-mZTWupuNhA,96
38
+ .git/objects/2b/64656ce2df6259c822733b03f26eb828fe9269,sha256=62hS2mVKecw3uXd8yGs7djzHNeouyhbP6KhR1gGYosg,166
36
39
  .git/objects/2c/fcddd7eebeb4eee0562dc384a79366bc7b04bb,sha256=FHxE2giqoo-1IB9Q8i_XQUypGvQbRlRnTK0sbsNDcJE,96
40
+ .git/objects/2d/a515dbb88d31400d5b84d41caf270e9309232d,sha256=cP9jUGnu5pVr9ks-YJZSEjsgb7GKD2XEr8XvQosqs2s,122
37
41
  .git/objects/2e/2c1c42f5ac5d665cc672d3792078b756d9ab0e,sha256=5LG3jHGORJeswNw0lz5dc6QSsxztyMstbRDADhZDnZY,166
38
42
  .git/objects/33/181441ab38eded005db356da89b54c7d29f452,sha256=iIM6a2aGs_TGZjxHKnkYYyZj_hA77nAF7r2lMOtN1VA,2021
39
43
  .git/objects/33/52dfa8f5d9eb46cc98ea7ccecf02e4d9df95f7,sha256=KNAvQNdSalt8CxCZVVb8e6KBC4zqVtusT5MriFLPbIQ,4409
40
44
  .git/objects/34/192f0df5f5b694c881d086019eda349608d222,sha256=zcWIY4oDFz6n17MRjbwFrN1o-HEY0--gqK96dohmZfE,4901
41
45
  .git/objects/35/8bace20b731ff1bbb256d2a0158dfc84720978,sha256=hEPGT0bRzT1GlXErWRWJ7ogflTWj3SutlHRKCBH1TII,426
46
+ .git/objects/38/907894973091f8e9b224a13fe596e1cb309cf5,sha256=XBdeTonV9fezxtk3kzI6DmEPb3WftSPaIWT30MKKw1E,802
42
47
  .git/objects/3c/6f0120229cc2cd8123efbeb7f186eb0a485f29,sha256=iyh7Xt-m7vou3slm58k8xSl3Cn2yYXTuv5WziSWHrW0,802
48
+ .git/objects/3c/c3ca375694d43e35cdc88d4a5d067e510df427,sha256=A79FHqMtws8sYqMG9CmHWbEPaxF8htYc_E2wVuMi2u4,6570
49
+ .git/objects/3d/3cc6aab4eefed46c77dda27503bebcce88962c,sha256=6NOdtY3stGMa7_trzPhvb2T21Ng0WqFIJhkPhsW-ACU,420
43
50
  .git/objects/3e/d953d5ed2c66722045f5e39d068696a0853b4f,sha256=GelU4l-EVo8Y5rXSksIEnewIasEr9N54pTJcgrY3VVk,166
44
51
  .git/objects/40/84f4567d983a977c49598b7d886e46b13ff50b,sha256=R3w6EvxpJRcVuJvbCslrGDK07kcOjECGGosj5tO-JBo,426
45
52
  .git/objects/44/4af3a0d68ba81976f67c7b638c9b0db4640709,sha256=s__MvPzT4Ndsip8kgkfMh-Y0oZ28tv2kVqaz_ExQKvU,166
46
53
  .git/objects/48/369b05749e384be9be58e5f943f3a0040d0f37,sha256=KP9dXx-XniZuIEXESlrL_MWWi55zGiFr7xtmp3oD67o,8551
47
54
  .git/objects/4b/43f5f577e1cdc35f8e06d178d8f5c892034061,sha256=eawBjiWutNeKjIzvNonVMMKUVsz_-jn3Uew_NsKQJ-I,1150
55
+ .git/objects/4b/442fccf86631bf5196ee5b48ab8d58228ab59c,sha256=5LFRUcM6cV7lW29hge4-op6hYtbn5SZ6Ouz_4tW6k8w,4842
48
56
  .git/objects/4c/16984be6ef7b24d01604821e9728cb579acd69,sha256=sy5h3rBsk0JcPlpA7L0WhJESaYjNZnTvrB1F1CRPSJQ,167
49
57
  .git/objects/4d/6d457bfabc4af842e5ddc2d56eb059d5dfdc9d,sha256=HLQ8aGvln8ZuhdINhhbr_aTt2BttkJOY8k6LhciAMLE,672
50
58
  .git/objects/55/6723fdd4f525eed41c52fa80defca3f0c81c47,sha256=vwGNz5lxU_wrrRWVPU64TccYo4Vo4uUGC3-GwVIs1xs,4520
@@ -53,16 +61,21 @@
53
61
  .git/objects/5a/11f9d70791e06a0570e01d3dcbbae39cde55db,sha256=wjd8hb5D03icknLFsPqMas6xAFfG30_Wg-PJJH03ezg,13722
54
62
  .git/objects/5c/715dcb05e32db7a7a3b030f07524bdd8a56849,sha256=wLXhy_1PP8n3Gd6NsvY1eFlK1pjkIjW35im_BD-0yMU,426
55
63
  .git/objects/5d/e2e9d536c2c0b78e8f9b3b61daa531a55332dc,sha256=Wiyz9xFF5A95FEnxZULmV9TSJf0-erTb_qIhLFIvmag,6558
64
+ .git/objects/5e/9daac72a48ce60688ab2eeddcc3d9152329e20,sha256=7sVW8qTIBHufxZ3WCnNwmX33RpciuLTPritqr84UmKk,426
56
65
  .git/objects/65/a4f0ada7519f8b1e6a7c7e287541b8effde9fd,sha256=jSGkVjAMcm2nrF6w_0U7lmzoBgwIJaf4P8POOlABxEQ,188
57
66
  .git/objects/66/7291e131d4769e7d028346a0cc7a0c05d500e5,sha256=3D6kzCQW7DkYuwARYA74Tlfzeaiaob9ux4YE6hYohas,4026
67
+ .git/objects/67/f27f77274917580e687fd00ca18da0660215c1,sha256=dxM9_T9v3VBrSXF3dbH6zsmbGQJn43-_DnHiDYs8108,15542
58
68
  .git/objects/67/f54a4a3ede6749acc7c718ad97a86634215b5e,sha256=n0_tiP-u_DP9uhXCryaz98mNJYcUX8RYiS48FvxIxCA,744
69
+ .git/objects/6f/90fcf9eacdc794313471f54279011a787c8760,sha256=Id_lE745shxM2OIWcJkH2Y3p9ji3pwxqDId8b2LqgTc,165
59
70
  .git/objects/70/ded03ee69f30850c938a8129be308cb30772d9,sha256=d_DDP1Jj_KnSDtbZRKOomzOvV9ySvlaiapwSEXhO0DE,1012
60
71
  .git/objects/76/311aa8e59d780763e0d66787067cc5d9613a67,sha256=J9Xy8ESXbWUbC_4sA0KumGVKm09tzlqA8C5oJ63a_b4,2167
61
72
  .git/objects/78/3e7e252c20e73e33615c703174766036546ff6,sha256=cQ-PXyvzEYjb2Lr24anO9aGui5IxBxZCYXL6zZRc0xc,810
62
73
  .git/objects/7c/00eec7ae9ef5f94fc337e5c8f9793a2a48810d,sha256=Ju-Yuy5EARcIThU4vkHrZuHQWu3MjXSZYGtBDTWR18c,96
74
+ .git/objects/7e/5935774ee7a85f2523427c9100f9c578ac172f,sha256=ywEI3w5JgIOgFDJ6cxc6NJnLfEr2Cjynke78KmwJhSE,165
63
75
  .git/objects/8c/809c42c7ae13007fd885ee7bcffae7acf2c520,sha256=HYoU3_cZUGur3rWrgRvzHRAv0JfrXgc34R8UeGbC5Bc,14180
64
76
  .git/objects/8d/44142ae2d6dbb59d4ebed8587bccd051e5766b,sha256=l1G5ZzQBQW8Lxd3WvGLRcY6quM6dBL4zdNT5ovjv3Dc,802
65
77
  .git/objects/8d/4a5767bef0c342f1660526f9671c0944922c40,sha256=kP0nfEnyNmuEJ4wLQabhPPx60OIa5Dxqn7R9Ni89CqY,1900
78
+ .git/objects/92/c6018b4fb8e3b6c2f3f3054a56f2bfaca27470,sha256=Oox2busLjPpkXw6To9NfgDMXHuknlICbhyhyTWUT1lU,96
66
79
  .git/objects/94/ce01b61b90d1fb21d2d339fbeb22e821b6f413,sha256=oSSA97T7TGnstzHDjUrdwzwZO4d1qIUyjo6lz_EbNbM,122
67
80
  .git/objects/95/295a15779ebefd563ec777c3d3cced7e8d0209,sha256=IIN8_K0K-3LAkUI4Ra3DS8yUsfpsqteSDGhgvRpSfZ4,426
68
81
  .git/objects/97/56fe0931216a7c40cbf250e1ab8a6dfd589f13,sha256=Su7Q-bXO0K9QKEGC249NVuUS62xmQs5TgWfEmdbauaI,97
@@ -70,12 +83,17 @@
70
83
  .git/objects/9a/e313cdf64cd82416c1238eb493e6396f799f12,sha256=9bPRhebwMVqtGqJUxfVq-TEUxceuOdSvicWe1H8F7Ks,876
71
84
  .git/objects/9e/9978522bc8ca79133d7c11ef8ca3fe3c7eed0a,sha256=FkHx7Pp6DCZ5e4bRo2RjRU875YBgl9tEw7Z_9Rii8cE,13109
72
85
  .git/objects/9f/b57064e0c53ed80af8507acaab718a1e80184e,sha256=DGx0Ie-bppvghrmiV5w7mn24c6YlvHvYLIQsm-_jzsQ,635
86
+ .git/objects/a0/d630c3f6024b196d4ee933ab13a32905efdaaa,sha256=nNyB1T2FVU2vm3f-aAjEl-vBLbxYsKHibRIPhqCX9jQ,426
73
87
  .git/objects/a3/cedc28e563a1845a7860161b39b0fe58d5f0d3,sha256=Vee0H8dhSj4ERNDSAnRU6vebs0tbY1-lgYr1Nz5X7bc,122
74
88
  .git/objects/a5/b7e4e1b63bfb65288f6553687aaabcfb4d51b1,sha256=9tl9xb48EdvQk9GIg6mEzXSwqUgD6yEVZx-sVxaQVKw,1064
89
+ .git/objects/ae/046e08176523e8a98dc7294436319f724db13c,sha256=9hdXV7BKRhfFTOz3FSuoYwGrcjvk2uTPo3CD1czuKcU,803
90
+ .git/objects/b0/7a43f0462bf25a8b1f4c0ca60c1b533dae1dde,sha256=JWzlC7nXy3RXBUxEcge1_ciMw6q3C5phffVck9MVlJk,404
75
91
  .git/objects/b3/28dc445ee33220db9359370fc0089a77174101,sha256=cipG_34_tKM5VPfYW2wRCmBYOqlmTBIUjakeph9sfl4,3652
76
92
  .git/objects/b3/d2b3037bede44e7e4d18dc99419f8c712c9c62,sha256=OIWo7wvTTKYZkYkxcZrOtnvfqgGlPezaE6sglITaF_Y,1156
77
93
  .git/objects/c3/93db4841dbbb8acf54e9af12b6705c9f5ecde9,sha256=g36XyKIObniMsMBcIzsoG7f82SzOgn_Bdx-V9Rezjbg,3864
78
94
  .git/objects/c3/c8594874dd9ff9c21662fd06cac9b5baadbba0,sha256=5YUWDZ-BMZvyOJksaoiKeZC0N-eRcOJemLb_jNUHcC4,14309
95
+ .git/objects/c8/2a656fe6b5d479b327cdf5fe3bf60db987a2a2,sha256=YNf8mWKTqJHeBDQCTfOU8b0ZDDSfbAb1fBGGDsySrHk,426
96
+ .git/objects/c8/cb3bb9552dcf6a368a1418996c4b925db2d8ab,sha256=3AlcdjxamfHKOBmAuectuKNLwOYa1BovnOmVElfwPb4,13097
79
97
  .git/objects/c9/a6ca8f8efee4a5632e9a655ced29f1b708f35e,sha256=IOmxZbePi1cWHt2HzdDNtWy0SYR2XvigDkGK2fyNbWU,4957
80
98
  .git/objects/c9/cdef9ab627b874ffe6455a47583a75bf16496d,sha256=7y908SUa7dmWJyNXDKS_tOdrcfmI6OjZc7zvtL38M5Y,428
81
99
  .git/objects/cd/2d6c229438c6b1c694b9392a85888d89ef49c1,sha256=IW9iGk3Eb-i_Ht64HQcltVp27ziQHz5IP6k5p57YFtY,122
@@ -83,6 +101,8 @@
83
101
  .git/objects/d9/6d7456245232b3e159dcf691f11e51224c557a,sha256=3w45hxiT2rn6ljSdgo36fHMMWZt30r5C1FPvbnjq9tc,597
84
102
  .git/objects/db/beedb30613f79ae3ff67df1428cf8ade223711,sha256=tTGayiwSvdy-uBiXQKRhNnToZ_dc1BmeXZ2mltuRfxY,3812
85
103
  .git/objects/df/f8f64cee2b97df7d86f73207c5e690f98f0208,sha256=eRT2hUSKxaIPfQVnE9NaRGxbAvBVCSreSOGzVGtd7As,213
104
+ .git/objects/e2/b7433fbfbfac5bc800a962be2f4adbed145b42,sha256=eqX17kz7wSegBgSYS8q4oMPsZVvNWoDbpCRw7oI5PmE,15527
105
+ .git/objects/e4/1e5aa2bc3074c2014d01ab1f603f69c327a83f,sha256=5daI7Vb9ehvOwoqgaBAKilm6Z6YdA4Rk4MFjJChbWpA,379
86
106
  .git/objects/e8/1433b6ad92206cdadbee1f474b4f99383314cb,sha256=mRMdmx6wCs6b-63QL72Iutm2AUVCOIYs7J5XbAsLluc,426
87
107
  .git/objects/e8/2f42ea26b8bf4f0bc92c0648ac8f190f14226d,sha256=xtbEwloZnqXdNdViAevzyprosfPQ1P--xAu6URGlaYI,155
88
108
  .git/objects/e9/a15996cb55ac72aeb6611d26e8d22246589943,sha256=sTn6X3xMp3_WYpj1CmP2hDqviX86aJHTCzzi_ZTpBKw,4643
@@ -92,33 +112,34 @@
92
112
  .git/objects/f2/2bfffda9fb6a7f37bed04b7c40c9466ef09454,sha256=goQNyEV3NqzS28mMXuus1SWzwb8yXnvEPef14Ugzh5Q,750
93
113
  .git/objects/f5/18c69a6e1bf3052b79da01502b2837ea58f0f4,sha256=r98SFbCvw7yeAYTjzkw-2VMhOVbpm79FLZQiC5A1-pw,123
94
114
  .git/objects/f7/25a430eb3364460ba854dbc8809edc21dc6c70,sha256=LdyMmAWGLWbn5G5fC7eAPi4NFOboKcJ6iJJdxENSUCk,2505
115
+ .git/objects/fa/fc981b0d80d8d0323c04365785f66996ed5211,sha256=t9N37kVA7j_i4nz0dDMHOQpvziBu5MUpDlG06Hdj77c,4395
95
116
  .git/objects/fc/e15b9dbffd9f37b1f2d46944ee2d0394df6565,sha256=81qdzKkVZ5C_1oej2Mm0q2RLifilVFolIs95mrUfpg4,163
96
117
  .git/objects/fd/267d9de63212db235135fa6834f62572224fc6,sha256=vzhjdZvcXQ8Fgja_XwvbBkuLuRhzSYf_3mckDyZEoso,426
97
118
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.idx,sha256=KRv1SBEe9bYL9d5V301LwPOBqFs3tMnB0dl4PriMMIw,2416
98
119
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.pack,sha256=R4oMXhr-NcPAUBXStCbAaUvGUDW_SBECmPIbiB9Gy48,42003
99
120
  .git/objects/pack/pack-289f7bb06603881c49190e6036de6390223baf77.rev,sha256=22_3sqyTNB5IbwAK5oCqNz0UxDDqoZ5jcF7p_44Lalo,244
100
121
  .git/packed-refs,sha256=4H0m4wd6q98wZkBk7WfvVeTBuuxQdTE65XxsswYP-oQ,112
101
- .git/refs/heads/iyue,sha256=eBmizaWpaeQ5r12COERLFcpVj3j7zd_ks0CYMmwWY_A,41
102
- .git/refs/remotes/gitlab/iyue,sha256=eBmizaWpaeQ5r12COERLFcpVj3j7zd_ks0CYMmwWY_A,41
122
+ .git/refs/heads/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
123
+ .git/refs/remotes/gitlab/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
103
124
  .git/refs/remotes/origin/HEAD,sha256=G8pFPTbCqnJ2IkCzz9J-STqOXWU6TrlXfpt1wx5bUWE,30
104
- .git/refs/remotes/origin/iyue,sha256=eBmizaWpaeQ5r12COERLFcpVj3j7zd_ks0CYMmwWY_A,41
125
+ .git/refs/remotes/origin/iyue,sha256=R9_PlsRLn-c1Boht7Ouun-MAQQj_9PDIfKr5H-8LOmc,41
105
126
  .gitignore,sha256=7KBWk3hOUkvfJh1A-RNk5jHepGKp71qPlktu8nyEptI,2085
106
127
  .python-version,sha256=NxOs_9lT1XG8y-FjlRru-YinX5RcBJt_ulPwgDESZ_o,7
107
128
  ARCHITECTURE.md,sha256=HiUhP4wGzy4lD01MpHjOgAhuAUwpNsEac3tZaE65kos,12047
108
129
  README.md,sha256=khO65a7VGeyjyUxxXpu1W_EosoPLzJyWCol6jDVzw9k,8484
109
130
  core/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
110
131
  core/bytecode_parser.py,sha256=bv01quLoLeKHjswLU86g4w3MeZR9uh7WIJsnV2sGE2g,11399
111
- core/info_decoder.py,sha256=xHLAVJfGsziNPO52-1DOr3TBqbab-sbkx0g7NAzjSwc,49807
112
- core/reconstructor.py,sha256=rnsIVwktSBbVywAdL1fHAK8JkoaW9dmCzhMYb5mKAqQ,48686
132
+ core/info_decoder.py,sha256=n4A6U9jxzRLdzP48QBxBpJ6AKsccR2PWfbG8wKKqwl0,49802
133
+ core/reconstructor.py,sha256=_Kym2_gqDi76MgOK7E7DiQX447Dm8fwnPtHKpN631dM,55500
113
134
  generation/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
114
- generation/proto_generator.py,sha256=yTU8yXEZ6F0L2eOZXl0iTsgBBxkRl1feWVozrKMTvko,15734
135
+ generation/proto_generator.py,sha256=8Pfgr8gFw6-UodVX5JBQk6OrRbGUEQHCZ120euqN8Pg,19715
115
136
  main.py,sha256=3G649-aTByEjMS4tb1A9wcO9NVUxXVSvdwGTq9hXxBI,7081
116
137
  models/__init__.py,sha256=WScv63rvEl65y5CWjpb6__hvjNvjpCkl6lz1Z2u0IYc,811
117
138
  models/message_definition.py,sha256=AszUZnNPSBn9SMXne5ORDBiGZz1W2pcYmU8ftGC3Mks,4873
118
139
  parsing/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
119
140
  parsing/enum_parser.py,sha256=4BjMk1NIYgt2FDZUjTZyOvFfC1uJp_MBZipVdk1tqes,6175
120
- parsing/java_parser.py,sha256=C8-D_nww1C8dlnCmO6Apz9XsF0LfvsTTWIMPjN52Zyw,21756
121
- pyproject.toml,sha256=qJOeZq3nba897lkksyVBYDKCCOrQIWOz7WHfLaOxwlE,1378
141
+ parsing/java_parser.py,sha256=lFdnTzG0OeMlpzUkFDy4_mhOfW0B6gDEKO-3GfAvlVQ,21786
142
+ pyproject.toml,sha256=7pAFQe6zD5eqAkTInATLVoUlGjhfjsTtdrTJYZO1c0E,1378
122
143
  requirements.txt,sha256=cQGj3IS6Kj88jbwj_jeKkokMnG-fEezWve91mfW4CJs,96
123
144
  utils/__init__.py,sha256=ajz1GSNU9xYVrFEDSz6Xwg7amWQ_yvW75tQa1ZvRIWc,3
124
145
  utils/file_cache.py,sha256=eOBkfrumWg0EU1EfLESnRN1kcidi_MocxV_EWP8lEhQ,5207
@@ -126,7 +147,7 @@ utils/file_utils.py,sha256=N1Ei7hmyeOkIyZJFEXyNbtTrfeVF2hP-U8evXAVW2MA,4085
126
147
  utils/logger.py,sha256=473DfzFVXzdGpiRTJGY6bBd-V5G80_P07gQqcvDChpQ,2447
127
148
  utils/type_index.py,sha256=So8FYyGtR0ff-ZhVHjXUdhXiXQEujlcCEJlj7OPQMsg,12128
128
149
  utils/type_utils.py,sha256=M3eB7GavxQYAVFOf3E1pO1vK9VD6_lKrutnSH1tx_Gs,14695
129
- reproto-0.0.9.dist-info/METADATA,sha256=VT-RHjMen_58RxfPvOkmtyUFoFUJb_tlri-XjA_NULI,9433
130
- reproto-0.0.9.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
131
- reproto-0.0.9.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
132
- reproto-0.0.9.dist-info/RECORD,,
150
+ reproto-0.1.1.dist-info/METADATA,sha256=pIVlOz9VFGwSkENYwX2B2VdzHHvhkxotl1SL9iI1Rpw,9433
151
+ reproto-0.1.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
152
+ reproto-0.1.1.dist-info/entry_points.txt,sha256=6Oro9lK_2DXDgHiB3andNuIE78wxfooqacqp8yY1C-g,37
153
+ reproto-0.1.1.dist-info/RECORD,,