================================================================================
Ellipsis
================================================================================

...

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

(program
  (semgrep_ellipsis_followed_by_newline))

================================================================================
Top level statements
================================================================================

foo()
...
bar()

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

(program
  (call
    (identifier)
    (argument_list))
  (semgrep_ellipsis_followed_by_newline)
  (call
    (identifier)
    (argument_list)))

================================================================================
Top level statements on the same line
================================================================================

foo() ... bar()

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

(program
  (range
    (call
      (identifier)
      (argument_list))
    (call
      (identifier)
      (argument_list))))

================================================================================
Range
================================================================================

1 ... 2

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

(program
  (range
    (integer)
    (integer)))

================================================================================
Range with ids
================================================================================

x ... y

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

(program
  (range
    (identifier)
    (identifier)))

================================================================================
One-sided range with id
================================================================================

x ...

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_followed_by_newline))))

================================================================================
One-sided range in a call
================================================================================

foo(x ...)

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

(program
  (call
    (identifier)
    (argument_list
      (range
        (identifier)))))

================================================================================
Range with no spaces
================================================================================

1...2

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

(program
  (range
    (integer)
    (integer)))

================================================================================
Range in a confined area
================================================================================

x = foo(1...2)

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

(program
  (assignment
    (identifier)
    (call
      (identifier)
      (argument_list
        (range
          (integer)
          (integer))))))

================================================================================
Ellipsis as argument
================================================================================

x = foo(1, ...)

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

(program
  (assignment
    (identifier)
    (call
      (identifier)
      (argument_list
        (integer)
        (forward_argument)))))

================================================================================
Ellipsis as parameter
================================================================================

def method (x, ...)
end

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

(program
  (method
    (identifier)
    (method_parameters
      (identifier)
      (forward_parameter))))

================================================================================
Ellipsis in dot chain
================================================================================

x. ... .z()

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

(program
  (call
    (call
      (identifier)
      (identifier))
    (identifier)
    (argument_list)))

================================================================================
Ellipsis as exp
================================================================================

x = ...

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

(program
  (assignment
    (identifier)
    (semgrep_ellipsis_followed_by_newline)))

================================================================================
Ellipsis at end of program without newline
================================================================================
$X = ...
--------------------------------------------------------------------------------

(program
  (assignment
    (constant
      (semgrep_metavariable))
    (semgrep_ellipsis_followed_by_newline)))

================================================================================
Metavariable
================================================================================

$X

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

(program
  (constant
    (semgrep_metavariable)))

================================================================================
Metavariable as argument
================================================================================

foo($X, $Y)

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

(program
  (call
    (identifier)
    (argument_list
      (constant
        (semgrep_metavariable))
      (constant
        (semgrep_metavariable)))))

================================================================================
Metavariable as call ident
================================================================================

$Z(1, 2)

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

(program
  (call
    (constant
      (semgrep_metavariable))
    (argument_list
      (integer)
      (integer))))

================================================================================
Metavariable for dot access field
================================================================================

foo.$Z()

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

(program
  (call
    (identifier)
    (constant
      (semgrep_metavariable))
    (argument_list)))

================================================================================
Deep ellipsis operator
================================================================================

<... foo ...>

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

(program
  (deep_ellipsis
    (identifier)))

================================================================================
Deep ellipsis inside call
================================================================================

foo(<... bar ...>)

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

(program
  (call
    (identifier)
    (argument_list
      (deep_ellipsis
        (identifier)))))

================================================================================
Deep ellipsis operator
================================================================================

$X = <... 1 + 2 ...>

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

(program
  (assignment
    (constant
      (semgrep_metavariable))
    (deep_ellipsis
      (binary
        (integer)
        (integer)))))

================================================================================
Metavariable ellipsis
================================================================================

$...X

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

(program
  (identifier))

================================================================================
Metavariable ellipsis with statements
================================================================================

foo()
$...X
bar()

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

(program
  (call
    (identifier)
    (argument_list))
  (identifier)
  (call
    (identifier)
    (argument_list)))

================================================================================
Metavariable ellipsis in function call
================================================================================

foo($...X, 1)

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

(program
  (call
    (identifier)
    (argument_list
      (identifier)
      (integer))))

================================================================================
Ellipsis in interpolation
================================================================================

x = "...#{...}..."

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

(program
  (assignment
    (identifier)
    (string
      (string_content)
      (interpolation
        (semgrep_ellipsis))
      (string_content))))

