/ queries / python / destructures.scm
destructures.scm
 1  ;; ═════════════════════════════════════════════════════════════════════════
 2  ;; Python Destructuring Pattern Queries (from env aliases)
 3  ;; ═════════════════════════════════════════════════════════════════════════
 4  ;; These patterns capture destructuring from arbitrary identifiers,
 5  ;; allowing tracking like: env = os.environ; val = env['KEY']
 6  ;;
 7  ;; Note: Direct destructuring from os.environ is handled in bindings.scm
 8  
 9  ;; ───────────────────────────────────────────────────────────────────────────
10  ;; val = identifier['KEY'] (subscript access from alias)
11  ;; e.g., val = env['DATABASE_URL'] where env is an alias to os.environ
12  ;; ───────────────────────────────────────────────────────────────────────────
13  (assignment
14    left: (identifier) @destructure_target
15    right: (subscript
16      value: (identifier) @destructure_source
17      subscript: (string
18        (string_content) @destructure_key))) @destructure
19  
20  ;; ───────────────────────────────────────────────────────────────────────────
21  ;; val = identifier.get('KEY') (method call from alias)
22  ;; e.g., val = env.get('DATABASE_URL') where env is an alias
23  ;; ───────────────────────────────────────────────────────────────────────────
24  (assignment
25    left: (identifier) @destructure_target
26    right: (call
27      function: (attribute
28        object: (identifier) @destructure_source
29        attribute: (identifier) @_method)
30      arguments: (argument_list
31        (string
32          (string_content) @destructure_key)
33        (_)?))
34    (#any-of? @_method "get" "pop" "setdefault")) @destructure
35  
36  ;; ───────────────────────────────────────────────────────────────────────────
37  ;; Tuple unpacking: db, api = env['DB'], env['API']
38  ;; ───────────────────────────────────────────────────────────────────────────
39  (assignment
40    left: (pattern_list
41      (identifier) @destructure_target)
42    right: (expression_list
43      (subscript
44        value: (identifier) @destructure_source
45        subscript: (string
46          (string_content) @destructure_key)))) @destructure
47  
48  ;; ───────────────────────────────────────────────────────────────────────────
49  ;; Walrus operator: (val := identifier['KEY'])
50  ;; e.g., if (db := env['DATABASE_URL']): ...
51  ;; ───────────────────────────────────────────────────────────────────────────
52  (named_expression
53    name: (identifier) @destructure_target
54    value: (subscript
55      value: (identifier) @destructure_source
56      subscript: (string
57        (string_content) @destructure_key))) @destructure
58  
59  ;; ───────────────────────────────────────────────────────────────────────────
60  ;; Walrus operator with get: (val := identifier.get('KEY'))
61  ;; e.g., if (db := env.get('DATABASE_URL')): ...
62  ;; ───────────────────────────────────────────────────────────────────────────
63  (named_expression
64    name: (identifier) @destructure_target
65    value: (call
66      function: (attribute
67        object: (identifier) @destructure_source
68        attribute: (identifier) @_method)
69      arguments: (argument_list
70        (string
71          (string_content) @destructure_key)
72        (_)?))
73    (#any-of? @_method "get" "pop" "setdefault")) @destructure