diff options
Diffstat (limited to 'scripts/dev/rewrite_find_flags.py')
-rw-r--r-- | scripts/dev/rewrite_find_flags.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/scripts/dev/rewrite_find_flags.py b/scripts/dev/rewrite_find_flags.py new file mode 100644 index 000000000..79436f4c8 --- /dev/null +++ b/scripts/dev/rewrite_find_flags.py @@ -0,0 +1,83 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2021-2022 Florian Bruhin (The Compiler) <mail@qutebrowser.org> +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>. + + +"""Find all PyQt flag instances.""" + +import pathlib +import ast + +import PyQt5 + + +def find_flags(tree): + """Find all PyQt flags in an AST tree.""" + for node in ast.walk(tree): + if not isinstance(node, ast.FunctionDef): + continue + if node.name != "__init__": + continue + + if len(node.args.args) == 1: + continue + + annotation = node.args.args[1].annotation + + if not isinstance(annotation, ast.Subscript): + continue + + assert isinstance(annotation.value, ast.Attribute) + assert isinstance(annotation.value.value, ast.Name) + assert annotation.value.value.id == "typing" + if annotation.value.attr != "Union": + continue + + assert isinstance(annotation.slice, ast.Tuple) + elts = annotation.slice.elts + + if not all(isinstance(n, ast.Constant) for n in elts): + continue + + names = [n.value for n in elts] + if not all("." in name for name in names): + continue + + yield names + + +def main(): + pyqt5_path = pathlib.Path(PyQt5.__file__).parent + pyi_files = list(pyqt5_path.glob("*.pyi")) + if not pyi_files: + print("No .pyi-files found for your PyQt installation!") + for path in pyi_files: + #print(f"# {path.stem}") + + tree = ast.parse( + path.read_text(), + filename=str(path), + type_comments=True, + ) + + for flag, enum in find_flags(tree): + print(flag, enum) + + +if __name__ == '__main__': + main() |