==============================
Module type path
==============================

module M : T
module M : M.T

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (module_type_path (module_type_name))))
  (module_definition
    (module_binding
      (module_name)
      (module_type_path
        (extended_module_path (module_name))
        (module_type_name)))))

==============================
Signatures
==============================

module M : sig
  val x : t
end

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (signature
        (value_specification
          (value_name)
          (type_constructor_path (type_constructor)))))))

==============================
Constraints
==============================

module M : T with type t = t and module M := M and module type T = T

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (module_type_constraint
        (module_type_path (module_type_name))
        (constrain_type
          (type_constructor_path (type_constructor))
          (type_constructor_path (type_constructor)))
        (constrain_module
          (module_path (module_name))
          (extended_module_path (module_name)))
        (constrain_module_type
          (module_type_path (module_type_name))
          (module_type_path (module_type_name)))))))

==============================
Module type of
==============================

module M : module type of M

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (module_type_of (module_path (module_name))))))

==============================
Functor types
==============================

module M : functor (M : T) -> T
module M : T -> T -> T

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (functor_type
        (module_parameter
          (module_name)
          (module_type_path (module_type_name)))
        (module_type_path (module_type_name)))))
  (module_definition
    (module_binding
      (module_name)
      (functor_type
        (module_type_path (module_type_name))
        (functor_type
          (module_type_path (module_type_name))
          (module_type_path (module_type_name)))))))

==============================
Parenthesized module types
==============================

module M : (T)

---

(compilation_unit
  (module_definition
    (module_binding
      (module_name)
      (parenthesized_module_type (module_type_path (module_type_name))))))
