def simpleFun {_ : Type} (a b : Nat) : Nat → Nat → Nat := sorry

#check simpleFun  -- Full signature help expected
              --^ textDocument/signatureHelp

#check simpleFun  -- Full signature help expected
               --^ textDocument/signatureHelp

#check simpleFun 0  -- Shortened signature help expected (implicit is skipped)
                 --^ textDocument/signatureHelp

#check simpleFun 0 0  -- Shortened signature help without ∀ expected
                   --^ textDocument/signatureHelp

#check simpleFun 0 0 0  -- Shortened signature help without ∀ expected
                     --^ textDocument/signatureHelp

#check simpleFun 0 0 0 0  -- No signature help expected
                       --^ textDocument/signatureHelp

#check simpleFun 0 0 0 0  -- No signature help expected
                    --^ textDocument/signatureHelp

#check simpleFun -- No signature help expected in end-of-line comment
               --^ textDocument/signatureHelp

#check simpleFun <|  -- Full signature help expected
                  --^ textDocument/signatureHelp

#check simpleFun 0 0 0 <|  -- Shortened signature help expected
                        --^ textDocument/signatureHelp

#check simpleFun 0 <| simpleFun  -- Full signature help expected
                              --^ textDocument/signatureHelp

#check simpleFun $  -- Full signature help expected
                 --^ textDocument/signatureHelp

#check simpleFun 0 0 0 $  -- Shortened signature help expected
                       --^ textDocument/signatureHelp

#check simpleFun 0 $ simpleFun  -- Full signature help expected
                             --^ textDocument/signatureHelp

#check simpleFun ( )  -- No signature help expected
                --^ textDocument/signatureHelp

#check @simpleFun  -- Full signature help expected
                --^ textDocument/signatureHelp

#check @simpleFun _  -- Shortened signature help expected (implicit is not skipped)
                  --^ textDocument/signatureHelp

#check simpleFun (b := 0)  -- Shortened signature help without `b` expected
                        --^ textDocument/signatureHelp

#check (simpleFun 0)  -- Shortened signature help expected
                   --^ textDocument/signatureHelp

#check (simpleFun 0) 0  -- Shortened signature help expected
                     --^ textDocument/signatureHelp

def simpleProp (x y : Nat) : x = y → x = y := sorry

#check simpleProp  -- Full signature help with `∀` expected
                --^ textDocument/signatureHelp

#check simpleProp 0  -- Shortened signature help with `∀` expected
                  --^ textDocument/signatureHelp

#check simpleProp 0 0  -- Shortened signature help with remaining implication expected
                    --^ textDocument/signatureHelp

#check simpleProp 0 0 sorry  -- No signature help expected
                          --^ textDocument/signatureHelp

def complexFun (f : Nat → Nat → Nat → Nat → Nat) (x : Nat) : Nat := sorry

#check complexFun simpleFun  -- Shortened signature help of `complexFun` expected
                          --^ textDocument/signatureHelp

#check complexFun simpleFun 0  -- No signature help expected
                            --^ textDocument/signatureHelp

#check complexFun (simpleFun  ) -- Signature help of `simpleFun` expected
                           --^ textDocument/signatureHelp

structure SomeStructure where
  fieldFun (x : Nat) : Nat → Nat

def SomeStructure.dotFun (s : SomeStructure) (x : Nat) : Nat := sorry

def SomeStructure.dotIdFun (x : Nat) : SomeStructure := sorry

variable (s : SomeStructure) (s' : Nat → SomeStructure)

#check s.fieldFun  -- Full signature help expected
                --^ textDocument/signatureHelp

#check s.fieldFun 0  -- Shortened signature help expected
                  --^ textDocument/signatureHelp

#check s.fieldFun 0 0  -- No signature help expected
                    --^ textDocument/signatureHelp

#check (s' 0).fieldFun  -- Full signature help expected
                     --^ textDocument/signatureHelp

#check (s' 0).fieldFun 0  -- Shortened signature help expected
                       --^ textDocument/signatureHelp

#check s.dotFun  -- Full signature help expected
              --^ textDocument/signatureHelp

#check s.dotFun 0  -- No signature help expected
                --^ textDocument/signatureHelp

#check (s' 0).dotFun  -- Full signature help expected
                   --^ textDocument/signatureHelp

#check (s' 0).dotFun 0  -- No signature help expected
                     --^ textDocument/signatureHelp

#check s |>.fieldFun  -- Full signature help expected
                   --^ textDocument/signatureHelp

#check s |>.fieldFun 0  -- Shortened signature help expected
                     --^ textDocument/signatureHelp

#check s |>.fieldFun 0 0  -- No signature help expected
                       --^ textDocument/signatureHelp

#check s' 0 |>.fieldFun  -- Full signature help expected
                      --^ textDocument/signatureHelp

#check s' 0 |>.fieldFun 0  -- Shortened signature help expected
                        --^ textDocument/signatureHelp

example : SomeStructure := .dotIdFun  -- Full signature help expected
                                   --^ textDocument/signatureHelp


example : SomeStructure := .dotIdFun 0  -- No signature help expected
                                     --^ textDocument/signatureHelp