================================================================================
Metavariable for name of class
================================================================================

class $CONTROLLER < ApplicationController
  ...
end

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

(program
  (class
    (constant
      (semgrep_metavariable))
    (superclass
      (constant))
    (body_statement
      (semgrep_ellipsis_followed_by_newline))))

================================================================================
Ellipsis in pair argument
================================================================================

render text: ...

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

(program
  (call
    (identifier)
    (argument_list
      (pair
        (hash_key_symbol)
        (semgrep_ellipsis_followed_by_newline)))))

================================================================================
Ellipsis stress test
================================================================================

$EXEC({...},"...","...","...",...)

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

(program
  (call
    (constant
      (semgrep_metavariable))
    (argument_list
      (hash
        (pair
          (semgrep_ellipsis)))
      (string
        (string_content))
      (string
        (string_content))
      (string
        (string_content))
      (forward_argument))))

================================================================================
Hash pattern ellipsis
================================================================================

1 in {x: 1, ...}

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

(program
  (test_pattern
    (integer)
    (hash_pattern
      (keyword_pattern
        (hash_key_symbol)
        (integer))
      (keyword_pattern
        (semgrep_ellipsis)))))

================================================================================
Hash ellipsis
================================================================================

{x: 1, ...}

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

(program
  (hash
    (pair
      (hash_key_symbol)
      (integer))
    (pair
      (semgrep_ellipsis))))

================================================================================
Ellipsis in command call arg
================================================================================

foo ..., 2

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_and_comma)
      (integer))))

================================================================================
Class with ellipses
================================================================================

class $C < Foo
  ...
  bar ..., :p => "$S", ...
end

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

(program
  (class
    (constant
      (semgrep_metavariable))
    (superclass
      (constant))
    (body_statement
      (semgrep_ellipsis_followed_by_newline)
      (call
        (identifier)
        (argument_list
          (semgrep_ellipsis_and_comma)
          (pair
            (simple_symbol)
            (string
              (string_content)))
          (semgrep_ellipsis_followed_by_newline))))))

================================================================================
Long name
================================================================================

Rails.application.config.action_dispatch.cookies_serializer = :foo

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

(program
  (assignment
    (call
      (call
        (call
          (call
            (constant)
            (identifier))
          (identifier))
        (identifier))
      (identifier))
    (simple_symbol)))

================================================================================
Command call with ellipses
================================================================================

attr_accessible ..., :account_id, ...

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_and_comma)
      (simple_symbol)
      (semgrep_ellipsis_followed_by_newline))))

================================================================================
Long command call with metavariable
================================================================================

OpenSSL::Digest::MD5.base64digest $X

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

(program
  (call
    (scope_resolution
      (scope_resolution
        (constant)
        (constant))
      (constant))
    (identifier)
    (argument_list
      (constant
        (semgrep_metavariable)))))

================================================================================
Command call with hash pair and ellipses
================================================================================

render ..., file: ...

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_and_comma)
      (pair
        (hash_key_symbol)
        (semgrep_ellipsis_followed_by_newline)))))

================================================================================
Do block with ellipses
================================================================================

foo ... do ... end

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

(program
  (call
    (identifier)
    (do_block
      (body_statement
        (semgrep_ellipsis)))))

================================================================================
Block with ellipses
================================================================================

foo ... { ... }

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

(program
  (call
    (identifier)
    (block
      (block_body
        (semgrep_ellipsis)))))

================================================================================
Do block with ellipses with newlines
================================================================================

bar ... do
  ...
end

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

(program
  (call
    (identifier)
    (do_block
      (body_statement
        (semgrep_ellipsis_followed_by_newline)))))

================================================================================
Block with ellipses with ellipses
================================================================================

bar ... {
  ...
}

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

(program
  (call
    (identifier)
    (block
      (block_body
        (semgrep_ellipsis_followed_by_newline)))))

================================================================================
Do block with complex ellipses with newlines
================================================================================

qux ..., 1 do
  ...
end

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_and_comma)
      (integer))
    (do_block
      (body_statement
        (semgrep_ellipsis_followed_by_newline)))))

================================================================================
Block with complex ellipses with newlines
================================================================================

qux ..., 1 {
  ...
}

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

(program
  (call
    (identifier)
    (argument_list
      (semgrep_ellipsis_and_comma)
      (integer))
    (block
      (block_body
        (semgrep_ellipsis_followed_by_newline)))))
