(comment)+ @comment.around

(function_declaration
  body: (_
    "{"
    (_)* @function.inside
    "}")) @function.around

(method_definition
  body: (_
    "{"
    (_)* @function.inside
    "}")) @function.around

(function_expression
  body: (_
    "{"
    (_)* @function.inside
    "}")) @function.around

((arrow_function
  body: (statement_block
    "{"
    (_)* @function.inside
    "}")) @function.around
  (#not-has-parent? @function.around variable_declarator))

; Arrow function in variable declaration - capture the full declaration
([
  (lexical_declaration
    (variable_declarator
      value: (arrow_function
        body: (statement_block
          "{"
          (_)* @function.inside
          "}"))))
  (variable_declaration
    (variable_declarator
      value: (arrow_function
        body: (statement_block
          "{"
          (_)* @function.inside
          "}"))))
]) @function.around

; Arrow function in variable declaration (captures body for expression-bodied arrows)
([
  (lexical_declaration
    (variable_declarator
      value: (arrow_function
        body: (_) @function.inside)))
  (variable_declaration
    (variable_declarator
      value: (arrow_function
        body: (_) @function.inside)))
]) @function.around

; Catch-all for arrow functions in other contexts (callbacks, etc.)
((arrow_function
  body: (_) @function.inside) @function.around
  (#not-has-parent? @function.around variable_declarator))

(generator_function
  body: (_
    "{"
    (_)* @function.inside
    "}")) @function.around

(generator_function_declaration
  body: (_
    "{"
    (_)* @function.inside
    "}")) @function.around

(class_declaration
  body: (_
    "{"
    [
      (_)
      ";"?
    ]* @class.inside
    "}")) @class.around

(class
  body: (_
    "{"
    [
      (_)
      ";"?
    ]* @class.inside
    "}")) @class.around
