================================================================================
Alternation
================================================================================

[
  (binary_expression (string_literal))
  _
  (binary_expression (string_literal) (number_literal))
]

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (alternation
      (choice
        pattern: (named_node
          (node_name)
          (child
            pattern: (named_node
              (node_name)))))
      (choice
        pattern: (wildcard_node))
      (choice
        pattern: (named_node
          (node_name)
          (child
            pattern: (named_node
              (node_name)))
          (child
            pattern: (named_node
              (node_name))))))))

================================================================================
Alternation keywords
================================================================================

[
  "break"
  "catch"
  "delete"
  "else"
  "for"
  "function"
  "if"
  "return"
  "try"
  "while"
] @keyword

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (alternation
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf))
      (choice
        pattern: (anonymous_leaf)))
    (capture)))

================================================================================
Alternation call expression
================================================================================

(call_expression
  function: [
    (identifier) @function
    (member_expression
      property: (property_identifier) @method)
  ])

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        (field_name)
        pattern: (alternation
          (choice
            pattern: (named_node
              (node_name))
            (capture))
          (choice
            pattern: (named_node
              (node_name)
              (child
                (field_name)
                pattern: (named_node
                  (node_name))
                (capture)))))))))

================================================================================
Anchor: start
================================================================================

(array . (identifier) @the-element)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (anchor)
      (child
        pattern: (named_node
          (node_name))
        (capture)))))

================================================================================
Anchor: end
================================================================================

(block (_) @last-expression .)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (wildcard_node)
        (capture))
      (anchor))))

================================================================================
Anchor: middle
================================================================================

(dotted_name
  (identifier) @prev-id
  .
  (identifier) @next-id)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name))
        (capture))
      (anchor)
      (child
        pattern: (named_node
          (node_name))
        (capture)))))

================================================================================
Anonymous leaf
================================================================================

"test"

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (anonymous_leaf)))

================================================================================
Escape sequence in anonymous leaf
================================================================================

"hello\nworld\rhow\tare\0you\\"

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (anonymous_leaf
      (escape_sequence)
      (escape_sequence)
      (escape_sequence)
      (escape_sequence)
      (escape_sequence))))

================================================================================
Group
================================================================================

(
  (comment)
  (function_declaration)
)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (group
      (pattern
        pattern: (named_node
          (node_name)))
      (pattern
        pattern: (named_node
          (node_name))))))

================================================================================
Group with quantifier
================================================================================

(
  (number)
  ("," (number))*
)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (group
      (pattern
        pattern: (named_node
          (node_name)))
      (pattern
        pattern: (group
          (pattern
            pattern: (anonymous_leaf))
          (pattern
            pattern: (named_node
              (node_name))))
        quantifier: (zero_or_more)))))

================================================================================
Named node with no children
================================================================================

(binary_expression)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name))))

================================================================================
Captured named node with no children
================================================================================

(binary_expression) @result

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name))
    (capture)))

================================================================================
Named node with one child
================================================================================

(binary_expression (string_literal))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name))))))

================================================================================
Named node with two children
================================================================================

(binary_expression (string_literal) (number_literal))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name)))
      (child
        pattern: (named_node
          (node_name))))))

================================================================================
Captured named node with two children
================================================================================

(binary_expression (string_literal) @str (number_literal) @num) @bin

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name))
        (capture))
      (child
        pattern: (named_node
          (node_name))
        (capture)))
    (capture)))

================================================================================
Named node with one field
================================================================================

(binary_expression field: (string_literal))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        (field_name)
        pattern: (named_node
          (node_name))))))

================================================================================
Named node with two fields
================================================================================

(binary_expression field: (string_literal) another: (number_literal))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        (field_name)
        pattern: (named_node
          (node_name)))
      (child
        (field_name)
        pattern: (named_node
          (node_name))))))

================================================================================
Named node with leading underscore
================================================================================

(_binary_expression)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name))))

================================================================================
Negated fields
================================================================================

(assignment_expression !left)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (negated_child
        (field_name)))))

================================================================================
Negated and non-negated fields
================================================================================

(assignment_expression
  !left
  right: (identifier)
  !center
  "bottom")

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (negated_child
        (field_name))
      (child
        (field_name)
        pattern: (named_node
          (node_name)))
      (negated_child
        (field_name))
      (child
        pattern: (anonymous_leaf)))))

================================================================================
Nested fields
================================================================================

(assignment_expression
  left: (member_expression
    object: (call_expression)))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        (field_name)
        pattern: (named_node
          (node_name)
          (child
            (field_name)
            pattern: (named_node
              (node_name))))))))

================================================================================
Predicate: eq
================================================================================

(
  (pair
    key: (property_identifier) @key-name
    value: (identifier) @value-name)
  (#eq? @key-name @value-name)
)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (group
      (pattern
        pattern: (named_node
          (node_name)
          (child
            (field_name)
            pattern: (named_node
              (node_name))
            (capture))
          (child
            (field_name)
            pattern: (named_node
              (node_name))
            (capture))))
      (predicate
        (predicate_name)
        (capture)
        (capture)))))

================================================================================
Predicate: match
================================================================================

(
  (identifier) @constant
  (#match? @constant "^[A-Z][A-Z_]+")
)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (group
      (pattern
        pattern: (named_node
          (node_name))
        (capture))
      (predicate
        (predicate_name)
        (capture)
        (string)))))

================================================================================
Quantifier: One or more
================================================================================

(comment)+

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name))
    quantifier: (one_or_more)))

================================================================================
Quantifier: Zero or one
================================================================================

(call_expression
  function: (identifier) @the-function
  arguments: (arguments (string)? @the-string-arg))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        (field_name)
        pattern: (named_node
          (node_name))
        (capture))
      (child
        (field_name)
        pattern: (named_node
          (node_name)
          (child
            pattern: (named_node
              (node_name))
            quantifier: (zero_or_one)
            (capture)))))))

================================================================================
Quantifier: Zero or more
================================================================================

(class_declaration
  (decorator)* @the-decorator
  name: (identifier) @the-name)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name))
        quantifier: (zero_or_more)
        (capture))
      (child
        (field_name)
        pattern: (named_node
          (node_name))
        (capture)))))

================================================================================
Wildcard node
================================================================================

(_)

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (wildcard_node)))

================================================================================
Multiple patterns
================================================================================

(binary_expression (string_literal))
_
(binary_expression (string_literal) (number_literal))

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name)))))
  (pattern
    pattern: (wildcard_node))
  (pattern
    pattern: (named_node
      (node_name)
      (child
        pattern: (named_node
          (node_name)))
      (child
        pattern: (named_node
          (node_name))))))

================================================================================
Comments
================================================================================

; comment
(binary_expression
; comment
  field: (string_literal) ; comment
  another: (number_literal))

--------------------------------------------------------------------------------

(query
  (comment)
  (pattern
    pattern: (named_node
      (node_name)
      (comment)
      (child
        (field_name)
        pattern: (named_node
          (node_name)))
      (comment)
      (child
        (field_name)
        pattern: (named_node
          (node_name))))))

================================================================================
String escapes
================================================================================

["\"" (attribute_name)] @string

--------------------------------------------------------------------------------

(query
  (pattern
    pattern: (alternation
      (choice
        pattern: (anonymous_leaf
          (escape_sequence)))
      (choice
        pattern: (named_node
          (node_name))))
    (capture)))
