================================================================================
basic module with indent
================================================================================

module test =
 let x = 4

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))))

================================================================================
basic module with large indent
================================================================================

module test =
                      let x = 4

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))))

================================================================================
basic module with multiple elements
================================================================================

module test =
 let x = 4
 let y = 5

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))))

================================================================================
top-level module with multiple elements
================================================================================

module Test

let x = 4
let y = 5

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

(file
  (named_module
    name: (long_identifier
      (identifier))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        body: (const
          (int))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        body: (const
          (int))))))

================================================================================
namespace open
================================================================================

namespace Test.A

open B
open X.Y

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

(file
  (namespace
    (long_identifier
      (identifier)
      (identifier))
    (import_decl
      (long_identifier
        (identifier)))
    (import_decl
      (long_identifier
        (identifier)
        (identifier)))))

================================================================================
multiple modules in namespace
================================================================================

namespace Test

module A =
  let x = ()

module B =
  let x = ()

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

(file
  (namespace
    (long_identifier
      (identifier))
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))))

================================================================================
multiple modules in top-level module
================================================================================

module Test

module A =
  let x = ()

module B =
  let x = ()

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

(file
  (named_module
    (long_identifier
      (identifier))
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))))

================================================================================
multiple modules in anonymous module
================================================================================

module A =
  let x = ()

module B =
  let x = ()

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (unit)))))
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (unit))))))

================================================================================
top-level expression in module
================================================================================

module A =
  ()

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

(file
  (module_defn
    (identifier)
    (const
      (unit))))

================================================================================
named top-level module with attribute
================================================================================

/// Some documentation comment here
[<RequireQualifiedAccess>]
module internal Some.Qualified.ModuleName

open System
open System.Collections.Generic

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

(file
  (xml_doc)
  (named_module
    (attributes
      (attribute
        (simple_type
          (long_identifier
            (identifier)))))
    (access_modifier)
    (long_identifier
      (identifier)
      (identifier)
      (identifier))
    (import_decl
      (long_identifier
        (identifier)))
    (import_decl
      (long_identifier
        (identifier)
        (identifier)
        (identifier)))))

================================================================================
module with expression and non-expression elements
================================================================================

module A =
  print "A"
  type B = C

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

(file
  (module_defn
    (identifier)
    (application_expression
      (long_identifier_or_op
        (identifier))
      (const
        (string)))
    (type_definition
      (union_type_defn
        (type_name
          (identifier))
        (union_type_cases
          (union_type_case
            (identifier)))))))

================================================================================
module with multiple expressions and non-expression
================================================================================

module A =
  print "A"
  print "D"
  type B = C

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

(file
  (module_defn
    (identifier)
    (application_expression
      (long_identifier_or_op
        (identifier))
      (const
        (string)))
    (application_expression
      (long_identifier_or_op
        (identifier))
      (const
        (string)))
    (type_definition
      (union_type_defn
        (type_name
          (identifier))
        (union_type_cases
          (union_type_case
            (identifier)))))))

================================================================================
recursive module definition
================================================================================

module rec MyModule =
  let x = 1
  let y = x + 1

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (infix_expression
          (long_identifier_or_op
            (identifier))
          (infix_op)
          (const
            (int)))))))

================================================================================
module with begin...end
================================================================================

module M =
  begin
    let x = 1
    let y = 2
  end

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

(file
  (module_defn
    (identifier)
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (int))))))

================================================================================
dedent from nested module back to outer module
================================================================================

module M =

    module Inner =
         let a = ()
         let b = ()

        let c = ()

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

(file
  (module_defn
    (identifier)
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit))))
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (unit))))))

================================================================================
dedent from nested module to a sibling nested module
================================================================================

module M =

    module Inner =
         let a = ()

        module Inner2 =
            let b = ()

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

(file
  (module_defn
    (identifier)
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))))

================================================================================
dedent from nested module with multiple trailing members
================================================================================

module M =

    module Inner =
         let a = ()

        let c = ()
        let d = ()

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

(file
  (module_defn
    (identifier)
    (module_defn
      (identifier)
      (declaration_expression
        (function_or_value_defn
          (value_declaration_left
            (identifier_pattern
              (long_identifier_or_op
                (identifier))))
          (const
            (unit)))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (unit))))
    (declaration_expression
      (function_or_value_defn
        (value_declaration_left
          (identifier_pattern
            (long_identifier_or_op
              (identifier))))
        (const
          (unit))))))

================================================================================
top-level module with do-binding then member
================================================================================

module M

    do ()
    let f a = a

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

(file
  (named_module
    (long_identifier
      (identifier))
    (declaration_expression
      (do
        (const
          (unit))))
    (declaration_expression
      (function_or_value_defn
        (function_declaration_left
          (identifier)
          (argument_patterns
            (long_identifier
              (identifier))))
        (long_identifier_or_op
          (long_identifier
            (identifier)))))))

================================================================================
top-level module with attribute, do-binding and entry point
================================================================================

module M

    [<assembly: Foo("")>]
    do ()

    [<EntryPoint>]
    let main args = exit 0

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

(file
  (named_module
    (long_identifier
      (identifier))
    (declaration_expression
      (attributes
        (attribute
          (identifier)
          (simple_type
            (long_identifier
              (identifier)))
          (paren_expression
            (const
              (string)))))
      (do
        (const
          (unit))))
    (declaration_expression
      (attributes
        (attribute
          (simple_type
            (long_identifier
              (identifier)))))
      (function_or_value_defn
        (function_declaration_left
          (identifier)
          (argument_patterns
            (long_identifier
              (identifier))))
        (application_expression
          (long_identifier_or_op
            (identifier))
          (const
            (int)))))))
