Handle ambiguous monkey patched enum unscoping

This commit is contained in:
Nyall Dawson 2024-01-18 16:11:06 +10:00
parent bf77b1359c
commit e87f789821

View File

@ -158,11 +158,6 @@ deprecated_renamed_enums = {
('Qt', 'MidButton'): ('MouseButton', 'MiddleButton') ('Qt', 'MidButton'): ('MouseButton', 'MiddleButton')
} }
# dict of function name to known enum class name
disambiguated_enums = {
'pushMessage': ('Qgis', 'MessageLevel')
}
# { (class, enum_value) : enum_name } # { (class, enum_value) : enum_name }
qt_enums = {} qt_enums = {}
ambiguous_enums = defaultdict(set) ambiguous_enums = defaultdict(set)
@ -189,12 +184,23 @@ def fix_file(filename: str, qgis3_compat: bool) -> int:
if (isinstance(node, ast.Attribute) and isinstance(node.value, ast.Name) if (isinstance(node, ast.Attribute) and isinstance(node.value, ast.Name)
and (node.value.id, node.attr) in ambiguous_enums): and (node.value.id, node.attr) in ambiguous_enums):
disambiguated = False disambiguated = False
if isinstance(parent, ast.Call) and isinstance(parent.func, ast.Attribute): try:
function_name = parent.func.attr actual = eval(f'{node.value.id}.{node.attr}')
if function_name in disambiguated_enums: obj = globals()[node.value.id]
disambiguated = True if isinstance(obj, type):
fix_qt_enums[Offset(node.lineno, node.col_offset)] = ( for attr_name in dir(obj):
disambiguated_enums)[function_name] + (node.attr, ) attr = getattr(obj, attr_name)
if attr is actual.__class__:
# print(f'Found alias {node.value.id}.{attr_name}')
disambiguated = True
fix_qt_enums[
Offset(node.lineno, node.col_offset)] = (
node.value.id, attr_name, node.attr
)
break
except AttributeError:
pass
if not disambiguated: if not disambiguated:
possible_values = [f'{node.value.id}.{e}.{node.attr}' for e possible_values = [f'{node.value.id}.{e}.{node.attr}' for e