diff options
Diffstat (limited to 'codegen/lib/mappings.py')
| -rw-r--r-- | codegen/lib/mappings.py | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/codegen/lib/mappings.py b/codegen/lib/mappings.py index fb3e8bda..6cf6273f 100644 --- a/codegen/lib/mappings.py +++ b/codegen/lib/mappings.py @@ -1,16 +1,23 @@ +from typing import Optional + + class Mappings: - __slots__ = ('classes', 'fields', 'methods') + __slots__ = ('classes', 'fields', 'methods', 'field_types', 'method_types') - def __init__(self, classes, fields, methods): + def __init__(self, classes, fields, methods, field_types, method_types): self.classes = classes self.fields = fields self.methods = methods + self.field_types = field_types + self.method_types = method_types @staticmethod def parse(mappings_txt): classes = {} fields = {} methods = {} + field_types = {} + method_types = {} current_obfuscated_class_name = None @@ -26,21 +33,28 @@ class Mappings: real_name_with_parameters = real_name_with_parameters_and_line.split( ':')[-1] - real_name = real_name_with_parameters.split('(')[0] - parameters = real_name_with_parameters.split('(')[1] + real_type, real_name = real_name_with_parameters.split('(')[ + 0].split(' ') + parameters = real_name_with_parameters.split('(')[1].split(')')[ + 0] if current_obfuscated_class_name not in methods: methods[current_obfuscated_class_name] = {} + method_types[current_obfuscated_class_name] = {} methods[current_obfuscated_class_name][ f'{obfuscated_name}({parameters})'] = real_name + method_types[current_obfuscated_class_name][ + f'{obfuscated_name}({parameters})'] = real_type else: # otherwise, it's a field real_name_with_type, obfuscated_name = line.strip().split(' -> ') - real_name = real_name_with_type.split(' ')[1] + real_type, real_name = real_name_with_type.split(' ') if current_obfuscated_class_name not in fields: fields[current_obfuscated_class_name] = {} + field_types[current_obfuscated_class_name] = {} fields[current_obfuscated_class_name][obfuscated_name] = real_name + field_types[current_obfuscated_class_name][obfuscated_name] = real_type else: # otherwise it's a class real_name, obfuscated_name = line.strip(':').split(' -> ') @@ -48,7 +62,7 @@ class Mappings: classes[obfuscated_name] = real_name - return Mappings(classes, fields, methods) + return Mappings(classes, fields, methods, field_types, method_types) def get_field(self, obfuscated_class_name, obfuscated_field_name): return self.fields.get(obfuscated_class_name, {}).get(obfuscated_field_name) @@ -57,4 +71,17 @@ class Mappings: return self.classes[obfuscated_class_name] def get_method(self, obfuscated_class_name, obfuscated_method_name, obfuscated_signature): + print(obfuscated_class_name, self.methods[obfuscated_class_name]) return self.methods[obfuscated_class_name][f'{obfuscated_method_name}({obfuscated_signature})'] + + def get_field_type(self, obfuscated_class_name, obfuscated_field_name) -> str: + return self.field_types[obfuscated_class_name][obfuscated_field_name] + + def get_method_type(self, obfuscated_class_name, obfuscated_method_name, obfuscated_signature) -> str: + return self.method_types[obfuscated_class_name][f'{obfuscated_method_name}({obfuscated_signature})'] + + def get_class_from_deobfuscated_name(self, deobfuscated_name) -> Optional[str]: + for obfuscated_name, real_name in self.classes.items(): + if real_name == deobfuscated_name: + return obfuscated_name + return None |
