summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2015-10-06 17:13:09 +0300
committerClaudiu Popa <pcmanticore@gmail.com>2015-10-06 17:13:09 +0300
commite5df09d8d51250bfb277d18fc6a299c1997100ee (patch)
treee5ea39a520b349604ac3460b7b7e3b02e003bda5
parente70c0c0f55e1acc3da066920c233c13ad0b28fb5 (diff)
downloadastroid-e5df09d8d51250bfb277d18fc6a299c1997100ee.tar.gz
Add brain tips for PyQt signals for supporting emit / connect and disconnect methods on them
-rw-r--r--astroid/brain/py2qt4.py22
-rw-r--r--astroid/brain/pyqt.py44
-rw-r--r--astroid/raw_building.py13
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):