diff --git a/gitnexus/src/core/ingestion/languages/python/query.ts b/gitnexus/src/core/ingestion/languages/python/query.ts index 4732340cc..87f2eee39 100644 --- a/gitnexus/src/core/ingestion/languages/python/query.ts +++ b/gitnexus/src/core/ingestion/languages/python/query.ts @@ -119,6 +119,31 @@ export const PYTHON_SCOPE_QUERY = ` right: (call function: (identifier) @type-binding.type)) @type-binding.alias +;; for (i, u) in enumerate(X) — paren-tuple, bind last element to X's +;; element type. \`enumerate(X)\` yields (int, X-element); the second +;; pattern var takes X (which the chain-follow then unwraps to its +;; element type via generic-strip in interpret.ts). +(for_statement + left: (tuple_pattern + (identifier) + (identifier) @type-binding.name) + right: (call + function: (identifier) @_enum + arguments: (argument_list + (identifier) @type-binding.type)) + (#eq? @_enum "enumerate")) @type-binding.alias + +;; for i, u in enumerate(X) — pattern_list (no parens) variant. +(for_statement + left: (pattern_list + (identifier) + (identifier) @type-binding.name) + right: (call + function: (identifier) @_enum + arguments: (argument_list + (identifier) @type-binding.type)) + (#eq? @_enum "enumerate")) @type-binding.alias + ;; Type bindings (variable annotations: \`u: User\` / \`u: User = x\`) (assignment left: (identifier) @type-binding.name diff --git a/gitnexus/src/core/ingestion/languages/python/scopes.scm b/gitnexus/src/core/ingestion/languages/python/scopes.scm index 69ca6c59c..944cab3d6 100644 --- a/gitnexus/src/core/ingestion/languages/python/scopes.scm +++ b/gitnexus/src/core/ingestion/languages/python/scopes.scm @@ -134,6 +134,30 @@ right: (call function: (identifier) @type-binding.type)) @type-binding.alias +; for (i, u) in enumerate(X) and for i, u in enumerate(X) — bind the +; second tuple element to X. enumerate yields (int, X-element); the +; chain-follow unwraps X via generic-strip when X is an annotated +; collection. +(for_statement + left: (tuple_pattern + (identifier) + (identifier) @type-binding.name) + right: (call + function: (identifier) @_enum + arguments: (argument_list + (identifier) @type-binding.type)) + (#eq? @_enum "enumerate")) @type-binding.alias + +(for_statement + left: (pattern_list + (identifier) + (identifier) @type-binding.name) + right: (call + function: (identifier) @_enum + arguments: (argument_list + (identifier) @type-binding.type)) + (#eq? @_enum "enumerate")) @type-binding.alias + ; ─── Type bindings: function return-type annotations ───────────────────── ; ; `def get_user() -> User:` — binds the function's NAME to its return