joaotavora / eglot

A client for Language Server Protocol servers
GNU General Public License v3.0
2.27k stars 200 forks source link

Eglot should supply CompletionTriggerKind.TriggerCharacter to help ccls disambiguate between : and :: #173

Closed amosnier closed 5 years ago

amosnier commented 5 years ago

Also posted at: https://github.com/MaskRay/ccls/issues/144. But it looks like ccls is doing the right thing.

With emacs + eglot + ccls + company, I am getting some really surprising (at least to me) completion after typing colon.

Here comes an example:

image

I get the same issue after the colon in for (auto i :.

I tried to make sense of eglot's event buffer that shows LSP requests and replies, and unless I am mistaken, ccls seems to send all these completion propositions.

Any clue about where this comes from?

joaotavora commented 5 years ago

According to @MaskRay

The expected client-side behavior here is not to suggest completion candidates.

The server announces that it supports : in CompletionOptions.triggerCharacters. Ideally it should be ::, but there is a limitation that VSCode only accepts length-one strings and they don't intend to fix that Microsoft/language-server-protocol#138 To work around this limitation, the following scheme has to be used. When user inserts :, the client should send textDocument/completion and provide CompletionTriggerKind.TriggerCharacter (company-lsp and eglot fail to do it now @tigersoldier) The server checks if there is another colon before the just-inserted colon. If not, it returns an empty CompletionList.

Eglot should supply completionContext and CompletionTriggerKind.TriggerCharacter inside that.

joaotavora commented 5 years ago

Perhaps we can salvage some (emphasis on the some) code from https://github.com/joaotavora/eglot/pull/118. The author didn't clarify the need back then, but a use case has now arisen.

amosnier commented 5 years ago

You guys are great! @joaotavora do I understand correctly that you intend to solve the issue? Depending on your time frame, I could possibly try to help, although Emacs Lisp is definitely not my main language. Please tell me if you think I could assist you in some way.

joaotavora commented 5 years ago

@amosnier please test and report back here if it's fixed.

amosnier commented 5 years ago

I do see a triggerKind now:

client-request (id:47) Sun Dec  2 12:36:11 2018:
(:jsonrpc "2.0" :id 47 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/main.cpp")
       :position
       (:line 14 :character 8)
       :context
       (:triggerKind 1)))

But unfortunately, ccls still returns a huge list of completion symbols. As mentioned earlier, 14,8 is the start of switch in my code. Are we still missing a TriggerCharacter?

image

server-notification Sun Dec  2 12:36:12 2018:
(:jsonrpc "2.0" :method "textDocument/publishDiagnostics" :params
      (:uri "file:///home/alain/custom/repos/tint/src/main.cpp" :diagnostics
        [(:range
          (:start
           (:line 15 :character 1)
           :end
           (:line 15 :character 2))
          :severity 1 :code 4 :source "ccls" :message "expected expression")
         (:range
          (:start
           (:line 14 :character 6)
           :end
           (:line 14 :character 6))
          :severity 1 :code 4 :source "ccls" :message "expected ':' after 'case'")
         (:range
          (:start
           (:line 15 :character 1)
           :end
           (:line 15 :character 2))
          :severity 1 :code 4 :source "ccls" :message "expected statement")]))

