diff options
Diffstat (limited to 'sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature')
12 files changed, 0 insertions, 2368 deletions
diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/PSF-3.7.0.txt b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/PSF-3.7.0.txt deleted file mode 100644 index be42010dd..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/PSF-3.7.0.txt +++ /dev/null @@ -1,43 +0,0 @@ -PSF LICENSE AGREEMENT FOR PYTHON 3.7.0 - -1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), and - the Individual or Organization ("Licensee") accessing and otherwise using Python - 3.7.0 software in source or binary form and its associated documentation. - -2. Subject to the terms and conditions of this License Agreement, PSF hereby - grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, - analyze, test, perform and/or display publicly, prepare derivative works, - distribute, and otherwise use Python 3.7.0 alone or in any derivative - version, provided, however, that PSF's License Agreement and PSF's notice of - copyright, i.e., "Copyright © 2001-2018 Python Software Foundation; All Rights - Reserved" are retained in Python 3.7.0 alone or in any derivative version - prepared by Licensee. - -3. In the event Licensee prepares a derivative work that is based on or - incorporates Python 3.7.0 or any part thereof, and wants to make the - derivative work available to others as provided herein, then Licensee hereby - agrees to include in any such work a brief summary of the changes made to Python - 3.7.0. - -4. PSF is making Python 3.7.0 available to Licensee on an "AS IS" basis. - PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF - EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR - WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT THE - USE OF PYTHON 3.7.0 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. - -5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 3.7.0 - FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF - MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 3.7.0, OR ANY DERIVATIVE - THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. - -6. This License Agreement will automatically terminate upon a material breach of - its terms and conditions. - -7. Nothing in this License Agreement shall be deemed to create any relationship - of agency, partnership, or joint venture between PSF and Licensee. This License - Agreement does not grant permission to use PSF trademarks or trade name in a - trademark sense to endorse or promote products or services of Licensee, or any - third party. - -8. By copying, installing or otherwise using Python 3.7.0, Licensee agrees - to be bound by the terms and conditions of this License Agreement. diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/__init__.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/__init__.py deleted file mode 100644 index ee541d0ea..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -__all__ = "get_signature layout mapping lib".split() diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py deleted file mode 100644 index 4dbed077d..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/errorhandler.py +++ /dev/null @@ -1,148 +0,0 @@ -############################################################################# -## -## Copyright (C) 2020 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -errorhandler.py - -This module handles the TypeError messages which were previously -produced by the generated C code. - -This version is at least consistent with the signatures, which -are created by the same module. - -Experimentally, we are trying to guess those errors which are -just the wrong number of elements in an iterator. -At the moment, it is unclear whether the information given is -enough to produce a useful ValueError. - -This matter will be improved in a later version. -""" - -import sys - -from shibokensupport.signature import inspect -from shibokensupport.signature import get_signature -from shibokensupport.signature.mapping import update_mapping, namespace -from textwrap import dedent - - -def qt_isinstance(inst, the_type): - if the_type == float: - return isinstance(inst, int) or isinstance(int, float) - try: - return isinstance(inst, the_type) - except TypeError as e: - print("FIXME", e) - return False - - -def matched_type(args, sigs): - for sig in sigs: - params = list(sig.parameters.values()) - if len(args) > len(params): - continue - if len(args) < len(params): - k = len(args) - if params[k].default is params[k].empty: - # this is a necessary parameter, so it fails. - continue - ok = True - for arg, param in zip(args, params): - ann = param.annotation - if qt_isinstance(arg, ann): - continue - ok = False - if ok: - return sig - return None - - -def seterror_argument(args, func_name): - update_mapping() - func = eval(func_name, namespace) - sigs = get_signature(func, "typeerror") - if type(sigs) != list: - sigs = [sigs] - if type(args) != tuple: - args = (args,) - # temp! - found = matched_type(args, sigs) - if found: - msg = dedent(""" - '{func_name}' called with wrong argument values: - {func_name}{args} - Found signature: - {func_name}{found} - """.format(**locals())).strip() - return ValueError, msg - type_str = ", ".join(type(arg).__name__ for arg in args) - msg = dedent(""" - '{func_name}' called with wrong argument types: - {func_name}({type_str}) - Supported signatures: - """.format(**locals())).strip() - for sig in sigs: - msg += "\n {func_name}{sig}".format(**locals()) - # We don't raise the error here, to avoid the loader in the traceback. - return TypeError, msg - -def check_string_type(s): - if sys.version_info[0] == 3: - return isinstance(s, str) - else: - return isinstance(s, (str, unicode)) - -def make_helptext(func): - existing_doc = func.__doc__ - sigs = get_signature(func) - if not sigs: - return existing_doc - if type(sigs) != list: - sigs = [sigs] - try: - func_name = func.__name__ - except AttribureError: - func_name = func.__func__.__name__ - sigtext = "\n".join(func_name + str(sig) for sig in sigs) - msg = sigtext + "\n\n" + existing_doc if check_string_type(existing_doc) else sigtext - return msg - -# end of file diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/importhandler.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/importhandler.py deleted file mode 100644 index 7af43bea0..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/importhandler.py +++ /dev/null @@ -1,103 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -importhandler.py - -This module handles special actions after the import of PySide modules. -The reason for this was the wish to replace some deprecated functions -by a Python implementation that gives a warning. - -It provides a framework to safely call functions outside of files.dir, -because the implementation of deprecated functions should be visible -to the users (in the hope they don't use it any longer <wink>). - -As a first approach, the function finish_import redirects to -PySide2/support/deprecated.py . There can come other extensions as well. -""" - -try: - from PySide2.support import deprecated - have_deprecated = True -except ImportError: - have_deprecated = False - - -# called by loader.py from signature.cpp -def finish_import(module): - if have_deprecated and module.__name__.startswith("PySide2."): - try: - name = "fix_for_" + module.__name__.split(".")[1] - func = getattr(deprecated, name, None) - if func: - func(module) - except Exception as e: - name = e.__class__.__qualname__ - print(72 * "*") - print("Error in deprecated.py, ignored:") - print(" {name}: {e}".format(**locals())) - -""" -A note for people who might think this could be written in pure Python: - -Sure, by an explicit import of the modules to patch, this is no problem. -But in the general case, a module should only be imported on user -request and not because we want to patch it. So I started over. - -I then tried to do it on demand by redirection of the __import__ function. -Things worked quite nicely as it seemed, but at second view this solution -was much less appealing. - -Reason: -If someone executes as the first PySide statement - - from PySide2 import QtGui - -then this import is already running. We can see the other imports like the -diverse initializations and QtCore, because it is triggered by import of -QtGui. But the QtGui import can not be seen at all! - -With a lot of effort, sys.setprofile() and stack inspection with the inspect -module, it is *perhaps* possible to solve that. I tried for a day and then -gave up, since the solution is anyway not too nice when __import__ must -be overridden. -""" -#eof diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/layout.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/layout.py deleted file mode 100644 index 384273d92..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/layout.py +++ /dev/null @@ -1,282 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -layout.py - -The signature module now has the capability to configure -differently formatted versions of signatures. The default -layout is known from the "__signature__" attribute. - -The function "get_signature(ob, modifier=None)" produces the same -signatures by default. By passing different modifiers, you -can select different layouts. - -This module configures the different layouts which can be used. -It also implements them in this file. The configurations are -used literally as strings like "signature", "existence", etc. -""" - -from textwrap import dedent -from shibokensupport.signature import inspect, typing -from shibokensupport.signature.mapping import ellipsis -from shibokensupport.signature.lib.tool import SimpleNamespace - - -class SignatureLayout(SimpleNamespace): - """ - Configure a signature. - - The layout of signatures can have different layouts which are - controlled by keyword arguments: - - definition=True Determines if self will generated. - defaults=True - ellipsis=False Replaces defaults by "...". - return_annotation=True - parameter_names=True False removes names before ":". - """ - allowed_keys = SimpleNamespace(definition=True, - defaults=True, - ellipsis=False, - return_annotation=True, - parameter_names=True) - allowed_values = True, False - - def __init__(self, **kwds): - args = SimpleNamespace(**self.allowed_keys.__dict__) - args.__dict__.update(kwds) - self.__dict__.update(args.__dict__) - err_keys = list(set(self.__dict__) - set(self.allowed_keys.__dict__)) - if err_keys: - self._attributeerror(err_keys) - err_values = list(set(self.__dict__.values()) - set(self.allowed_values)) - if err_values: - self._valueerror(err_values) - - def __setattr__(self, key, value): - if key not in self.allowed_keys.__dict__: - self._attributeerror([key]) - if value not in self.allowed_values: - self._valueerror([value]) - self.__dict__[key] = value - - def _attributeerror(self, err_keys): - err_keys = ", ".join(err_keys) - allowed_keys = ", ".join(self.allowed_keys.__dict__.keys()) - raise AttributeError(dedent("""\ - Not allowed: '{err_keys}'. - The only allowed keywords are '{allowed_keys}'. - """.format(**locals()))) - - def _valueerror(self, err_values): - err_values = ", ".join(map(str, err_values)) - allowed_values = ", ".join(map(str, self.allowed_values)) - raise ValueError(dedent("""\ - Not allowed: '{err_values}'. - The only allowed values are '{allowed_values}'. - """.format(**locals()))) - -# The following names are used literally in this module. -# This way, we avoid the dict hashing problem. -signature = SignatureLayout() - -existence = SignatureLayout(definition=False, - defaults=False, - return_annotation=False, - parameter_names=False) - -hintingstub = SignatureLayout(ellipsis=True) - -typeerror = SignatureLayout(definition=False, - return_annotation=False, - parameter_names=False) - - -def define_nameless_parameter(): - """ - Create Nameless Parameters - - A nameless parameter has a reduced string representation. - This is done by cloning the parameter type and overwriting its - __str__ method. The inner structure is still a valid parameter. - """ - def __str__(self): - # for Python 2, we must change self to be an instance of P - klass = self.__class__ - self.__class__ = P - txt = P.__str__(self) - self.__class__ = klass - txt = txt[txt.index(":") + 1:].strip() if ":" in txt else txt - return txt - - P = inspect.Parameter - newname = "NamelessParameter" - bases = P.__bases__ - body = dict(P.__dict__) # get rid of mappingproxy - if "__slots__" in body: - # __slots__ would create duplicates - for name in body["__slots__"]: - del body[name] - body["__str__"] = __str__ - return type(newname, bases, body) - - -NamelessParameter = define_nameless_parameter() - -""" -Note on the "Optional" feature: - -When an annotation has a default value that is None, then the -type has to be wrapped into "typing.Optional". - -Note that only the None value creates an Optional expression, -because the None leaves the domain of the variable. -Defaults like integer values are ignored: They stay in the domain. - -That information would be lost when we use the "..." convention. - -Note that the typing module has the remarkable expansion - - Optional[T] is Variant[T, NoneType] - -We want to avoid that when generating the .pyi file. -This is done by a regex in generate_pyi.py . -The following would work in Python 3, but this is a version-dependent -hack that also won't work in Python 2 and would be _very_ complex. -""" -# import sys -# if sys.version_info[0] == 3: -# class hugo(list):pass -# typing._normalize_alias["hugo"] = "Optional" -# Optional = typing._alias(hugo, typing.T, inst=False) -# else: -# Optional = typing.Optional - - -def make_signature_nameless(signature): - """ - Make a Signature Nameless - - We use an existing signature and change the type of its parameters. - The signature looks different, but is totally intact. - """ - for key in signature.parameters.keys(): - signature.parameters[key].__class__ = NamelessParameter - - -_POSITIONAL_ONLY = inspect._POSITIONAL_ONLY -_POSITIONAL_OR_KEYWORD = inspect._POSITIONAL_OR_KEYWORD -_VAR_POSITIONAL = inspect._VAR_POSITIONAL -_KEYWORD_ONLY = inspect._KEYWORD_ONLY -_VAR_KEYWORD = inspect._VAR_KEYWORD -_empty = inspect._empty - -def create_signature(props, key): - if not props: - # empty signatures string - return - if isinstance(props["multi"], list): - # multi sig: call recursively - return list(create_signature(elem, key) - for elem in props["multi"]) - if type(key) is tuple: - sig_kind, modifier = key - else: - sig_kind, modifier = key, "signature" - - layout = globals()[modifier] # lookup of the modifier in this module - if not isinstance(layout, SignatureLayout): - raise SystemError("Modifiers must be names of a SignatureLayout " - "instance") - - # this is the basic layout of a signature - varnames = props["varnames"] - if layout.definition: - if sig_kind == "function": - pass - elif sig_kind == "method": - varnames = ("self",) + varnames - elif sig_kind == "staticmethod": - pass - elif sig_kind == "classmethod": - varnames = ("klass",) + varnames - else: - raise SystemError("Methods must be function, method, staticmethod" - " or classmethod") - # calculate the modifications - defaults = props["defaults"][:] - if not layout.defaults: - defaults = () - annotations = props["annotations"].copy() - if not layout.return_annotation and "return" in annotations: - del annotations["return"] - - # Build a signature. - kind = inspect._POSITIONAL_OR_KEYWORD - params = [] - for idx, name in enumerate(varnames): - if name.startswith("**"): - kind = _VAR_KEYWORD - elif name.startswith("*"): - kind = _VAR_POSITIONAL - ann = annotations.get(name, _empty) - name = name.lstrip("*") - defpos = idx - len(varnames) + len(defaults) - default = defaults[defpos] if defpos >= 0 else _empty - if default is None: - ann = typing.Optional[ann] - if default is not _empty and layout.ellipsis: - default = ellipsis - param = inspect.Parameter(name, kind, annotation=ann, default=default) - params.append(param) - if kind == _VAR_POSITIONAL: - kind = _KEYWORD_ONLY - sig = inspect.Signature(params, - return_annotation=annotations.get('return', _empty), - __validate_parameters__=False) - - # the special case of nameless parameters - if not layout.parameter_names: - make_signature_nameless(sig) - return sig - -# end of file diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/__init__.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/__init__.py deleted file mode 100644 index 2d640cb89..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/__init__.py +++ /dev/null @@ -1,40 +0,0 @@ -############################################################################# -## -## Copyright (C) 2018 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -# this file intentionally left blank diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py deleted file mode 100644 index fa4d5e77c..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/enum_sig.py +++ /dev/null @@ -1,219 +0,0 @@ -############################################################################# -## -## Copyright (C) 2020 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -enum_sig.py - -Enumerate all signatures of a class. - -This module separates the enumeration process from the formatting. -It is not easy to adhere to this protocol, but in the end, it paid off -by producing a lot of clarity. -""" - -import sys -from shibokensupport.signature import inspect -from shibokensupport.signature import get_signature - - -class ExactEnumerator(object): - """ - ExactEnumerator enumerates all signatures in a module as they are. - - This class is used for generating complete listings of all signatures. - An appropriate formatter should be supplied, if printable output - is desired. - """ - - def __init__(self, formatter, result_type=dict): - global EnumType - try: - # Lazy import - from PySide2.QtCore import Qt - EnumType = type(Qt.Key) - except ImportError: - EnumType = None - - self.fmt = formatter - self.result_type = result_type - self.fmt.level = 0 - self.fmt.after_enum = self.after_enum - self._after_enum = False - - def after_enum(self): - ret = self._after_enum - self._after_enum = False - - def module(self, mod_name): - __import__(mod_name) - self.fmt.mod_name = mod_name - with self.fmt.module(mod_name): - module = sys.modules[mod_name] - members = inspect.getmembers(module, inspect.isclass) - functions = inspect.getmembers(module, inspect.isroutine) - ret = self.result_type() - self.fmt.class_name = None - for class_name, klass in members: - ret.update(self.klass(class_name, klass)) - if isinstance(klass, EnumType): - raise SystemError("implement enum instances at module level") - for func_name, func in functions: - ret.update(self.function(func_name, func)) - return ret - - def klass(self, class_name, klass): - ret = self.result_type() - if "<" in class_name: - # This is happening in QtQuick for some reason: - ## class QSharedPointer<QQuickItemGrabResult >: - # We simply skip over this class. - return ret - bases_list = [] - for base in klass.__bases__: - name = base.__name__ - if name not in ("object", "type"): - name = base.__module__ + "." + name - bases_list.append(name) - class_str = "{}({})".format(class_name, ", ".join(bases_list)) - # class_members = inspect.getmembers(klass) - # gives us also the inherited things. - class_members = sorted(list(klass.__dict__.items())) - subclasses = [] - functions = [] - enums = [] - - for thing_name, thing in class_members: - if inspect.isclass(thing): - subclass_name = ".".join((class_name, thing_name)) - subclasses.append((subclass_name, thing)) - elif inspect.isroutine(thing): - func_name = thing_name.split(".")[0] # remove ".overload" - signature = getattr(thing, "__signature__", None) - if signature is not None: - functions.append((func_name, thing)) - elif type(type(thing)) is EnumType: - enums.append((thing_name, thing)) - init_signature = getattr(klass, "__signature__", None) - enums.sort(key=lambda tup: tup[1]) # sort by enum value - self.fmt.have_body = bool(subclasses or functions or enums or init_signature) - - with self.fmt.klass(class_name, class_str): - self.fmt.level += 1 - self.fmt.class_name = class_name - if hasattr(self.fmt, "enum"): - # this is an optional feature - for enum_name, value in enums: - with self.fmt.enum(class_name, enum_name, int(value)): - pass - for subclass_name, subclass in subclasses: - if klass == subclass: - # this is a side effect of the typing module for Python 2.7 - # via the "._gorg" property, which we can safely ignore. - print("Warning: {class_name} points to itself via {subclass_name}, skipped!" - .format(**locals())) - continue - ret.update(self.klass(subclass_name, subclass)) - self.fmt.class_name = class_name - ret.update(self.function("__init__", klass)) - for func_name, func in functions: - func_kind = get_signature(func, "__func_kind__") - modifier = func_kind if func_kind in ( - "staticmethod", "classmethod") else None - ret.update(self.function(func_name, func, modifier)) - self.fmt.level -= 1 - return ret - - def function(self, func_name, func, modifier=None): - self.fmt.level += 1 - ret = self.result_type() - signature = func.__signature__ - if signature is not None: - with self.fmt.function(func_name, signature, modifier) as key: - ret[key] = signature - self.fmt.level -= 1 - return ret - - -def stringify(signature): - if isinstance(signature, list): - # remove duplicates which still sometimes occour: - ret = set(stringify(sig) for sig in signature) - return sorted(ret) if len(ret) > 1 else list(ret)[0] - return tuple(str(pv) for pv in signature.parameters.values()) - - -class SimplifyingEnumerator(ExactEnumerator): - """ - SimplifyingEnumerator enumerates all signatures in a module filtered. - - There are no default values, no variable - names and no self parameter. Only types are present after simplification. - The functions 'next' resp. '__next__' are removed - to make the output identical for Python 2 and 3. - An appropriate formatter should be supplied, if printable output - is desired. - """ - - def function(self, func_name, func, modifier=None): - ret = self.result_type() - signature = get_signature(func, 'existence') - sig = stringify(signature) if signature is not None else None - if sig is not None and func_name not in ("next", "__next__", "__div__"): - with self.fmt.function(func_name, sig) as key: - ret[key] = sig - return ret - -class HintingEnumerator(ExactEnumerator): - """ - HintingEnumerator enumerates all signatures in a module slightly changed. - - This class is used for generating complete listings of all signatures for - hinting stubs. Only default values are replaced by "...". - """ - - def function(self, func_name, func, modifier=None): - ret = self.result_type() - signature = get_signature(func, 'hintingstub') - if signature is not None: - with self.fmt.function(func_name, signature, modifier) as key: - ret[key] = signature - return ret - diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py deleted file mode 100644 index 24e75e42c..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/lib/tool.py +++ /dev/null @@ -1,154 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -tool.py - -Some useful stuff, see below. -On the function with_metaclass see the answer from Martijn Pieters on -https://stackoverflow.com/questions/18513821/python-metaclass-understanding-the-with-metaclass -""" - -from textwrap import dedent - - -class SimpleNamespace(object): - # From types.rst, because the builtin is implemented in Python 3, only. - def __init__(self, **kwargs): - self.__dict__.update(kwargs) - - def __repr__(self): - keys = sorted(self.__dict__) - items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys) - return "{}({})".format(type(self).__name__, ", ".join(items)) - - def __eq__(self, other): - return self.__dict__ == other.__dict__ - -try: - from types import SimpleNamespace -except ImportError: - pass - - -def build_brace_pattern(level, separators=""): - """ - Build a brace pattern upto a given depth - - The brace pattern parses any pattern with round, square, curly, or angle - brackets. Inside those brackets, any characters are allowed. - - The structure is quite simple and is recursively repeated as needed. - When separators are given, the match stops at that separator. - - Reason to use this instead of some Python function: - The resulting regex is _very_ fast! - - A faster replacement would be written in C, but this solution is - sufficient when the nesting level is not too large. - - Because of the recursive nature of the pattern, the size grows by a factor - of 4 at every level, as does the creation time. Up to a level of 6, this - is below 10 ms. - - There are other regex engines available which allow recursive patterns, - avoiding this problem completely. It might be considered to switch to - such an engine if the external module is not a problem. - """ - def escape(str): - return "".join("\\" + c for c in str) - - ro, rc = round = "()" - so, sc = square = "[]" - co, cc = curly = "CD" # we insert "{}", later... - ao, ac = angle = "<>" - qu, bs = '"', "\\" - all = round + square + curly + angle - __ = " " - ro, rc, so, sc, co, cc, ao, ac, separators, qu, bs, all = map( - escape, (ro, rc, so, sc, co, cc, ao, ac, separators, qu, bs, all)) - - no_brace_sep_q = r"[^{all}{separators}{qu}{bs}]".format(**locals()) - no_quote = r"(?: [^{qu}{bs}] | {bs}. )*".format(**locals()) - pattern = dedent(r""" - ( - (?: {__} {no_brace_sep_q} - | {qu} {no_quote} {qu} - | {ro} {replacer} {rc} - | {so} {replacer} {sc} - | {co} {replacer} {cc} - | {ao} {replacer} {ac} - )+ - ) - """) - no_braces_q = "[^{all}{qu}{bs}]*".format(**locals()) - repeated = dedent(r""" - {indent} (?: {__} {no_braces_q} - {indent} | {qu} {no_quote} {qu} - {indent} | {ro} {replacer} {rc} - {indent} | {so} {replacer} {sc} - {indent} | {co} {replacer} {cc} - {indent} | {ao} {replacer} {ac} - {indent} )* - """) - for idx in range(level): - pattern = pattern.format(replacer = repeated if idx < level-1 else no_braces_q, - indent = idx * " ", **locals()) - return pattern.replace("C", "{").replace("D", "}") - - -# Copied from the six module: -def with_metaclass(meta, *bases): - """Create a base class with a metaclass.""" - # This requires a bit of explanation: the basic idea is to make a dummy - # metaclass for one level of class instantiation that replaces itself with - # the actual metaclass. - class metaclass(type): - - def __new__(cls, name, this_bases, d): - return meta(name, bases, d) - - @classmethod - def __prepare__(cls, name, this_bases): - return meta.__prepare__(name, bases) - return type.__new__(metaclass, 'temporary_class', (), {}) - -# eof diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/loader.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/loader.py deleted file mode 100644 index 1efc6fde5..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/loader.py +++ /dev/null @@ -1,221 +0,0 @@ -# This Python file uses the following encoding: utf-8 -# It has been edited by fix-complaints.py . - -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -loader.py - -The loader has to load the signature module completely at startup, -to make sure that the functions are available when needed. -This is meanwhile necessary to make the '__doc__' attribute work correctly. - -It does not mean that everything is initialized in advance. Only the modules -are loaded completely after 'import PySide2'. - -This version uses both a normal directory, but has also an embedded ZIP file -as a fallback solution. The ZIP file is generated by 'embedding_generator.py' -and embedded into 'signature.cpp' as "embed/signature.inc". - -Meanwhile, the ZIP file grew so much, that MSVC had problems -with it's 64k string limit, so we had to break the string up. -See 'zipped_string_sequence' in signature.cpp. -""" - -import sys -import os -import traceback -import types - -# On Python 2, we only have ImportError, which is way too coarse. -# When problems occour, please use Python 3, because it has the finer -# ModuleNotFoundError. - -try: - ModuleNotFoundError -except NameError: - ModuleNotFoundError = ImportError - -def _qualname(x): - return getattr(x, "__qualname__", x.__name__) - -# patching inspect's formatting to keep the word "typing": -def formatannotation(annotation, base_module=None): - # if getattr(annotation, '__module__', None) == 'typing': - # return repr(annotation).replace('typing.', '') - if isinstance(annotation, type): - name = _qualname(annotation) - if annotation.__module__ in ('builtins', base_module): - return name - return annotation.__module__ + '.' + name - return repr(annotation) - -# Note also that during the tests we have a different encoding that would -# break the Python license decorated files without an encoding line. - -# name used in signature.cpp -def pyside_type_init(type_key, sig_strings): - return parser.pyside_type_init(type_key, sig_strings) - -# name used in signature.cpp -def create_signature(props, key): - return layout.create_signature(props, key) - -# name used in signature.cpp -def seterror_argument(args, func_name): - return errorhandler.seterror_argument(args, func_name) - -# name used in signature.cpp -def make_helptext(func): - return errorhandler.make_helptext(func) - -# name used in signature.cpp -def finish_import(module): - return importhandler.finish_import(module) - - -import signature_bootstrap -from shibokensupport import signature -signature.get_signature = signature_bootstrap.get_signature -del signature_bootstrap - -def _get_modname(mod): - return mod.__spec__.name if getattr(mod, "__spec__", None) else mod.__name__ - -def _set_modname(mod, name): - if getattr(mod, "__spec__", None): - mod.__spec__.name = name - else: - mod.__name__ = name - - -def put_into_package(package, module, override=None): - # take the last component of the module name - name = (override if override else _get_modname(module)).rsplit(".", 1)[-1] - # allow access as {package}.typing - if package: - setattr(package, name, module) - # put into sys.modules as a package to allow all import options - fullname = "{}.{}".format(_get_modname(package), name) if package else name - _set_modname(module, fullname) - # publish new dotted name in sys.modules - sys.modules[fullname] = module - - -# Debug: used to inspect what each step loads -def list_modules(message): - ext_modules = {key:value for (key, value) in sys.modules.items() - if hasattr(value, "__file__")} - print("SYS.MODULES", message, len(sys.modules), len(ext_modules)) - for (name, module) in sorted(ext_modules.items()): - print(" {:23}".format(name), repr(module)[:70]) - - -orig_typing = True -if sys.version_info >= (3,): - import typing - import inspect - inspect.formatannotation = formatannotation -else: - tp_name = "typing" - if tp_name not in sys.modules: - orig_typing = False - from shibokensupport import typing27 as typing - sys.modules[tp_name] = typing - typing.__name__ = tp_name - else: - import typing - import inspect - namespace = inspect.__dict__ - from shibokensupport import backport_inspect as inspect - _doc = inspect.__doc__ - inspect.__dict__.update(namespace) - inspect.__doc__ += _doc - # force inspect to find all attributes. See "heuristic" in pydoc.py! - inspect.__all__ = list(x for x in dir(inspect) if not x.startswith("_")) - -# Fix the module names in typing if possible. This is important since -# the typing names should be I/O compatible, so that typing.Dict -# shows itself as "typing.Dict". -for name, obj in typing.__dict__.items(): - if hasattr(obj, "__module__"): - try: - obj.__module__ = "typing" - except (TypeError, AttributeError): - pass - -import shibokensupport -put_into_package(shibokensupport.signature, typing, "typing") -put_into_package(shibokensupport.signature, inspect, "inspect") - - -def move_into_pyside_package(): - import PySide2 - try: - import PySide2.support - except ModuleNotFoundError: - PySide2.support = types.ModuleType("PySide2.support") - put_into_package(PySide2.support, signature) - put_into_package(PySide2.support.signature, mapping) - put_into_package(PySide2.support.signature, errorhandler) - put_into_package(PySide2.support.signature, layout) - put_into_package(PySide2.support.signature, lib) - put_into_package(PySide2.support.signature, parser) - put_into_package(PySide2.support.signature, importhandler) - put_into_package(PySide2.support.signature.lib, enum_sig) - - put_into_package(None if orig_typing else PySide2.support.signature, typing) - put_into_package(PySide2.support.signature, inspect) - -from shibokensupport.signature import mapping -from shibokensupport.signature import errorhandler -from shibokensupport.signature import layout -from shibokensupport.signature import lib -from shibokensupport.signature import parser -from shibokensupport.signature import importhandler -from shibokensupport.signature.lib import enum_sig - -if "PySide2" in sys.modules: - # We publish everything under "PySide2.support.signature", again. - move_into_pyside_package() - -# end of file diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py deleted file mode 100644 index 0571b11bd..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/mapping.py +++ /dev/null @@ -1,645 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -""" -mapping.py - -This module has the mapping from the pyside C-modules view of signatures -to the Python representation. - -The PySide modules are not loaded in advance, but only after they appear -in sys.modules. This minimizes the loading overhead. -""" - -import sys -import struct -import os - -from shibokensupport.signature import typing -from shibokensupport.signature.typing import TypeVar, Generic -from shibokensupport.signature.lib.tool import with_metaclass - -class ellipsis(object): - def __repr__(self): - return "..." - -ellipsis = ellipsis() -Point = typing.Tuple[float, float] -Variant = typing.Any -ModelIndexList = typing.List[int] -QImageCleanupFunction = typing.Callable - -# unfortunately, typing.Optional[t] expands to typing.Union[t, NoneType] -# Until we can force it to create Optional[t] again, we use this. -NoneType = type(None) - -_S = TypeVar("_S") - -MultiMap = typing.DefaultDict[str, typing.List[str]] - -# ulong_max is only 32 bit on windows. -ulong_max = 2*sys.maxsize+1 if len(struct.pack("L", 1)) != 4 else 0xffffffff -ushort_max = 0xffff - -GL_COLOR_BUFFER_BIT = 0x00004000 -GL_NEAREST = 0x2600 - -WId = int - -# from 5.9 -GL_TEXTURE_2D = 0x0DE1 -GL_RGBA = 0x1908 - - -class _NotCalled(str): - """ - Wrap some text with semantics - - This class is wrapped around text in order to avoid calling it. - There are three reasons for this: - - - some instances cannot be created since they are abstract, - - some can only be created after qApp was created, - - some have an ugly __repr__ with angle brackets in it. - - By using derived classes, good looking instances can be created - which can be used to generate source code or .pyi files. When the - real object is needed, the wrapper can simply be called. - """ - def __repr__(self): - return "{}({})".format(type(self).__name__, self) - - def __call__(self): - from shibokensupport.signature.mapping import __dict__ as namespace - text = self if self.endswith(")") else self + "()" - return eval(text, namespace) - -USE_PEP563 = False -# Note: we cannot know if this feature has been imported. -# Otherwise it would be "sys.version_info[:2] >= (3, 7)". -# We *can* eventually inspect sys.modules and look if -# the calling module has this future statement set, -# but should we do that? - - -# Some types are abstract. They just show their name. -class Virtual(_NotCalled): - pass - -# Other types I simply could not find. -class Missing(_NotCalled): - # The string must be quoted, because the object does not exist. - def __repr__(self): - if USE_PEP563: - return _NotCalled.__repr__(self) - return '{}("{}")'.format(type(self).__name__, self) - - -class Invalid(_NotCalled): - pass - -# Helper types -class Default(_NotCalled): - pass - - -class Instance(_NotCalled): - pass - -# Parameterized primitive variables -class _Parameterized(object): - def __init__(self, type): - self.type = type - self.__name__ = self.__class__.__name__ - - def __repr__(self): - return "{}({})".format( - type(self).__name__, self.type.__name__) - -# Mark the primitive variables to be moved into the result. -class ResultVariable(_Parameterized): - pass - -# Mark the primitive variables to become Sequence, Iterable or List -# (decided in the parser). -class ArrayLikeVariable(_Parameterized): - pass - -StringList = ArrayLikeVariable(str) - - -class Reloader(object): - """ - Reloder class - - This is a singleton class which provides the update function for the - shiboken and PySide classes. - """ - def __init__(self): - self.sys_module_count = 0 - - @staticmethod - def module_valid(mod): - if getattr(mod, "__file__", None) and not os.path.isdir(mod.__file__): - ending = os.path.splitext(mod.__file__)[-1] - return ending not in (".py", ".pyc", ".pyo", ".pyi") - return False - - def update(self): - """ - 'update' imports all binary modules which are already in sys.modules. - The reason is to follow all user imports without introducing new ones. - This function is called by pyside_type_init to adapt imports - when the number of imported modules has changed. - """ - if self.sys_module_count == len(sys.modules): - return - self.sys_module_count = len(sys.modules) - g = globals() - # PYSIDE-1009: Try to recognize unknown modules in errorhandler.py - candidates = list(mod_name for mod_name in sys.modules.copy() - if self.module_valid(sys.modules[mod_name])) - for mod_name in candidates: - # 'top' is PySide2 when we do 'import PySide.QtCore' - # or Shiboken if we do 'import Shiboken'. - # Convince yourself that these two lines below have the same - # global effect as "import Shiboken" or "import PySide2.QtCore". - top = __import__(mod_name) - g[top.__name__] = top - proc_name = "init_" + mod_name.replace(".", "_") - if proc_name in g: - # Modules are in place, we can update the type_map. - g.update(g.pop(proc_name)()) - - -def check_module(mod): - # During a build, there exist the modules already as directories, - # although the '*.so' was not yet created. This causes a problem - # in Python 3, because it accepts folders as namespace modules - # without enforcing an '__init__.py'. - if not Reloader.module_valid(mod): - mod_name = mod.__name__ - raise ImportError("Module '{mod_name}' is not a binary module!" - .format(**locals())) - -update_mapping = Reloader().update -type_map = {} -namespace = globals() # our module's __dict__ - -type_map.update({ - "...": ellipsis, - "bool": bool, - "char": int, - "char*": str, - "char*const": str, - "double": float, - "float": float, - "int": int, - "List": ArrayLikeVariable, - "long": int, - "PyCallable": typing.Callable, - "PyObject": object, - "PySequence": typing.Iterable, # important for numpy - "PyTypeObject": type, - "QChar": str, - "QHash": typing.Dict, - "qint16": int, - "qint32": int, - "qint64": int, - "qint8": int, - "qintptr": int, - "QList": ArrayLikeVariable, - "qlonglong": int, - "QMap": typing.Dict, - "QPair": typing.Tuple, - "qptrdiff": int, - "qreal": float, - "QSet": typing.Set, - "QString": str, - "QStringList": StringList, - "quint16": int, - "quint32": int, - "quint32": int, - "quint64": int, - "quint8": int, - "quintptr": int, - "qulonglong": int, - "QVariant": Variant, - "QVector": typing.List, - "real": float, - "short": int, - "signed char": int, - "signed long": int, - "std.list": typing.List, - "std.map": typing.Dict, - "std.pair": typing.Tuple, - "std.vector": typing.List, - "str": str, - "true": True, - "Tuple": typing.Tuple, - "uchar": int, - "uchar*": str, - "uint": int, - "ulong": int, - "ULONG_MAX": ulong_max, - "unsigned char": int, # 5.9 - "unsigned char*": str, - "unsigned int": int, - "unsigned long int": int, # 5.6, RHEL 6.6 - "unsigned long long": int, - "unsigned long": int, - "unsigned short int": int, # 5.6, RHEL 6.6 - "unsigned short": int, - "Unspecified": None, - "ushort": int, - "void": int, # be more specific? - "WId": WId, - "zero(bytes)": b"", - "zero(Char)": 0, - "zero(float)": 0, - "zero(int)": 0, - "zero(object)": None, - "zero(str)": "", - "zero(typing.Any)": None, - }) - -type_map.update({ - # Handling variables declared as array: - "array double*" : ArrayLikeVariable(float), - "array float*" : ArrayLikeVariable(float), - "array GLint*" : ArrayLikeVariable(int), - "array GLuint*" : ArrayLikeVariable(int), - "array int*" : ArrayLikeVariable(int), - "array long long*" : ArrayLikeVariable(int), - "array long*" : ArrayLikeVariable(int), - "array short*" : ArrayLikeVariable(int), - "array signed char*" : bytes, - "array unsigned char*" : bytes, - "array unsigned int*" : ArrayLikeVariable(int), - "array unsigned short*" : ArrayLikeVariable(int), - }) - -type_map.update({ - # Special cases: - "char*" : bytes, - "QChar*" : bytes, - "quint32*" : int, # only for QRandomGenerator - "quint8*" : bytearray, # only for QCborStreamReader and QCborValue - "uchar*" : bytes, - "unsigned char*": bytes, - }) - -type_map.update({ - # Handling variables that are returned, eventually as Tuples: - "bool*" : ResultVariable(bool), - "float*" : ResultVariable(float), - "int*" : ResultVariable(int), - "long long*" : ResultVariable(int), - "long*" : ResultVariable(int), - "PStr*" : ResultVariable(str), # module sample - "qint32*" : ResultVariable(int), - "qint64*" : ResultVariable(int), - "qreal*" : ResultVariable(float), - "QString*" : ResultVariable(str), - "quint16*" : ResultVariable(int), - "uint*" : ResultVariable(int), - "unsigned int*" : ResultVariable(int), - "QStringList*" : ResultVariable(StringList), - }) - - -# The Shiboken Part -def init_Shiboken(): - type_map.update({ - "PyType": type, - "shiboken2.bool": bool, - "size_t": int, - }) - return locals() - - -def init_minimal(): - type_map.update({ - "MinBool": bool, - }) - return locals() - - -def init_sample(): - import datetime - type_map.update({ - "char": int, - "char**": typing.List[str], - "Complex": complex, - "double": float, - "Foo.HANDLE": int, - "HANDLE": int, - "Null": None, - "nullptr": None, - "ObjectType.Identifier": Missing("sample.ObjectType.Identifier"), - "OddBool": bool, - "PStr": str, - "PyDate": datetime.date, - "sample.bool": bool, - "sample.char": int, - "sample.double": float, - "sample.int": int, - "sample.ObjectType": object, - "sample.OddBool": bool, - "sample.Photon.TemplateBase[Photon.DuplicatorType]": sample.Photon.ValueDuplicator, - "sample.Photon.TemplateBase[Photon.IdentityType]": sample.Photon.ValueIdentity, - "sample.Point": Point, - "sample.PStr": str, - "sample.unsigned char": int, - "std.size_t": int, - "std.string": str, - "ZeroIn": 0, - 'Str("<unk")': "<unk", - 'Str("<unknown>")': "<unknown>", - 'Str("nown>")': "nown>", - }) - return locals() - - -def init_other(): - import numbers - type_map.update({ - "other.ExtendsNoImplicitConversion": Missing("other.ExtendsNoImplicitConversion"), - "other.Number": numbers.Number, - }) - return locals() - - -def init_smart(): - # This missing type should be defined in module smart. We cannot set it to Missing() - # because it is a container type. Therefore, we supply a surrogate: - global SharedPtr - class SharedPtr(Generic[_S]): - __module__ = "smart" - smart.SharedPtr = SharedPtr - type_map.update({ - "smart.Smart.Integer2": int, - }) - return locals() - - -# The PySide Part -def init_PySide2_QtCore(): - from PySide2.QtCore import Qt, QUrl, QDir - from PySide2.QtCore import QRect, QSize, QPoint, QLocale, QByteArray - from PySide2.QtCore import QMarginsF # 5.9 - try: - # seems to be not generated by 5.9 ATM. - from PySide2.QtCore import Connection - except ImportError: - pass - type_map.update({ - "' '": " ", - "'%'": "%", - "'g'": "g", - "4294967295UL": 4294967295, # 5.6, RHEL 6.6 - "CheckIndexOption.NoOption": Instance( - "PySide2.QtCore.QAbstractItemModel.CheckIndexOptions.NoOption"), # 5.11 - "false": False, - "list of QAbstractAnimation": typing.List[PySide2.QtCore.QAbstractAnimation], - "list of QAbstractState": typing.List[PySide2.QtCore.QAbstractState], - "long long": int, - "NULL": None, # 5.6, MSVC - "nullptr": None, # 5.9 - "PyByteArray": bytearray, - "PyBytes": bytes, - "PySide2.QtCore.QCborStreamReader.StringResult[PySide2.QtCore.QByteArray]": - PySide2.QtCore.QCborStringResultByteArray, - "PySide2.QtCore.QCborStreamReader.StringResult[QString]": - PySide2.QtCore.QCborStringResultString, - "PySide2.QtCore.QCborStreamReader.QCborStringResultByteArray": - PySide2.QtCore.QCborStringResultByteArray, # 5.14, why? - "PySide2.QtCore.QCborStreamReader.QCborStringResultString": - PySide2.QtCore.QCborStringResultString, # 5.14, why? - "PySide2.QtCore.QUrl.ComponentFormattingOptions": - PySide2.QtCore.QUrl.ComponentFormattingOption, # mismatch option/enum, why??? - "PyUnicode": typing.Text, - "Q_NULLPTR": None, - "QDir.Filters(AllEntries | NoDotAndDotDot)": Instance( - "QDir.Filters(QDir.AllEntries | QDir.NoDotAndDotDot)"), - "QDir.SortFlags(Name | IgnoreCase)": Instance( - "QDir.SortFlags(QDir.Name | QDir.IgnoreCase)"), - "QGenericArgument((0))": ellipsis, # 5.6, RHEL 6.6. Is that ok? - "QGenericArgument()": ellipsis, - "QGenericArgument(0)": ellipsis, - "QGenericArgument(NULL)": ellipsis, # 5.6, MSVC - "QGenericArgument(nullptr)": ellipsis, # 5.10 - "QGenericArgument(Q_NULLPTR)": ellipsis, - "QJsonObject": typing.Dict[str, PySide2.QtCore.QJsonValue], - "QModelIndex()": Invalid("PySide2.QtCore.QModelIndex"), # repr is btw. very wrong, fix it?! - "QModelIndexList": ModelIndexList, - "QModelIndexList": ModelIndexList, - "QString()": "", - "QStringList()": [], - "QStringRef": str, - "QStringRef": str, - "Qt.HANDLE": int, # be more explicit with some constants? - "QUrl.FormattingOptions(PrettyDecoded)": Instance( - "QUrl.FormattingOptions(QUrl.PrettyDecoded)"), - "QVariant()": Invalid(Variant), - "QVariant.Type": type, # not so sure here... - "QVariantMap": typing.Dict[str, Variant], - "QVariantMap": typing.Dict[str, Variant], - }) - try: - type_map.update({ - "PySide2.QtCore.QMetaObject.Connection": PySide2.QtCore.Connection, # wrong! - }) - except AttributeError: - # this does not exist on 5.9 ATM. - pass - return locals() - - -def init_PySide2_QtGui(): - from PySide2.QtGui import QPageLayout, QPageSize # 5.12 macOS - type_map.update({ - "0.0f": 0.0, - "1.0f": 1.0, - "GL_COLOR_BUFFER_BIT": GL_COLOR_BUFFER_BIT, - "GL_NEAREST": GL_NEAREST, - "int32_t": int, - "QPixmap()": Default("PySide2.QtGui.QPixmap"), # can't create without qApp - "QPlatformSurface*": int, # a handle - "QVector< QTextLayout.FormatRange >()": [], # do we need more structure? - "uint32_t": int, - "uint8_t": int, - "USHRT_MAX": ushort_max, - }) - return locals() - - -def init_PySide2_QtWidgets(): - from PySide2.QtWidgets import QWidget, QMessageBox, QStyleOption, QStyleHintReturn, QStyleOptionComplex - from PySide2.QtWidgets import QGraphicsItem, QStyleOptionGraphicsItem # 5.9 - type_map.update({ - "QMessageBox.StandardButtons(Yes | No)": Instance( - "QMessageBox.StandardButtons(QMessageBox.Yes | QMessageBox.No)"), - "QWidget.RenderFlags(DrawWindowBackground | DrawChildren)": Instance( - "QWidget.RenderFlags(QWidget.DrawWindowBackground | QWidget.DrawChildren)"), - "SH_Default": QStyleHintReturn.SH_Default, - "SO_Complex": QStyleOptionComplex.SO_Complex, - "SO_Default": QStyleOption.SO_Default, - "static_cast<Qt.MatchFlags>(Qt.MatchExactly|Qt.MatchCaseSensitive)": Instance( - "Qt.MatchFlags(Qt.MatchExactly | Qt.MatchCaseSensitive)"), - "Type": PySide2.QtWidgets.QListWidgetItem.Type, - }) - return locals() - - -def init_PySide2_QtSql(): - from PySide2.QtSql import QSqlDatabase - type_map.update({ - "QLatin1String(defaultConnection)": QSqlDatabase.defaultConnection, - "QVariant.Invalid": Invalid("Variant"), # not sure what I should create, here... - }) - return locals() - - -def init_PySide2_QtNetwork(): - best_structure = typing.OrderedDict if getattr(typing, "OrderedDict", None) else typing.Dict - type_map.update({ - "QMultiMap[PySide2.QtNetwork.QSsl.AlternativeNameEntryType, QString]": - best_structure[PySide2.QtNetwork.QSsl.AlternativeNameEntryType, typing.List[str]], - }) - del best_structure - return locals() - - -def init_PySide2_QtXmlPatterns(): - from PySide2.QtXmlPatterns import QXmlName - type_map.update({ - "QXmlName.NamespaceCode": Missing("PySide2.QtXmlPatterns.QXmlName.NamespaceCode"), - "QXmlName.PrefixCode": Missing("PySide2.QtXmlPatterns.QXmlName.PrefixCode"), - }) - return locals() - - -def init_PySide2_QtMultimedia(): - import PySide2.QtMultimediaWidgets - # Check if foreign import is valid. See mapping.py in shiboken2. - check_module(PySide2.QtMultimediaWidgets) - type_map.update({ - "QGraphicsVideoItem": PySide2.QtMultimediaWidgets.QGraphicsVideoItem, - "qint64": int, - "QVideoWidget": PySide2.QtMultimediaWidgets.QVideoWidget, - }) - return locals() - - -def init_PySide2_QtOpenGL(): - type_map.update({ - "GLbitfield": int, - "GLenum": int, - "GLfloat": float, # 5.6, MSVC 15 - "GLint": int, - "GLuint": int, - }) - return locals() - - -def init_PySide2_QtQml(): - type_map.update({ - "QJSValueList()": [], - "QVariantHash()": typing.Dict[str, Variant], # from 5.9 - }) - return locals() - - -def init_PySide2_QtQuick(): - type_map.update({ - "PySide2.QtQuick.QSharedPointer[PySide2.QtQuick.QQuickItemGrabResult]": - PySide2.QtQuick.QQuickItemGrabResult, - "UnsignedShortType": int, - }) - return locals() - - -def init_PySide2_QtScript(): - type_map.update({ - "QScriptValueList()": [], - }) - return locals() - - -def init_PySide2_QtTest(): - type_map.update({ - "PySide2.QtTest.QTest.PySideQTouchEventSequence": PySide2.QtTest.QTest.QTouchEventSequence, - "PySide2.QtTest.QTouchEventSequence": PySide2.QtTest.QTest.QTouchEventSequence, - }) - return locals() - -# from 5.6, MSVC -def init_PySide2_QtWinExtras(): - type_map.update({ - "QList< QWinJumpListItem* >()": [], - }) - return locals() - -# from 5.12, macOS -def init_PySide2_QtDataVisualization(): - from PySide2.QtDataVisualization import QtDataVisualization - QtDataVisualization.QBarDataRow = typing.List[QtDataVisualization.QBarDataItem] - QtDataVisualization.QBarDataArray = typing.List[QtDataVisualization.QBarDataRow] - QtDataVisualization.QSurfaceDataRow = typing.List[QtDataVisualization.QSurfaceDataItem] - QtDataVisualization.QSurfaceDataArray = typing.List[QtDataVisualization.QSurfaceDataRow] - type_map.update({ - "100.0f": 100.0, - "QtDataVisualization.QBarDataArray": QtDataVisualization.QBarDataArray, - "QtDataVisualization.QBarDataArray*": QtDataVisualization.QBarDataArray, - "QtDataVisualization.QSurfaceDataArray": QtDataVisualization.QSurfaceDataArray, - "QtDataVisualization.QSurfaceDataArray*": QtDataVisualization.QSurfaceDataArray, - }) - return locals() - - -def init_testbinding(): - type_map.update({ - "testbinding.PySideCPP2.TestObjectWithoutNamespace": testbinding.TestObjectWithoutNamespace, - }) - return locals() - -# end of file diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py deleted file mode 100644 index 2053c3e9d..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/parser.py +++ /dev/null @@ -1,458 +0,0 @@ -############################################################################# -## -## Copyright (C) 2019 The Qt Company Ltd. -## Contact: https://www.qt.io/licensing/ -## -## This file is part of Qt for Python. -## -## $QT_BEGIN_LICENSE:LGPL$ -## Commercial License Usage -## Licensees holding valid commercial Qt licenses may use this file in -## accordance with the commercial license agreement provided with the -## Software or, alternatively, in accordance with the terms contained in -## a written agreement between you and The Qt Company. For licensing terms -## and conditions see https://www.qt.io/terms-conditions. For further -## information use the contact form at https://www.qt.io/contact-us. -## -## GNU Lesser General Public License Usage -## Alternatively, this file may be used under the terms of the GNU Lesser -## General Public License version 3 as published by the Free Software -## Foundation and appearing in the file LICENSE.LGPL3 included in the -## packaging of this file. Please review the following information to -## ensure the GNU Lesser General Public License version 3 requirements -## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -## -## GNU General Public License Usage -## Alternatively, this file may be used under the terms of the GNU -## General Public License version 2.0 or (at your option) the GNU General -## Public license version 3 or any later version approved by the KDE Free -## Qt Foundation. The licenses are as published by the Free Software -## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -## included in the packaging of this file. Please review the following -## information to ensure the GNU General Public License requirements will -## be met: https://www.gnu.org/licenses/gpl-2.0.html and -## https://www.gnu.org/licenses/gpl-3.0.html. -## -## $QT_END_LICENSE$ -## -############################################################################# - -from __future__ import print_function, absolute_import - -import sys -import re -import warnings -import types -import keyword -import functools -from shibokensupport.signature.mapping import (type_map, update_mapping, - namespace, typing, _NotCalled, ResultVariable, ArrayLikeVariable) -from shibokensupport.signature.lib.tool import (SimpleNamespace, - build_brace_pattern) - -_DEBUG = False -LIST_KEYWORDS = False - -""" -parser.py - -This module parses the signature text and creates properties for the -signature objects. - -PySide has a new function 'CppGenerator::writeSignatureInfo()' -that extracts the gathered information about the function arguments -and defaults as good as it can. But what PySide generates is still -very C-ish and has many constants that Python doesn't understand. - -The function 'try_to_guess()' below understands a lot of PySide's -peculiar way to assume local context. If it is able to do the guess, -then the result is inserted into the dict, so the search happens -not again. For everything that is not covered by these automatic -guesses, we provide an entry in 'type_map' that resolves it. - -In effect, 'type_map' maps text to real Python objects. -""" - -def dprint(*args, **kw): - if _DEBUG: - import pprint - for arg in args: - pprint.pprint(arg) - sys.stdout.flush() - - -_cache = {} - -def _parse_arglist(argstr): - # The following is a split re. The string is broken into pieces which are - # between the recognized strings. Because the re has groups, both the - # strings and the separators are returned, where the strings are not - # interesting at all: They are just the commata. - key = "_parse_arglist" - if key not in _cache: - regex = build_brace_pattern(level=3, separators=",") - _cache[key] = re.compile(regex, flags=re.VERBOSE) - split = _cache[key].split - # Note: this list is interspersed with "," and surrounded by "" - return [x.strip() for x in split(argstr) if x.strip() not in ("", ",")] - - -def _parse_line(line): - line_re = r""" - ((?P<multi> ([0-9]+)) : )? # the optional multi-index - (?P<funcname> \w+(\.\w+)*) # the function name - \( (?P<arglist> .*?) \) # the argument list - ( -> (?P<returntype> .*) )? # the optional return type - $ - """ - ret = SimpleNamespace(**re.match(line_re, line, re.VERBOSE).groupdict()) - # PYSIDE-1095: Handle arbitrary default expressions - argstr = ret.arglist.replace("->", ".deref.") - arglist = _parse_arglist(argstr) - args = [] - for arg in arglist: - name, ann = arg.split(":") - if name in keyword.kwlist: - if LIST_KEYWORDS: - print("KEYWORD", ret) - name = name + "_" - if "=" in ann: - ann, default = ann.split("=", 1) - tup = name, ann, default - else: - tup = name, ann - args.append(tup) - ret.arglist = args - multi = ret.multi - if multi is not None: - ret.multi = int(multi) - funcname = ret.funcname - parts = funcname.split(".") - if parts[-1] in keyword.kwlist: - ret.funcname = funcname + "_" - return vars(ret) - - -def make_good_value(thing, valtype): - try: - if thing.endswith("()"): - thing = 'Default("{}")'.format(thing[:-2]) - else: - ret = eval(thing, namespace) - if valtype and repr(ret).startswith("<"): - thing = 'Instance("{}")'.format(thing) - return eval(thing, namespace) - except Exception: - pass - - -def try_to_guess(thing, valtype): - if "." not in thing and "(" not in thing: - text = "{}.{}".format(valtype, thing) - ret = make_good_value(text, valtype) - if ret is not None: - return ret - typewords = valtype.split(".") - valwords = thing.split(".") - braceless = valwords[0] # Yes, not -1. Relevant is the overlapped word. - if "(" in braceless: - braceless = braceless[:braceless.index("(")] - for idx, w in enumerate(typewords): - if w == braceless: - text = ".".join(typewords[:idx] + valwords) - ret = make_good_value(text, valtype) - if ret is not None: - return ret - return None - -def get_name(thing): - if isinstance(thing, type): - return getattr(thing, "__qualname__", thing.__name__) - else: - return thing.__name__ - -def _resolve_value(thing, valtype, line): - if thing in ("0", "None") and valtype: - if valtype.startswith("PySide2.") or valtype.startswith("typing."): - return None - map = type_map[valtype] - # typing.Any: '_SpecialForm' object has no attribute '__name__' - name = get_name(map) if hasattr(map, "__name__") else str(map) - thing = "zero({})".format(name) - if thing in type_map: - return type_map[thing] - res = make_good_value(thing, valtype) - if res is not None: - type_map[thing] = res - return res - res = try_to_guess(thing, valtype) if valtype else None - if res is not None: - type_map[thing] = res - return res - warnings.warn("""pyside_type_init: - - UNRECOGNIZED: {!r} - OFFENDING LINE: {!r} - """.format(thing, line), RuntimeWarning) - return thing - - -def _resolve_arraytype(thing, line): - search = re.search(r"\[(\d*)\]$", thing) - thing = thing[:search.start()] - if thing.endswith("]"): - thing = _resolve_arraytype(thing, line) - if search.group(1): - # concrete array, use a tuple - nelem = int(search.group(1)) - thing = ", ".join([thing] * nelem) - thing = "Tuple[" + thing + "]" - else: - thing = "QList[" + thing + "]" - return thing - - -def to_string(thing): - if isinstance(thing, str): - return thing - if hasattr(thing, "__name__"): - dot = "." in str(thing) - name = get_name(thing) - return thing.__module__ + "." + name if dot else name - # Note: This captures things from the typing module: - return str(thing) - - -matrix_pattern = "PySide2.QtGui.QGenericMatrix" - -def handle_matrix(arg): - n, m, typstr = tuple(map(lambda x:x.strip(), arg.split(","))) - assert typstr == "float" - result = "PySide2.QtGui.QMatrix{n}x{m}".format(**locals()) - return eval(result, namespace) - - -debugging_aid = """ -from inspect import currentframe - -def lno(level): - lineno = currentframe().f_back.f_lineno - spaces = level * " " - return "{lineno}{spaces}".format(**locals()) -""" - - -def _resolve_type(thing, line, level, var_handler): - # Capture total replacements, first. Happens in - # "PySide2.QtCore.QCborStreamReader.StringResult[PySide2.QtCore.QByteArray]" - if thing in type_map: - return type_map[thing] - # Now the nested structures are handled. - if "[" in thing: - # handle primitive arrays - if re.search(r"\[\d*\]$", thing): - thing = _resolve_arraytype(thing, line) - # Handle a container return type. (see PYSIDE-921 in cppgenerator.cpp) - contr, thing = re.match(r"(.*?)\[(.*?)\]$", thing).groups() - # Special case: Handle the generic matrices. - if contr == matrix_pattern: - return handle_matrix(thing) - contr = var_handler(_resolve_type(contr, line, level+1, var_handler)) - if isinstance(contr, _NotCalled): - raise SystemError("Container types must exist:", repr(contr)) - contr = to_string(contr) - pieces = [] - for part in _parse_arglist(thing): - part = var_handler(_resolve_type(part, line, level+1, var_handler)) - if isinstance(part, _NotCalled): - # fix the tag (i.e. "Missing") by repr - part = repr(part) - pieces.append(to_string(part)) - thing = ", ".join(pieces) - result = "{contr}[{thing}]".format(**locals()) - return eval(result, namespace) - return _resolve_value(thing, None, line) - - -def _handle_generic(obj, repl): - """ - Assign repl if obj is an ArrayLikeVariable - - This is a neat trick. Example: - - obj repl result - ---------------------- -------- --------- - ArrayLikeVariable List List - ArrayLikeVariable(str) List List[str] - ArrayLikeVariable Sequence Sequence - ArrayLikeVariable(str) Sequence Sequence[str] - """ - if isinstance(obj, ArrayLikeVariable): - return repl[obj.type] - if isinstance(obj, type) and issubclass(obj, ArrayLikeVariable): - # was "if obj is ArrayLikeVariable" - return repl - return obj - - -def handle_argvar(obj): - """ - Decide how array-like variables are resolved in arguments - - Currently, the best approximation is types.Sequence. - We want to change that to types.Iterable in the near future. - """ - return _handle_generic(obj, typing.Sequence) - - -def handle_retvar(obj): - """ - Decide how array-like variables are resolved in results - - This will probably stay typing.List forever. - """ - return _handle_generic(obj, typing.List) - - -def calculate_props(line): - parsed = SimpleNamespace(**_parse_line(line.strip())) - arglist = parsed.arglist - annotations = {} - _defaults = [] - for idx, tup in enumerate(arglist): - name, ann = tup[:2] - if ann == "...": - name = "*args" if name.startswith("arg_") else "*" + name - # copy the pathed fields back - ann = 'nullptr' # maps to None - tup = name, ann - arglist[idx] = tup - annotations[name] = _resolve_type(ann, line, 0, handle_argvar) - if len(tup) == 3: - default = _resolve_value(tup[2], ann, line) - _defaults.append(default) - defaults = tuple(_defaults) - returntype = parsed.returntype - if returntype is not None: - annotations["return"] = _resolve_type(returntype, line, 0, handle_retvar) - props = SimpleNamespace() - props.defaults = defaults - props.kwdefaults = {} - props.annotations = annotations - props.varnames = varnames = tuple(tup[0] for tup in arglist) - funcname = parsed.funcname - props.fullname = funcname - shortname = funcname[funcname.rindex(".")+1:] - props.name = shortname - props.multi = parsed.multi - fix_variables(props, line) - return vars(props) - - -def fix_variables(props, line): - annos = props.annotations - if not any(isinstance(ann, (ResultVariable, ArrayLikeVariable)) - for ann in annos.values()): - return - retvar = annos.get("return", None) - if retvar and isinstance(retvar, (ResultVariable, ArrayLikeVariable)): - # Special case: a ResultVariable which is the result will always be an array! - annos["return"] = retvar = typing.List[retvar.type] - fullname = props.fullname - varnames = list(props.varnames) - defaults = list(props.defaults) - diff = len(varnames) - len(defaults) - - safe_annos = annos.copy() - retvars = [retvar] if retvar else [] - deletions = [] - for idx, name in enumerate(varnames): - ann = safe_annos[name] - if isinstance(ann, ArrayLikeVariable): - ann = typing.Sequence[ann.type] - annos[name] = ann - if not isinstance(ann, ResultVariable): - continue - # We move the variable to the end and remove it. - retvars.append(ann.type) - deletions.append(idx) - del annos[name] - for idx in reversed(deletions): - # varnames: 0 1 2 3 4 5 6 7 - # defaults: 0 1 2 3 4 - # diff: 3 - del varnames[idx] - if idx >= diff: - del defaults[idx - diff] - else: - diff -= 1 - if retvars: - rvs = [] - retvars = list(handle_retvar(rv) if isinstance(rv, ArrayLikeVariable) else rv - for rv in retvars) - if len(retvars) == 1: - returntype = retvars[0] - else: - typestr = "typing.Tuple[{}]".format(", ".join(map(to_string, retvars))) - returntype = eval(typestr, namespace) - props.annotations["return"] = returntype - props.varnames = tuple(varnames) - props.defaults = tuple(defaults) - - -def fixup_multilines(lines): - """ - Multilines can collapse when certain distinctions between C++ types - vanish after mapping to Python. - This function fixes this by re-computing multiline-ness. - """ - res = [] - multi_lines = [] - for line in lines: - multi = re.match(r"([0-9]+):", line) - if multi: - idx, rest = int(multi.group(1)), line[multi.end():] - multi_lines.append(rest) - if idx > 0: - continue - # remove duplicates - multi_lines = sorted(set(multi_lines)) - # renumber or return a single line - nmulti = len(multi_lines) - if nmulti > 1: - for idx, line in enumerate(multi_lines): - res.append("{}:{}".format(nmulti-idx-1, line)) - else: - res.append(multi_lines[0]) - multi_lines = [] - else: - res.append(line) - return res - - -def pyside_type_init(type_key, sig_strings): - dprint() - dprint("Initialization of type key '{}'".format(type_key)) - update_mapping() - lines = fixup_multilines(sig_strings) - ret = {} - multi_props = [] - for line in lines: - props = calculate_props(line) - shortname = props["name"] - multi = props["multi"] - if multi is None: - ret[shortname] = props - dprint(props) - else: - multi_props.append(props) - if multi > 0: - continue - fullname = props.pop("fullname") - multi_props = {"multi": multi_props, "fullname": fullname} - ret[shortname] = multi_props - dprint(multi_props) - multi_props = [] - return ret - -# end of file diff --git a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/qt_attribution.json b/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/qt_attribution.json deleted file mode 100644 index fbe4c51ab..000000000 --- a/sources/shiboken2/shibokenmodule/files.dir/shibokensupport/signature/qt_attribution.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "Id": "python", - "Name": "Python", - "QDocModule": "QtForPython", - "QtUsage": "Used for Qt for Python in the signature extension.", - "Description": "Qt for Python is an add-on for Python. The signature packages of PySide uses certain copied and adapted source files (backport_inspect.py, typing27.py). See the folder sources/shiboken2/files.dir/shibokensupport/signature .", - "Homepage": "http://www.python.org/", - "Version": "3.7.0", - "LicenseId": "Python-2.0", - "License": "Python License 2.0", - "LicenseFile": "PSF-3.7.0.txt", - "Copyright": "© Copyright 2001-2018, Python Software Foundation." -} |