;; Scryer Stack Graphs Rules for Rust
;; Defines name-binding graph construction for Rust declarations, references, and scopes.
global ROOT_NODE
global JUMP_TO_SCOPE_NODE
;; =============================================================================
;; Declarations (Definitions)
;; =============================================================================
;; Functions
(function_item name: (identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "function", source_node = @name
edge ROOT_NODE -> def
}
;; Structs
(struct_item name: (type_identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "struct", source_node = @name
edge ROOT_NODE -> def
}
;; Enums
(enum_item name: (type_identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "enum", source_node = @name
edge ROOT_NODE -> def
}
;; Traits
(trait_item name: (type_identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "trait", source_node = @name
edge ROOT_NODE -> def
}
;; Modules
(mod_item name: (identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "module", source_node = @name
edge ROOT_NODE -> def
}
;; Type Aliases
(type_item name: (type_identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "type", source_node = @name
edge ROOT_NODE -> def
}
;; Constants
(const_item name: (identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "const", source_node = @name
edge ROOT_NODE -> def
}
;; Statics
(static_item name: (identifier) @name) {
node def
attr (def) type = "pop_symbol", symbol = (source-text @name), is_definition, syntax_type = "static", source_node = @name
edge ROOT_NODE -> def
}
;; =============================================================================
;; References
;; =============================================================================
;; Function calls: direct call f()
(call_expression function: (identifier) @name) {
node ref
attr (ref) type = "push_symbol", symbol = (source-text @name), is_reference, source_node = @name
edge ref -> ROOT_NODE
}
;; Scoped function calls: mod::f()
(call_expression function: (scoped_identifier path: (identifier) @mod_name name: (identifier) @name)) {
node ref_mod
node ref_fn
attr (ref_mod) type = "push_symbol", symbol = (source-text @mod_name), is_reference, source_node = @mod_name
attr (ref_fn) type = "push_symbol", symbol = (source-text @name), is_reference, source_node = @name
edge ref_fn -> ref_mod
edge ref_mod -> ROOT_NODE
}
;; Type reference in field declaration
(field_declaration type: (type_identifier) @name) {
node ref
attr (ref) type = "push_symbol", symbol = (source-text @name), is_reference, source_node = @name
edge ref -> ROOT_NODE
}
;; Type reference in parameter
(parameter type: (type_identifier) @name) {
node ref
attr (ref) type = "push_symbol", symbol = (source-text @name), is_reference, source_node = @name
edge ref -> ROOT_NODE
}
;; Type reference in return type
(function_item return_type: (type_identifier) @name) {
node ref
attr (ref) type = "push_symbol", symbol = (source-text @name), is_reference, source_node = @name
edge ref -> ROOT_NODE
}