diff options
author | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-06 17:13:09 +0300 |
---|---|---|
committer | Claudiu Popa <pcmanticore@gmail.com> | 2015-10-06 17:13:09 +0300 |
commit | e5df09d8d51250bfb277d18fc6a299c1997100ee (patch) | |
tree | e5ea39a520b349604ac3460b7b7e3b02e003bda5 | |
parent | e70c0c0f55e1acc3da066920c233c13ad0b28fb5 (diff) | |
download | astroid-e5df09d8d51250bfb277d18fc6a299c1997100ee.tar.gz |
Add brain tips for PyQt signals for supporting emit / connect and disconnect methods on them
-rw-r--r-- | astroid/brain/py2qt4.py | 22 | ||||
-rw-r--r-- | astroid/brain/pyqt.py | 44 | ||||
-rw-r--r-- | astroid/raw_building.py | 13 |
3 files changed, 57 insertions, 22 deletions
diff --git a/astroid/brain/py2qt4.py b/astroid/brain/py2qt4.py deleted file mode 100644 index d557809..0000000 --- a/astroid/brain/py2qt4.py +++ /dev/null @@ -1,22 +0,0 @@ -"""Astroid hooks for the Python 2 qt4 module. - -Currently help understanding of : - -* PyQT4.QtCore -""" - -from astroid import MANAGER, register_module_extender -from astroid.builder import AstroidBuilder - - -def pyqt4_qtcore_transform(): - return AstroidBuilder(MANAGER).string_build(''' - -def SIGNAL(signal_name): pass - -class QObject(object): - def emit(self, signal): pass -''') - - -register_module_extender(MANAGER, 'PyQt4.QtCore', pyqt4_qtcore_transform) diff --git a/astroid/brain/pyqt.py b/astroid/brain/pyqt.py new file mode 100644 index 0000000..f568b65 --- /dev/null +++ b/astroid/brain/pyqt.py @@ -0,0 +1,44 @@ +"""Astroid hooks for the PyQT library.""" + +from astroid import MANAGER, register_module_extender +from astroid.builder import AstroidBuilder +from astroid import nodes +from astroid import parse + + +def _looks_like_signal(node, signal_name='pyqtSignal'): + if '__class__' in node.instance_attrs: + cls = node.instance_attrs['__class__'][0] + return cls.name == signal_name + return False + + +def transform_pyqt_signal(node): + module = parse(''' + class pyqtSignal(object): + def connect(self, slot, type=None, no_receiver_check=False): + pass + def disconnect(self, slot): + pass + def emit(self, *args): + pass + ''') + signal_cls = module['pyqtSignal'] + node.instance_attrs['emit'] = signal_cls['emit'] + node.instance_attrs['disconnect'] = signal_cls['disconnect'] + node.instance_attrs['connect'] = signal_cls['connect'] + + +def pyqt4_qtcore_transform(): + return AstroidBuilder(MANAGER).string_build(''' + +def SIGNAL(signal_name): pass + +class QObject(object): + def emit(self, signal): pass +''') + + +register_module_extender(MANAGER, 'PyQt4.QtCore', pyqt4_qtcore_transform) +MANAGER.register_transform(nodes.FunctionDef, transform_pyqt_signal, + _looks_like_signal)
\ No newline at end of file diff --git a/astroid/raw_building.py b/astroid/raw_building.py index aa07791..ee5c31e 100644 --- a/astroid/raw_building.py +++ b/astroid/raw_building.py @@ -53,6 +53,18 @@ def _attach_local_node(parent, node, name): node.name = name # needed by add_local_node parent.add_local_node(node) + +def _add_dunder_class(func, member): + """Add a __class__ member to the given func node, if we can determine it.""" + python_cls = member.__class__ + cls_name = getattr(python_cls, '__name__', None) + if not cls_name: + return + bases = [ancestor.__name__ for ancestor in python_cls.__bases__] + ast_klass = build_class(cls_name, bases, python_cls.__doc__) + func.instance_attrs['__class__'] = [ast_klass] + + _marker = object() @@ -183,6 +195,7 @@ def object_build_methoddescriptor(node, member, localname): # and empty argument list func.args.args = None node.add_local_node(func, localname) + _add_dunder_class(func, member) def _base_class_object_build(node, member, basenames, name=None, localname=None): |