python (3.12.0)
1 """
2 Optional fixer to transform set() calls to set literals.
3 """
4
5 # Author: Benjamin Peterson
6
7 from lib2to3 import fixer_base, pytree
8 from lib2to3.fixer_util import token, syms
9
10
11
12 class ESC[4;38;5;81mFixSetLiteral(ESC[4;38;5;149mfixer_baseESC[4;38;5;149m.ESC[4;38;5;149mBaseFix):
13
14 BM_compatible = True
15 explicit = True
16
17 PATTERN = """power< 'set' trailer< '('
18 (atom=atom< '[' (items=listmaker< any ((',' any)* [',']) >
19 |
20 single=any) ']' >
21 |
22 atom< '(' items=testlist_gexp< any ((',' any)* [',']) > ')' >
23 )
24 ')' > >
25 """
26
27 def transform(self, node, results):
28 single = results.get("single")
29 if single:
30 # Make a fake listmaker
31 fake = pytree.Node(syms.listmaker, [single.clone()])
32 single.replace(fake)
33 items = fake
34 else:
35 items = results["items"]
36
37 # Build the contents of the literal
38 literal = [pytree.Leaf(token.LBRACE, "{")]
39 literal.extend(n.clone() for n in items.children)
40 literal.append(pytree.Leaf(token.RBRACE, "}"))
41 # Set the prefix of the right brace to that of the ')' or ']'
42 literal[-1].prefix = items.next_sibling.prefix
43 maker = pytree.Node(syms.dictsetmaker, literal)
44 maker.prefix = node.prefix
45
46 # If the original was a one tuple, we need to remove the extra comma.
47 if len(maker.children) == 4:
48 n = maker.children[2]
49 n.remove()
50 maker.children[-1].prefix = n.prefix
51
52 # Finally, replace the set call with our shiny new literal.
53 return maker