server-reply (id:47) Sun Dec  2 12:36:12 2018:
(:jsonrpc "2.0" :id 47 :result
      (:isIncomplete t :items
             [(:label "i : int" :kind 6 :detail "" :sortText "   !" :filterText "i" :insertText "i" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "i")
                  :additionalTextEdits
                  [])
              (:label "__j1l(long double) -> long double" :kind 3 :detail "" :sortText "   \"" :filterText "__j1l" :insertText "__j1l(${1:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__j1l(${1:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_broadcastd_epi32(__m256i __O, __mmask8 __M, __m128i __A) -> __m256i" :kind 3 :detail "" :sortText "   #" :filterText "_mm256_mask_broadcastd_epi32" :insertText "_mm256_mask_broadcastd_epi32(${1:__m256i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_broadcastd_epi32(${1:__m256i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANTISSA_NORM_ENUM" :kind 7 :detail "" :sortText "   $" :filterText "_MM_MANTISSA_NORM_ENUM" :insertText "_MM_MANTISSA_NORM_ENUM" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANTISSA_NORM_ENUM")
                  :additionalTextEdits
                  [])
              (:label "__sin(double __x) -> double" :kind 3 :detail "" :sortText "   %" :filterText "__sin" :insertText "__sin(${1:double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__sin(${1:double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANT_NORM_p5_1 : _MM_MANTISSA_NORM_ENUM" :kind 20 :detail "" :sortText "   &" :filterText "_MM_MANT_NORM_p5_1" :insertText "_MM_MANT_NORM_p5_1" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANT_NORM_p5_1")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANT_NORM_p75_1p5 : _MM_MANTISSA_NORM_ENUM" :kind 20 :detail "" :sortText "   '" :filterText "_MM_MANT_NORM_p75_1p5" :insertText "_MM_MANT_NORM_p75_1p5" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANT_NORM_p75_1p5")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_shrdv_epi16(__m256i __S, __mmask16 __U, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "   (" :filterText "_mm256_mask_shrdv_epi16" :insertText "_mm256_mask_shrdv_epi16(${1:__m256i __S}, ${2:__mmask16 __U}, ${3:__m256i __A}, ${4:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_shrdv_epi16(${1:__m256i __S}, ${2:__mmask16 __U}, ${3:__m256i __A}, ${4:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "__copysignf(float __x, float __y) -> float" :kind 3 :detail "" :sortText "   )" :filterText "__copysignf" :insertText "__copysignf(${1:float __x}, ${2:float __y})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__copysignf(${1:float __x}, ${2:float __y})$0")
                  :additionalTextEdits
                  [])
              (:label "j1l(long double) -> long double" :kind 3 :detail "" :sortText "   *" :filterText "j1l" :insertText "j1l(${1:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "j1l(${1:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_maskz_adds_epu8(__mmask64 __U, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "   +" :filterText "_mm512_maskz_adds_epu8" :insertText "_mm512_maskz_adds_epu8(${1:__mmask64 __U}, ${2:__m512i __A}, ${3:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_maskz_adds_epu8(${1:__mmask64 __U}, ${2:__m512i __A}, ${3:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "tan(double __x) -> double" :kind 3 :detail "" :sortText "   ," :filterText "tan" :insertText "tan(${1:double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "tan(${1:double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_conflict_epi32(__m256i __W, __mmask8 __U, __m256i __A) -> __m256i" :kind 3 :detail "" :sortText "   -" :filterText "_mm256_mask_conflict_epi32" :insertText "_mm256_mask_conflict_epi32(${1:__m256i __W}, ${2:__mmask8 __U}, ${3:__m256i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_conflict_epi32(${1:__m256i __W}, ${2:__mmask8 __U}, ${3:__m256i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANT_SIGN_nan : _MM_MANTISSA_SIGN_ENUM" :kind 20 :detail "" :sortText "   ." :filterText "_MM_MANT_SIGN_nan" :insertText "_MM_MANT_SIGN_nan" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANT_SIGN_nan")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANT_SIGN_src : _MM_MANTISSA_SIGN_ENUM" :kind 20 :detail "" :sortText "   /" :filterText "_MM_MANT_SIGN_src" :insertText "_MM_MANT_SIGN_src" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANT_SIGN_src")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_broadcastd_epi32(__mmask8 __M, __m128i __A) -> __m256i" :kind 3 :detail "" :sortText "   0" :filterText "_mm256_maskz_broadcastd_epi32" :insertText "_mm256_maskz_broadcastd_epi32(${1:__mmask8 __M}, ${2:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_broadcastd_epi32(${1:__mmask8 __M}, ${2:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_storeu2_m128i(__m128i *__addr_hi, __m128i *__addr_lo, __m256i __a) -> void" :kind 3 :detail "" :sortText "   1" :filterText "_mm256_storeu2_m128i" :insertText "_mm256_storeu2_m128i(${1:__m128i *__addr_hi}, ${2:__m128i *__addr_lo}, ${3:__m256i __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_storeu2_m128i(${1:__m128i *__addr_hi}, ${2:__m128i *__addr_lo}, ${3:__m256i __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANT_SIGN_zero : _MM_MANTISSA_SIGN_ENUM" :kind 20 :detail "" :sortText "   2" :filterText "_MM_MANT_SIGN_zero" :insertText "_MM_MANT_SIGN_zero" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANT_SIGN_zero")
                  :additionalTextEdits
                  [])
              (:label "sin(double __x) -> double" :kind 3 :detail "" :sortText "   3" :filterText "sin" :insertText "sin(${1:double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "sin(${1:double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_mask_permutex2var_ps(__m512 __A, __mmask16 __U, __m512i __I, __m512 __B) -> __m512" :kind 3 :detail "" :sortText "   4" :filterText "_mm512_mask_permutex2var_ps" :insertText "_mm512_mask_permutex2var_ps(${1:__m512 __A}, ${2:__mmask16 __U}, ${3:__m512i __I}, ${4:__m512 __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_mask_permutex2var_ps(${1:__m512 __A}, ${2:__mmask16 __U}, ${3:__m512i __I}, ${4:__m512 __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_sub_epi16(__mmask16 __U, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "   5" :filterText "_mm256_maskz_sub_epi16" :insertText "_mm256_maskz_sub_epi16(${1:__mmask16 __U}, ${2:__m256i __A}, ${3:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_sub_epi16(${1:__mmask16 __U}, ${2:__m256i __A}, ${3:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_unpacklo_pd(__m256d __a, __m256d __b) -> __m256d" :kind 3 :detail "" :sortText "   6" :filterText "_mm256_unpacklo_pd" :insertText "_mm256_unpacklo_pd(${1:__m256d __a}, ${2:__m256d __b})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_unpacklo_pd(${1:__m256d __a}, ${2:__m256d __b})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_mask_dpwssds_epi32(__m512i __S, __mmask16 __U, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "   7" :filterText "_mm512_mask_dpwssds_epi32" :insertText "_mm512_mask_dpwssds_epi32(${1:__m512i __S}, ${2:__mmask16 __U}, ${3:__m512i __A}, ${4:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_mask_dpwssds_epi32(${1:__m512i __S}, ${2:__mmask16 __U}, ${3:__m512i __A}, ${4:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_fnmsub_pd(__m256d __A, __mmask8 __U, __m256d __B, __m256d __C) -> __m256d" :kind 3 :detail "" :sortText "   8" :filterText "_mm256_mask_fnmsub_pd" :insertText "_mm256_mask_fnmsub_pd(${1:__m256d __A}, ${2:__mmask8 __U}, ${3:__m256d __B}, ${4:__m256d __C})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_fnmsub_pd(${1:__m256d __A}, ${2:__mmask8 __U}, ${3:__m256d __B}, ${4:__m256d __C})$0")
                  :additionalTextEdits
                  [])
              (:label "_MM_MANTISSA_SIGN_ENUM" :kind 7 :detail "" :sortText "   9" :filterText "_MM_MANTISSA_SIGN_ENUM" :insertText "_MM_MANTISSA_SIGN_ENUM" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_MM_MANTISSA_SIGN_ENUM")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_shrdv_epi16(__mmask16 __U, __m256i __S, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "   :" :filterText "_mm256_maskz_shrdv_epi16" :insertText "_mm256_maskz_shrdv_epi16(${1:__mmask16 __U}, ${2:__m256i __S}, ${3:__m256i __A}, ${4:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_shrdv_epi16(${1:__mmask16 __U}, ${2:__m256i __S}, ${3:__m256i __A}, ${4:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_movedup_pd(__m256d __a) -> __m256d" :kind 3 :detail "" :sortText "   ;" :filterText "_mm256_movedup_pd" :insertText "_mm256_movedup_pd(${1:__m256d __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_movedup_pd(${1:__m256d __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_set_m128d(__m128d __hi, __m128d __lo) -> __m256d" :kind 3 :detail "" :sortText "   <" :filterText "_mm256_set_m128d" :insertText "_mm256_set_m128d(${1:__m128d __hi}, ${2:__m128d __lo})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_set_m128d(${1:__m128d __hi}, ${2:__m128d __lo})$0")
                  :additionalTextEdits
                  [])
              (:label "cosh(double __x) -> double" :kind 3 :detail "" :sortText "   =" :filterText "cosh" :insertText "cosh(${1:double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "cosh(${1:double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask3_fnmsub_pd(__m128d __A, __m128d __B, __m128d __C, __mmask8 __U) -> __m128d" :kind 3 :detail "" :sortText "   >" :filterText "_mm_mask3_fnmsub_pd" :insertText "_mm_mask3_fnmsub_pd(${1:__m128d __A}, ${2:__m128d __B}, ${3:__m128d __C}, ${4:__mmask8 __U})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask3_fnmsub_pd(${1:__m128d __A}, ${2:__m128d __B}, ${3:__m128d __C}, ${4:__mmask8 __U})$0")
                  :additionalTextEdits
                  [])
              (:label "logbf64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "   ?" :filterText "logbf64x" :insertText "logbf64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "logbf64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "__significandf(float __x) -> float" :kind 3 :detail "" :sortText "   @" :filterText "__significandf" :insertText "__significandf(${1:float __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__significandf(${1:float __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_conflict_epi32(__m256i __A) -> __m256i" :kind 3 :detail "" :sortText "  ! " :filterText "_mm256_conflict_epi32" :insertText "_mm256_conflict_epi32(${1:__m256i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_conflict_epi32(${1:__m256i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_setzero_si512() -> __m512i" :kind 3 :detail "" :sortText "  !!" :filterText "_mm512_setzero_si512" :insertText "_mm512_setzero_si512()" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_setzero_si512()")
                  :additionalTextEdits
                  [])
              (:label "jnl(int, long double) -> long double" :kind 3 :detail "" :sortText "  !\"" :filterText "jnl" :insertText "jnl(${1:int}, ${2:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "jnl(${1:int}, ${2:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_add_epi8(__m128i __W, __mmask16 __U, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  !#" :filterText "_mm_mask_add_epi8" :insertText "_mm_mask_add_epi8(${1:__m128i __W}, ${2:__mmask16 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_add_epi8(${1:__m128i __W}, ${2:__mmask16 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_adds_epu16(__m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  !$" :filterText "_mm512_adds_epu16" :insertText "_mm512_adds_epu16(${1:__m512i __A}, ${2:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_adds_epu16(${1:__m512i __A}, ${2:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "fprintf(FILE *__restrict __stream, const char *__restrict __format, ...) -> int" :kind 3 :detail "" :sortText "  !%" :filterText "fprintf" :insertText "fprintf(${1:FILE *__restrict __stream}, ${2:const char *__restrict __format, ...})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "fprintf(${1:FILE *__restrict __stream}, ${2:const char *__restrict __format, ...})$0")
                  :additionalTextEdits
                  [])
              (:label "y0l(long double) -> long double" :kind 3 :detail "" :sortText "  !&" :filterText "y0l" :insertText "y0l(${1:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "y0l(${1:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_unpackhi_pd(__m256d __a, __m256d __b) -> __m256d" :kind 3 :detail "" :sortText "  !'" :filterText "_mm256_unpackhi_pd" :insertText "_mm256_unpackhi_pd(${1:__m256d __a}, ${2:__m256d __b})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_unpackhi_pd(${1:__m256d __a}, ${2:__m256d __b})$0")
                  :additionalTextEdits
                  [])
              (:label "copysignf(float __x, float __y) -> float" :kind 3 :detail "" :sortText "  !(" :filterText "copysignf" :insertText "copysignf(${1:float __x}, ${2:float __y})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "copysignf(${1:float __x}, ${2:float __y})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_undefined_pd() -> __m512d" :kind 3 :detail "" :sortText "  !)" :filterText "_mm512_undefined_pd" :insertText "_mm512_undefined_pd()" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_undefined_pd()")
                  :additionalTextEdits
                  [])
              (:label "_mm512_permutex2var_ps(__m512 __A, __m512i __I, __m512 __B) -> __m512" :kind 3 :detail "" :sortText "  !*" :filterText "_mm512_permutex2var_ps" :insertText "_mm512_permutex2var_ps(${1:__m512 __A}, ${2:__m512i __I}, ${3:__m512 __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_permutex2var_ps(${1:__m512 __A}, ${2:__m512i __I}, ${3:__m512 __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_maskz_conflict_epi32(__mmask8 __U, __m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  !+" :filterText "_mm_maskz_conflict_epi32" :insertText "_mm_maskz_conflict_epi32(${1:__mmask8 __U}, ${2:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_maskz_conflict_epi32(${1:__mmask8 __U}, ${2:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "__tan(double __x) -> double" :kind 3 :detail "" :sortText "  !," :filterText "__tan" :insertText "__tan(${1:double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__tan(${1:double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_set_m128(__m128 __hi, __m128 __lo) -> __m256" :kind 3 :detail "" :sortText "  !-" :filterText "_mm256_set_m128" :insertText "_mm256_set_m128(${1:__m128 __hi}, ${2:__m128 __lo})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_set_m128(${1:__m128 __hi}, ${2:__m128 __lo})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_dpwssds_epi32(__m512i __S, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  !." :filterText "_mm512_dpwssds_epi32" :insertText "_mm512_dpwssds_epi32(${1:__m512i __S}, ${2:__m512i __A}, ${3:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_dpwssds_epi32(${1:__m512i __S}, ${2:__m512i __A}, ${3:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "__jnl(int, long double) -> long double" :kind 3 :detail "" :sortText "  !/" :filterText "__jnl" :insertText "__jnl(${1:int}, ${2:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__jnl(${1:int}, ${2:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "__log1pf64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  !0" :filterText "__log1pf64x" :insertText "__log1pf64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__log1pf64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_dpbusd_epi32(__m256i __S, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "  !1" :filterText "_mm256_dpbusd_epi32" :insertText "_mm256_dpbusd_epi32(${1:__m256i __S}, ${2:__m256i __A}, ${3:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_dpbusd_epi32(${1:__m256i __S}, ${2:__m256i __A}, ${3:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_broadcastq_epi64(__m128i __O, __mmask8 __M, __m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  !2" :filterText "_mm_mask_broadcastq_epi64" :insertText "_mm_mask_broadcastq_epi64(${1:__m128i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_broadcastq_epi64(${1:__m128i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_movehdup_ps(__m256 __a) -> __m256" :kind 3 :detail "" :sortText "  !3" :filterText "_mm256_movehdup_ps" :insertText "_mm256_movehdup_ps(${1:__m256 __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_movehdup_ps(${1:__m256 __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_maskz_broadcastq_epi64(__mmask8 __M, __m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  !4" :filterText "_mm_maskz_broadcastq_epi64" :insertText "_mm_maskz_broadcastq_epi64(${1:__mmask8 __M}, ${2:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_maskz_broadcastq_epi64(${1:__mmask8 __M}, ${2:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "nanl(const char *__tagb) -> long double" :kind 3 :detail "" :sortText "  !5" :filterText "nanl" :insertText "nanl(${1:const char *__tagb})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "nanl(${1:const char *__tagb})$0")
                  :additionalTextEdits
                  [])
              (:label "__exp2f64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  !6" :filterText "__exp2f64x" :insertText "__exp2f64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__exp2f64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_fnmsub_pd(__m128d __A, __mmask8 __U, __m128d __B, __m128d __C) -> __m128d" :kind 3 :detail "" :sortText "  !7" :filterText "_mm_mask_fnmsub_pd" :insertText "_mm_mask_fnmsub_pd(${1:__m128d __A}, ${2:__mmask8 __U}, ${3:__m128d __B}, ${4:__m128d __C})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_fnmsub_pd(${1:__m128d __A}, ${2:__mmask8 __U}, ${3:__m128d __B}, ${4:__m128d __C})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_conflict_epi32(__m128i __W, __mmask8 __U, __m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  !8" :filterText "_mm_mask_conflict_epi32" :insertText "_mm_mask_conflict_epi32(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_conflict_epi32(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "__logbf64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  !9" :filterText "__logbf64x" :insertText "__logbf64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__logbf64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_moveldup_ps(__m256 __a) -> __m256" :kind 3 :detail "" :sortText "  !:" :filterText "_mm256_moveldup_ps" :insertText "_mm256_moveldup_ps(${1:__m256 __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_moveldup_ps(${1:__m256 __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_storeu2_m128(float *__addr_hi, float *__addr_lo, __m256 __a) -> void" :kind 3 :detail "" :sortText "  !;" :filterText "_mm256_storeu2_m128" :insertText "_mm256_storeu2_m128(${1:float *__addr_hi}, ${2:float *__addr_lo}, ${3:__m256 __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_storeu2_m128(${1:float *__addr_hi}, ${2:float *__addr_lo}, ${3:__m256 __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_maskz_add_epi8(__mmask16 __U, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  !<" :filterText "_mm_maskz_add_epi8" :insertText "_mm_maskz_add_epi8(${1:__mmask16 __U}, ${2:__m128i __A}, ${3:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_maskz_add_epi8(${1:__mmask16 __U}, ${2:__m128i __A}, ${3:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_maskz_permutex2var_ps(__mmask16 __U, __m512 __A, __m512i __I, __m512 __B) -> __m512" :kind 3 :detail "" :sortText "  !=" :filterText "_mm512_maskz_permutex2var_ps" :insertText "_mm512_maskz_permutex2var_ps(${1:__mmask16 __U}, ${2:__m512 __A}, ${3:__m512i __I}, ${4:__m512 __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_maskz_permutex2var_ps(${1:__mmask16 __U}, ${2:__m512 __A}, ${3:__m512i __I}, ${4:__m512 __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_mask_adds_epu16(__m512i __W, __mmask32 __U, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  !>" :filterText "_mm512_mask_adds_epu16" :insertText "_mm512_mask_adds_epu16(${1:__m512i __W}, ${2:__mmask32 __U}, ${3:__m512i __A}, ${4:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_mask_adds_epu16(${1:__m512i __W}, ${2:__mmask32 __U}, ${3:__m512i __A}, ${4:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_undefined() -> __m512" :kind 3 :detail "" :sortText "  !?" :filterText "_mm512_undefined" :insertText "_mm512_undefined()" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_undefined()")
                  :additionalTextEdits
                  [])
              (:label "__nanl(const char *__tagb) -> long double" :kind 3 :detail "" :sortText "  !@" :filterText "__nanl" :insertText "__nanl(${1:const char *__tagb})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__nanl(${1:const char *__tagb})$0")
                  :additionalTextEdits
                  [])
              (:label "exp2f64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  \" " :filterText "exp2f64x" :insertText "exp2f64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "exp2f64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_shrdv_epi32(__m128i __S, __mmask8 __U, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  \"!" :filterText "_mm_mask_shrdv_epi32" :insertText "_mm_mask_shrdv_epi32(${1:__m128i __S}, ${2:__mmask8 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_shrdv_epi32(${1:__m128i __S}, ${2:__mmask8 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "j0l(long double) -> long double" :kind 3 :detail "" :sortText "  \"\"" :filterText "j0l" :insertText "j0l(${1:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "j0l(${1:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_fnmadd_ps(__m256 __A, __mmask8 __U, __m256 __B, __m256 __C) -> __m256" :kind 3 :detail "" :sortText "  \"#" :filterText "_mm256_mask_fnmadd_ps" :insertText "_mm256_mask_fnmadd_ps(${1:__m256 __A}, ${2:__mmask8 __U}, ${3:__m256 __B}, ${4:__m256 __C})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_fnmadd_ps(${1:__m256 __A}, ${2:__mmask8 __U}, ${3:__m256 __B}, ${4:__m256 __C})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_maskz_dpwssds_epi32(__mmask16 __U, __m512i __S, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  \"$" :filterText "_mm512_maskz_dpwssds_epi32" :insertText "_mm512_maskz_dpwssds_epi32(${1:__mmask16 __U}, ${2:__m512i __S}, ${3:__m512i __A}, ${4:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_maskz_dpwssds_epi32(${1:__mmask16 __U}, ${2:__m512i __S}, ${3:__m512i __A}, ${4:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_undefined_ps() -> __m512" :kind 3 :detail "" :sortText "  \"%" :filterText "_mm512_undefined_ps" :insertText "_mm512_undefined_ps()" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_undefined_ps()")
                  :additionalTextEdits
                  [])
              (:label "_mm_shrdv_epi32(__m128i __S, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  \"&" :filterText "_mm_shrdv_epi32" :insertText "_mm_shrdv_epi32(${1:__m128i __S}, ${2:__m128i __A}, ${3:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_shrdv_epi32(${1:__m128i __S}, ${2:__m128i __A}, ${3:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_broadcastq_epi64(__m256i __O, __mmask8 __M, __m128i __A) -> __m256i" :kind 3 :detail "" :sortText "  \"'" :filterText "_mm256_mask_broadcastq_epi64" :insertText "_mm256_mask_broadcastq_epi64(${1:__m256i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_broadcastq_epi64(${1:__m256i __O}, ${2:__mmask8 __M}, ${3:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "powf64x(_Float64x __x, _Float64x __y) -> _Float64x" :kind 3 :detail "" :sortText "  \"(" :filterText "powf64x" :insertText "powf64x(${1:_Float64x __x}, ${2:_Float64x __y})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "powf64x(${1:_Float64x __x}, ${2:_Float64x __y})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_avg_epu8(__m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  \")" :filterText "_mm512_avg_epu8" :insertText "_mm512_avg_epu8(${1:__m512i __A}, ${2:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_avg_epu8(${1:__m512i __A}, ${2:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_cvtsi256_si32(__m256i __a) -> int" :kind 3 :detail "" :sortText "  \"*" :filterText "_mm256_cvtsi256_si32" :insertText "_mm256_cvtsi256_si32(${1:__m256i __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_cvtsi256_si32(${1:__m256i __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_conflict_epi32(__m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  \"+" :filterText "_mm_conflict_epi32" :insertText "_mm_conflict_epi32(${1:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_conflict_epi32(${1:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "isnanl(long double __value) -> int" :kind 3 :detail "" :sortText "  \"," :filterText "isnanl" :insertText "isnanl(${1:long double __value})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "isnanl(${1:long double __value})$0")
                  :additionalTextEdits
                  [])
              (:label "log2f64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  \"-" :filterText "log2f64x" :insertText "log2f64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "log2f64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_broadcastq_epi64(__mmask8 __M, __m128i __A) -> __m256i" :kind 3 :detail "" :sortText "  \"." :filterText "_mm256_maskz_broadcastq_epi64" :insertText "_mm256_maskz_broadcastq_epi64(${1:__mmask8 __M}, ${2:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_broadcastq_epi64(${1:__mmask8 __M}, ${2:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "__j0l(long double) -> long double" :kind 3 :detail "" :sortText "  \"/" :filterText "__j0l" :insertText "__j0l(${1:long double})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__j0l(${1:long double})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_storeu2_m128d(double *__addr_hi, double *__addr_lo, __m256d __a) -> void" :kind 3 :detail "" :sortText "  \"0" :filterText "_mm256_storeu2_m128d" :insertText "_mm256_storeu2_m128d(${1:double *__addr_hi}, ${2:double *__addr_lo}, ${3:__m256d __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_storeu2_m128d(${1:double *__addr_hi}, ${2:double *__addr_lo}, ${3:__m256d __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_undefined_epi32() -> __m512i" :kind 3 :detail "" :sortText "  \"1" :filterText "_mm512_undefined_epi32" :insertText "_mm512_undefined_epi32()" :insertTextFormat 1 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_undefined_epi32()")
                  :additionalTextEdits
                  [])
              (:label "_mm512_mask2_permutex2var_ps(__m512 __A, __m512i __I, __mmask16 __U, __m512 __B) -> __m512" :kind 3 :detail "" :sortText "  \"2" :filterText "_mm512_mask2_permutex2var_ps" :insertText "_mm512_mask2_permutex2var_ps(${1:__m512 __A}, ${2:__m512i __I}, ${3:__mmask16 __U}, ${4:__m512 __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_mask2_permutex2var_ps(${1:__m512 __A}, ${2:__m512i __I}, ${3:__mmask16 __U}, ${4:__m512 __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_add_epi16(__m128i __W, __mmask8 __U, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  \"3" :filterText "_mm_mask_add_epi16" :insertText "_mm_mask_add_epi16(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_add_epi16(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128i __A}, ${4:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_conflict_epi64(__mmask8 __U, __m256i __A) -> __m256i" :kind 3 :detail "" :sortText "  \"4" :filterText "_mm256_maskz_conflict_epi64" :insertText "_mm256_maskz_conflict_epi64(${1:__mmask8 __U}, ${2:__m256i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_conflict_epi64(${1:__mmask8 __U}, ${2:__m256i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_maskz_shrdv_epi32(__mmask8 __U, __m128i __S, __m128i __A, __m128i __B) -> __m128i" :kind 3 :detail "" :sortText "  \"5" :filterText "_mm_maskz_shrdv_epi32" :insertText "_mm_maskz_shrdv_epi32(${1:__mmask8 __U}, ${2:__m128i __S}, ${3:__m128i __A}, ${4:__m128i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_maskz_shrdv_epi32(${1:__mmask8 __U}, ${2:__m128i __S}, ${3:__m128i __A}, ${4:__m128i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_maskz_adds_epu16(__mmask32 __U, __m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  \"6" :filterText "_mm512_maskz_adds_epu16" :insertText "_mm512_maskz_adds_epu16(${1:__mmask32 __U}, ${2:__m512i __A}, ${3:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_maskz_adds_epu16(${1:__mmask32 __U}, ${2:__m512i __A}, ${3:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "__log2f64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  \"7" :filterText "__log2f64x" :insertText "__log2f64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__log2f64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_cvtss_f32(__m256 __a) -> float" :kind 3 :detail "" :sortText "  \"8" :filterText "_mm256_cvtss_f32" :insertText "_mm256_cvtss_f32(${1:__m256 __a})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_cvtss_f32(${1:__m256 __a})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm512_adds_epi16(__m512i __A, __m512i __B) -> __m512i" :kind 3 :detail "" :sortText "  \"9" :filterText "_mm512_adds_epi16" :insertText "_mm512_adds_epi16(${1:__m512i __A}, ${2:__m512i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm512_adds_epi16(${1:__m512i __A}, ${2:__m512i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_conflict_epi64(__m256i __W, __mmask8 __U, __m256i __A) -> __m256i" :kind 3 :detail "" :sortText "  \":" :filterText "_mm256_mask_conflict_epi64" :insertText "_mm256_mask_conflict_epi64(${1:__m256i __W}, ${2:__mmask8 __U}, ${3:__m256i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_conflict_epi64(${1:__m256i __W}, ${2:__mmask8 __U}, ${3:__m256i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_cvtsepi32_epi8(__m128i __A) -> __m128i" :kind 3 :detail "" :sortText "  \";" :filterText "_mm_cvtsepi32_epi8" :insertText "_mm_cvtsepi32_epi8(${1:__m128i __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_cvtsepi32_epi8(${1:__m128i __A})$0")
                  :additionalTextEdits
                  [])
              (:label "sqrtf64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  \"<" :filterText "sqrtf64x" :insertText "sqrtf64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "sqrtf64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])
              (:label "significandl(long double __x) -> long double" :kind 3 :detail "" :sortText "  \"=" :filterText "significandl" :insertText "significandl(${1:long double __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "significandl(${1:long double __x})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_cvtps_ph(__m128i __W, __mmask8 __U, __m128 __A) -> __m128i" :kind 3 :detail "" :sortText "  \">" :filterText "_mm_mask_cvtps_ph" :insertText "_mm_mask_cvtps_ph(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128 __A})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_cvtps_ph(${1:__m128i __W}, ${2:__mmask8 __U}, ${3:__m128 __A})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_mask_add_epi16(__m256i __W, __mmask16 __U, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "  \"?" :filterText "_mm256_mask_add_epi16" :insertText "_mm256_mask_add_epi16(${1:__m256i __W}, ${2:__mmask16 __U}, ${3:__m256i __A}, ${4:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_mask_add_epi16(${1:__m256i __W}, ${2:__mmask16 __U}, ${3:__m256i __A}, ${4:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm256_maskz_dpbusd_epi32(__mmask8 __U, __m256i __S, __m256i __A, __m256i __B) -> __m256i" :kind 3 :detail "" :sortText "  \"@" :filterText "_mm256_maskz_dpbusd_epi32" :insertText "_mm256_maskz_dpbusd_epi32(${1:__mmask8 __U}, ${2:__m256i __S}, ${3:__m256i __A}, ${4:__m256i __B})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm256_maskz_dpbusd_epi32(${1:__mmask8 __U}, ${2:__m256i __S}, ${3:__m256i __A}, ${4:__m256i __B})$0")
                  :additionalTextEdits
                  [])
              (:label "_mm_mask_fnmadd_ps(__m128 __A, __mmask8 __U, __m128 __B, __m128 __C) -> __m128" :kind 3 :detail "" :sortText "  # " :filterText "_mm_mask_fnmadd_ps" :insertText "_mm_mask_fnmadd_ps(${1:__m128 __A}, ${2:__mmask8 __U}, ${3:__m128 __B}, ${4:__m128 __C})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "_mm_mask_fnmadd_ps(${1:__m128 __A}, ${2:__mmask8 __U}, ${3:__m128 __B}, ${4:__m128 __C})$0")
                  :additionalTextEdits
                  [])
              (:label "__sqrtf64x(_Float64x __x) -> _Float64x" :kind 3 :detail "" :sortText "  #!" :filterText "__sqrtf64x" :insertText "__sqrtf64x(${1:_Float64x __x})$0" :insertTextFormat 2 :textEdit
                  (:range
                   (:start
                    (:line 14 :character 8)
                    :end
                    (:line 14 :character 8))
                   :newText "__sqrtf64x(${1:_Float64x __x})$0")
                  :additionalTextEdits
                  [])]))
joaotavora commented 5 years ago

Right. But what was the key that pressed just before the completion request? If it's a character that is included triggerCharacters, it should report a triggerKind of 2, not 1.

amosnier commented 5 years ago

It is : actually, nothing magic, as far as I can judge. I just retried to make sure, and the huge completion list is displayed a fraction of a second after typing :.

joaotavora commented 5 years ago

Can you try a simpler example where you define a basic struct and access one of the fields with .? It should trigger another triggerKind

amosnier commented 5 years ago

Yes:

client-request (id:39) Sun Dec  2 18:31:21 2018:
(:jsonrpc "2.0" :id 39 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/main.cpp")
       :position
       (:line 13 :character 12)
       :context
       (:triggerKind 2 :triggerCharacter ".")))
joaotavora commented 5 years ago

What command do you have : bound to? Use C-h k to find out.

amosnier commented 5 years ago

It is bound to c-electric-colon. If I understand correctly, this is standard for c++-mode. Is that a problem?

joaotavora commented 5 years ago

Yes. Dang electric modes. They should be using post-self-insert-hook but the cc-mode developer has err, special privileges. Oh well I'll have to review the implementation. Thanks

joaotavora commented 5 years ago

After envisioning an implementation that needs about twice the lines (would need to hook onto pre-command-hook and post-self-insert-command-hook) just to handle this special case in c-mode I wonder what would happen if you were to bind : to self-insert-command in c-mode as it is in most modes:

(define-key c-mode-map (kbd ":") 'self-insert-command)

Do you lose any valuable functionality by doing this?

amosnier commented 5 years ago

I guess that would be:

(require 'cc-mode)
(define-key c-mode-base-map (kbd ":") 'self-insert-command)

It no longer crazy-code-completes, but it also no longer automatically indents the case statement, which is a bit sad. So electric colon has something positive too.

joaotavora commented 5 years ago

It no longer crazy-code-completes, but it also no longer automatically indents the case statement, which is a bit sad.

Oh alright, I'll do the more complicated fix.

So electric colon has something positive too.

You could try aggressive-indent-mode, too.

joaotavora commented 5 years ago

@amosnier can you try 444a8c3b3ec29eceeda26b72493a60c44a9bd951?

amosnier commented 5 years ago

With this eglot:

commit 444a8c3b3ec29eceeda26b72493a60c44a9bd951 (HEAD -> scratch/issue-173-robustify-fix, origin/scratch/issue-173-robustify-fix)
Author: João Távora <joaotavora@gmail.com>
Date:   Mon Dec 3 12:24:26 2018 +0000

    Per #173: robustify previous fix against non-standard insertion bindings

    * eglot.el (eglot--managed-mode): Manage post-self-insert-hook.
    (eglot--last-inserted-char): New variable.
    (eglot--post-self-insert-hook): Set it.
    (eglot--before-change): Reset it.
    (eglot--CompletionParams): Use it.

I still get:

client-request (id:46) Mon Dec  3 14:33:47 2018:
(:jsonrpc "2.0" :id 46 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/main.cpp")
       :position
       (:line 13 :character 8)
       :context
       (:triggerKind 1)))

And the completion list. I have double-checked that eglot--last-inserted-char is in my eglot.el to ensure that I did not do any git mistakes.

joaotavora commented 5 years ago

I suppose you also didn't forget to load the new eglot.el file...

In that case I'll debug this later: i didn't really test it.

amosnier commented 5 years ago

I have just performed a paranoid check restarting Emacs with just one eglot directory in my whole filesystem. I get the same behaviour (that eglot directory is a git checkout && git pull of your branch).

joaotavora commented 5 years ago

That's pretty paranoid, but have you tried leaving the building and coming in again? 🤣

don't worry It shouldn't be very hard.

amosnier commented 5 years ago

Just because I'm paranoid doesn't mean they aren't after me.

joaotavora commented 5 years ago

@amosnier I've double checked the fix and it looks mostly good, so I ask to you to try a very simple .c file with these contents:

struct bla {
  int ble;
};

int main (int argc, char* argv[]){
  struct bla foo;

  foo<type_a_dot_here>

    return 0;
}

Please type . after foo and watch the contents of the events buffer. Report the triggerKind that you are getting. Also count how many completion requests you are sending just for this . after foo. Now repeat the process with a case: statement. Post results here.

Earlier I said "mostly" because I have detected a bug in completions which may or may not be at the root of your breakage. It's actually a problem with company-mode, and I've proposed a fix for it here.

amosnier commented 5 years ago

@joaotavora Sorry if I'm slow but which commit do you mean I should test?

amosnier commented 5 years ago

Ah, you mean the same commit? Sorry I guess I misunderstood.

amosnier commented 5 years ago

I just realized that in my test from yesterday, I had not run cmake, so the compile_command.json was just a dead link. When I test again now with a freshly generated json file (with different versions of cmake and g++), eglot's event buffer ends with the following when I open main.cpp:

internal Tue Dec  4 09:43:58 2018:
(:message "Connection state changed" :change "segmentation fault (core dumped)\n")

----------b---y---e---b---y---e----------

I guess I'll test this evening at home in my usual environment.

mkcms commented 5 years ago

@joaotavora Looks like one of the last commits introduced a bug for me. When I complete f. I get the error below.

struct foo
{
    int bar;
};

int main()
{
    foo f;
    f.
}
Debugger entered--Lisp error: (wrong-type-argument characterp tab)
  char-equal(tab 46)
  cl--position(tab ["." ">" ":"] 0 nil nil)
  cl-position(tab ["." ">" ":"] :key #f(compiled-function (str) #<bytecode 0x13d3b3d>) :test char-equal)
  apply(cl-position tab ["." ">" ":"] (:key #f(compiled-function (str) #<bytecode 0x13d3b3d>) :test char-equal))
  cl-find(tab ["." ">" ":"] :key #f(compiled-function (str) #<bytecode 0x13d3b3d>) :test char-equal)
  eglot--CompletionParams()
  #f(compiled-function (ignored) #<bytecode 0xdf5e39>)("")
  #f(compiled-function (string pred action) #<bytecode 0xdf5e61>)("" nil t)
  all-completions("" #f(compiled-function (string pred action) #<bytecode 0xdf5e61>) nil)
  completion-pcm--all-completions("" (point) #f(compiled-function (string pred action) #<bytecode 0xdf5e61>) nil)
  completion-basic-all-completions("" #f(compiled-function (string pred action) #<bytecode 0xdf5e61>) nil 0)
  #f(compiled-function (style) #<bytecode 0x1884809>)(basic)
  completion--some(#f(compiled-function (style) #<bytecode 0x1884809>) (basic partial-completion emacs22))
  completion--nth-completion(2 "" #f(compiled-function (string pred action) #<bytecode 0xdf5e61>) nil 0 nil)
  completion-all-completions("" #f(compiled-function (string pred action) #<bytecode 0xdf5e61>) nil 0)
  company-capf(candidates "")
  apply(company-capf (candidates ""))
  company-call-backend-raw(candidates "")
  company--fetch-candidates("")
  company-calculate-candidates("")
  company--begin-new()
  company--perform()
  company-auto-begin()
  company-manual-begin()
  company-complete()
  funcall-interactively(company-complete)
  call-interactively(company-complete nil nil)
  command-execute(company-complete)
mkcms commented 5 years ago

Shouldn't we be using eglot--last-inserted-char in eglot--CompletionParams instead of last-input-event?

joaotavora commented 5 years ago

Shouldn't we be using eglot--last-inserted-char in eglot--CompletionParams instead of last-input-event?

Yes, of course. Fixed it. Also pay attention to https://github.com/company-mode/company-mode/pull/845, after which we should be able to simplify our eglot-completion-at-point

amosnier commented 5 years ago

@amosnier I've double checked the fix and it looks mostly good, so I ask to you to try a very simple .c file with these contents:

struct bla {
  int ble;
};

int main (int argc, char* argv[]){
  struct bla foo;

  foo<type_a_dot_here>

    return 0;
}

Please type . after foo and watch the contents of the events buffer. Report the triggerKind that you are getting. Also count how many completion requests you are sending just for this . after foo. Now repeat the process with a case: statement. Post results here.

After .:

client-request (id:2) Tue Dec  4 19:27:33 2018:
(:jsonrpc "2.0" :id 2 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/test.c")
       :position
       (:line 7 :character 6)
       :context
       (:triggerKind 2 :triggerCharacter ".")))

There is only one such request.

amosnier commented 5 years ago

@amosnier I've double checked the fix and it looks mostly good, so I ask to you to try a very simple .c file with these contents:

struct bla {
  int ble;
};

int main (int argc, char* argv[]){
  struct bla foo;

  foo<type_a_dot_here>

    return 0;
}

Please type . after foo and watch the contents of the events buffer. Report the triggerKind that you are getting. Also count how many completion requests you are sending just for this . after foo. Now repeat the process with a case: statement. Post results here.

After ::

client-request (id:26) Tue Dec  4 19:34:59 2018:
(:jsonrpc "2.0" :id 26 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/test.c")
       :position
       (:line 8 :character 7)
       :context
       (:triggerKind 1)))

and

client-request (id:36) Tue Dec  4 19:35:02 2018:
(:jsonrpc "2.0" :id 36 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///home/alain/custom/repos/tint/src/test.c")
       :position
       (:line 8 :character 9)
       :context
       (:triggerKind 1)))

This is for:

  switch (argc)  {
  case 1:

Line 8 is the switch line. And I still get the huge completion list.

amosnier commented 5 years ago

Now I think I have used the wrong version. Let me double check.

amosnier commented 5 years ago

I have now retried with the correct version, and the result is the same.

joaotavora commented 5 years ago

I can't reproduce these results. @mkcms can you?

@amosnier can you try this with a clean emacs -Q -L <path-to-eglot> run?

amosnier commented 5 years ago

@joaotavora I'm not sure what you mean. If I do that, my .emacs.d is ignored, right? How do I then start eglot? Just M-x eglot does not seem to work.

joaotavora commented 5 years ago

@joaotavora I'm not sure what you mean. If I do that, my .emacs.d is ignored, right? How do I then start eglot? Just M-x eglot does not seem to work.

Yes, in a difficult reproduction scenario, the idea is precisely to ignore your .emacs.d so that we can rule out interference from other factors. So to start eglot you can write some elisp into the *scratch* buffer like:

(package-initialize)
(package-install 'jsonrpc)
(add-to-list 'load-path "/path/to/eglot")
(require 'eglot)
;; M-x eglot should now work

Sometimes it's helpful to do this from the command-line in one step

$ path/to/emacs -Q -f package-initilize -f package-refresh-contents --eval '(package-install (quote jsonrpc))' -L /path/to/eglot -l eglot.el

After doing any of these alternatives, try the simple test I gave you again.

But maybe, before doing so, please do M-x list-load-path-shadows and post the result here.

mkcms commented 5 years ago

@amosnier @joaotavora In emacs -Q with company, with your recipe (completing switch (argc) { case 1:) I get the following request:


client-request (id:10) Tue Dec  4 23:04:28 2018:
(:jsonrpc "2.0" :id 10 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///tmp/file.cpp")
       :position
       (:line 2 :character 9)
       :context
       (:triggerKind 2 :triggerCharacter ":")))

in this file:

int main (int argc, char* argv[]){
  switch (argc) {
  case 1:
  };

  return 0;
}
mkcms commented 5 years ago

@joaotavora I also noticed that I get the same request (:triggerKind 2 and :triggerCharacter ":") when I manually complete with company-complete if last completion was caused by :. I think we should clear eglot--last-inserted-char somewhere, maybe in eglot-completion-at-point?

EDIT: Now I see that we clear it in before change function, but maybe we can also clear it after completion command.

joaotavora commented 5 years ago

EDIT: Now I see that we clear it in before change function, but maybe we can also clear it after completion command.

I think the correct place to fix it is in pre-command-hook' , otherwise the user can move around without changing the buffer after he inserted a.somewhere, then request a completion via some other mechanism. The request would be sent with the wrongtriggerKind`.

I've done this in 53bfdb7, can you test?

mkcms commented 5 years ago

@joaotavora That fixed the issue, thanks.

amosnier commented 5 years ago

@joaotavora

Now with 444a8c3b3ec29eceeda26b72493a60c44a9bd951 I do get:

client-request (id:6) Thu Dec  6 21:25:46 2018:
(:jsonrpc "2.0" :id 6 :method "textDocument/completion" :params
      (:textDocument
       (:uri "file:///tmp/test.c")
       :position
       (:line 2 :character 9)
       :context
       (:triggerKind 2 :triggerCharacter ":")))

To make a long story short, emacs-snapshot (27!) badly broke my Emacs dependencies. After a little fighting I decided to reinstall Xubuntu (fast procedure, I do it all the time...). Then I realized that Ubuntu 18.10 is still back on Emacs 25, so I installed 26.1 from source, which went great and fast. When I started Emacs with my version controlled .emacs.d, it complained that it could not find jsonrpc, which seems to imply that it is somehow included in Emacs27 but not in Emacs26. I then installed jsonrpc, and now the problem seems to be fixed.

Could Emacs 27 be the culprit? I guess that would be a little worrying.

When it comes to my use cases, I am not getting overly enthusiastic yet, I need to do some more testing. I see that 444a8c3b3ec29eceeda26b72493a60c44a9bd951 and 53bfdb7087b9b4a7c79abc3863c90b6d06ecca1f are merged to master. I will check out master for my testing.

Thanks again for your commitment.

joaotavora commented 5 years ago

@amosnier jsonrpc.el is indeed not included in Emacs 26.1 by default, but is easy to install. But you only need to do it manually if you want to try eglot.el from git. If you install it from GNU ELPA or MELPA, which is what most people do, you needn't even worry about that.

I would very much doubt that Emacs 27 is the culprit. You had some version mismatch (did you try the Emacs -Q thing I suggested? Even if you didn't keep it for reference for a future bug report)

I will be closing this issue for now, and thank you for all the testing.

amosnier commented 5 years ago

@joaotavora after downgrading to 26.1, still using the same .emacs.d which is entirely under revision control, I realized that I could not run eglot because jsonrpc was not there. Of course, when I realized that, I simply installed it from MELPA. I do understand why you installed jsonrpc from the command line when you invoked emacs -Q.

The only reason I mentioned jsonrpc is because it is one of the few differences between a setup that did not work and a setup that works. In particular, as mentioned, my .emacs.d is unchanged, with the exception of necessary changes (jsonrpc, and (package-initialize), which is no longer necessary in Emacs 27).

I did test with emacs -Q in my earlier setup. eglot was talking to ccls, but there was then no completion request at all after pressing :! This is when I decided that Emacs 27 maybe somehow was involved in my issues.

But your are probably right: the issue is more likely the particular package I was using (an emacs-snaphot PPA package), rather than Emacs 27 in itself. I was too far on the edge I suppose. But Emacs 26.1 seems to work fine for me now. Thanks again, and sorry I used so much of your time.