; Rust mod test
((attribute_item
  (attribute
    (identifier) @_attribute
    arguments: ((token_tree
      (identifier) @_test)
      (#eq? @_test "test")))
  (#eq? @_attribute "cfg"))
  .
  (mod_item
    name: (_) @run)
  (#set! tag rust-mod-test))

; Rust test
(((attribute_item
  (attribute
    [
      (identifier) @_attribute
      (scoped_identifier
        (identifier) @_attribute)
    ])
  (#match? @_attribute "test")) @_start
  .
  (attribute_item)*
  .
  [
    (line_comment)
    (block_comment)
  ]*
  .
  (function_item
    name: (_) @run @_test_name
    body: _) @_end)
  (#set! tag rust-test))

; Rust doc test
(((line_comment)*
  (line_comment
    doc: (_) @_comment_content) @_start @run
  (#match? @_comment_content "```")
  .
  (line_comment)*
  .
  (line_comment
    doc: (_) @_end_comment_content) @_end_code_block
  (#match? @_end_comment_content "```")
  .
  (line_comment)*
  (attribute_item)*
  .
  [
    (function_item
      name: (_) @_doc_test_name
      body: _)
    (function_signature_item
      name: (_) @_doc_test_name)
    (struct_item
      name: (_) @_doc_test_name)
    (enum_item
      name: (_) @_doc_test_name
      body: _)
    ((attribute_item)?
      (macro_definition
        name: (_) @_doc_test_name))
    (mod_item
      name: (_) @_doc_test_name)
  ] @_end)
  (#set! tag rust-doc-test))

; Rust main function
(((function_item
  name: (_) @run
  body: _) @_rust_main_function_end
  (#eq? @run "main"))
  (#set! tag rust-main))
