@@ -219,6 +219,7 @@ def create_sha256_fingerprint(text):
219219
220220class LanguageQuery (ABC ):
221221 language_name : str = ""
222+ constants_query : str = ""
222223 functions_query : str = ""
223224 classes_query : str = ""
224225 calls_query : str = ""
@@ -233,7 +234,7 @@ def __init__(self):
233234 self .ts_language = load_language (self .language_name )
234235 self ._compiled_queries = {}
235236
236- for kind in ("functions" , "classes" , "calls" , "imports" ):
237+ for kind in ("constants" , " functions" , "classes" , "calls" , "imports" ):
237238 source = getattr (self , f"{ kind } _query" , "" ).strip ()
238239 self ._compiled_queries [kind ] = (
239240 Query (self .ts_language , source ) if source else None
@@ -319,9 +320,30 @@ def get_imports(self, root_node):
319320
320321 yield module_name , pairs
321322
323+ def get_constants (self , root_node ):
324+ """Yield raw (constant_node, name)."""
325+ for _ , captures in self .run_query ("constants" , root_node ):
326+ def_nodes = captures .get ("constant" )
327+ if not def_nodes :
328+ continue
329+ name_nodes = captures .get ("name" )
330+ name = (
331+ name_nodes [0 ].text .decode ("utf-8" , errors = "replace" )
332+ if name_nodes
333+ else None
334+ )
335+ yield def_nodes [0 ], name
336+
322337
323338class PythonTreeSitterQuery (LanguageQuery ):
324339 language_name = "Python"
340+ constants_query = """
341+ (assignment
342+ left: (identifier) @name) @constant
343+
344+ (assignment
345+ left: (pattern_list (identifier) @name)) @constant
346+ """
325347 functions_query = "(function_definition name: (identifier) @name) @function"
326348 classes_query = "(class_definition name: (identifier) @name) @class"
327349 calls_query = """
@@ -334,15 +356,13 @@ class PythonTreeSitterQuery(LanguageQuery):
334356 (import_statement name: (aliased_import
335357 name: (dotted_name) @import_name
336358 alias: (identifier) @alias))
337-
338359 (import_from_statement
339360 module_name: [(dotted_name) (relative_import)] @module_name
340361 name: [
341362 (dotted_name) @import_name
342363 (aliased_import name: (dotted_name) @import_name
343364 alias: (identifier) @alias)
344365 ])
345-
346366 (import_from_statement
347367 module_name: [(dotted_name) (relative_import)] @module_name
348368 (wildcard_import) @import_name)
@@ -387,6 +407,9 @@ def extract_definitions_index(self):
387407 for node , name in self .lang_query .get_classes (self .root_node ):
388408 index [node .id ] = {"node" : node , "name" : name , "kind" : "classes" }
389409
410+ for node , name in self .lang_query .get_constants (self .root_node ):
411+ index [node .id ] = {"node" : node , "name" : name , "kind" : "constants" }
412+
390413 for def_info in index .values ():
391414 def_info ["qualified_name" ] = self ._build_qualified_name (
392415 def_info ["node" ], index
0 commit comments