mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-14 00:07:35 -04:00
add 2to3 script to migrate (some) PyQt signal/slots to new style
This commit is contained in:
parent
d11c689eea
commit
7128a353a2
0
scripts/qgis_fixes/__init__.py
Normal file
0
scripts/qgis_fixes/__init__.py
Normal file
@ -297,6 +297,8 @@ MAPPING = {
|
||||
"QPoint",
|
||||
"QPointF",
|
||||
"QDirIterator",
|
||||
]),
|
||||
(None, [
|
||||
"SIGNAL",
|
||||
"SLOT",
|
||||
]),
|
||||
@ -397,19 +399,21 @@ class FixPyqt(FixImports):
|
||||
pref = mod_member.prefix
|
||||
member = results.get("member")
|
||||
|
||||
missing = False
|
||||
|
||||
# Simple case with only a single member being imported
|
||||
if member:
|
||||
# this may be a list of length one, or just a node
|
||||
if isinstance(member, list):
|
||||
member = member[0]
|
||||
new_name = None
|
||||
new_name = ''
|
||||
for change in MAPPING[mod_member.value]:
|
||||
if member.value in change[1]:
|
||||
new_name = change[0]
|
||||
break
|
||||
if new_name:
|
||||
mod_member.replace(Name(new_name, prefix=pref))
|
||||
else:
|
||||
elif new_name == '':
|
||||
self.cannot_convert(node, "This is an invalid module element")
|
||||
|
||||
# Multiple members being imported
|
||||
@ -430,14 +434,16 @@ class FixPyqt(FixImports):
|
||||
found = False
|
||||
for change in MAPPING[mod_member.value]:
|
||||
if member_name in change[1]:
|
||||
if change[0] not in mod_dict:
|
||||
modules.append(change[0])
|
||||
mod_dict.setdefault(change[0], []).append(member)
|
||||
if change[0] is not None:
|
||||
if change[0] not in mod_dict:
|
||||
modules.append(change[0])
|
||||
mod_dict.setdefault(change[0], []).append(member)
|
||||
found = True
|
||||
if not found:
|
||||
f = open("/tmp/missing", "a+")
|
||||
f.write("member %s of %s not found\n" % (member_name, mod_member.value))
|
||||
f.close()
|
||||
missing = True
|
||||
|
||||
new_nodes = []
|
||||
indentation = find_indentation(node)
|
||||
@ -450,6 +456,7 @@ class FixPyqt(FixImports):
|
||||
name.children[2].clone()]
|
||||
return [Node(syms.import_as_name, kids)]
|
||||
return [Name(name.value, prefix=prefix)]
|
||||
|
||||
for module in modules:
|
||||
elts = mod_dict[module]
|
||||
names = []
|
||||
@ -462,13 +469,18 @@ class FixPyqt(FixImports):
|
||||
new.prefix = indentation
|
||||
new_nodes.append(new)
|
||||
first = False
|
||||
|
||||
if new_nodes:
|
||||
nodes = []
|
||||
for new_node in new_nodes[:-1]:
|
||||
nodes.extend([new_node, Newline()])
|
||||
nodes.append(new_nodes[-1])
|
||||
|
||||
if node.prefix:
|
||||
nodes[0].prefix = node.prefix
|
||||
|
||||
node.replace(nodes)
|
||||
else:
|
||||
elif missing:
|
||||
self.cannot_convert(node, "All module elements are invalid")
|
||||
|
||||
def transform_dot(self, node, results):
|
||||
|
73
scripts/qgis_fixes/fix_signals.py
Normal file
73
scripts/qgis_fixes/fix_signals.py
Normal file
@ -0,0 +1,73 @@
|
||||
"""Migrate signals from old style to new style
|
||||
"""
|
||||
# Author: Juergen E. Fischer
|
||||
|
||||
# .connect( sender, signal, receiver, slot )
|
||||
|
||||
# Local imports
|
||||
from lib2to3 import fixer_base, pytree
|
||||
from lib2to3.fixer_util import Call, Name, Attr, ArgList, Node, syms
|
||||
|
||||
import re
|
||||
|
||||
|
||||
class FixSignals(fixer_base.BaseFix):
|
||||
PATTERN = """
|
||||
(
|
||||
power<
|
||||
any trailer< '.' method=('connect'|'disconnect') >
|
||||
trailer<
|
||||
'('
|
||||
arglist<
|
||||
sender=any ','
|
||||
power< 'SIGNAL' trailer< '(' signal=any ')' > > ','
|
||||
slot=any
|
||||
>
|
||||
')'
|
||||
>
|
||||
>
|
||||
|
|
||||
power<
|
||||
emitter=any trailer< '.' 'emit' >
|
||||
trailer<
|
||||
'('
|
||||
args=arglist<
|
||||
power< 'SIGNAL' trailer< '(' signal=any ')' > >
|
||||
( ',' any )*
|
||||
>
|
||||
')'
|
||||
>
|
||||
>
|
||||
)
|
||||
"""
|
||||
|
||||
# def match(self, node):
|
||||
# res = super(FixSignals, self).match( node )
|
||||
# r = repr(node)
|
||||
# if "emit" in r:
|
||||
# print "yes" if res else "no", ": ", r
|
||||
# return res
|
||||
|
||||
def transform(self, node, results):
|
||||
signal = results.get("signal").value
|
||||
signal = re.sub('^["\']([^(]+)(?:\(.*\))?["\']$', '\\1', signal)
|
||||
|
||||
if 'emitter' in results:
|
||||
emitter = results.get("emitter").clone()
|
||||
emitter.prefix = node.prefix
|
||||
args = results.get("args").clone()
|
||||
args.children = args.children[2:]
|
||||
if args.children:
|
||||
args.children[0].prefix = ''
|
||||
res = Node(syms.power, [emitter, Name('.'), Name(signal), Name('.'), Name('emit')] + [ArgList([args])])
|
||||
else:
|
||||
sender = results.get("sender").clone()
|
||||
method = results.get("method")
|
||||
if isinstance(method, list):
|
||||
method = method[0]
|
||||
method = method.clone()
|
||||
sender.prefix = node.prefix
|
||||
slot = results.get("slot").clone()
|
||||
slot.prefix = ""
|
||||
res = Node(syms.power, [sender, Name('.'), Name(signal), Name('.'), method] + [ArgList([slot])])
|
||||
return res
|
Loading…
x
Reference in New Issue
Block a user