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