Skip to content

Using goto definition in a .vue file makes multiple calls #4112

Open
@catgoose

Description

@catgoose

My lspconfig: https://github.com/catgoose/nvim/blob/4a81fde7ff8ee086416e5c06121e41c182bb7e19/lua/plugins/lspconfig.lua#L152-L171

In neovim (and other IDE I would assume) when calling vim.lsp.buf.definition on a symbol in a .vue file that is imported from a typescript file results in calls being made from both tsserver and the @vue/typescript-plugin LSP

For example:

<script setup lang="ts">
import { useCounterStore } from './stores/counter'

const store = useCounterStore()
</script>
<template>
  <div></div>
</template>

When calling vim.lsp.buf.definition on useCounterStore and overriding the on_list functionality:

vim.lsp.buf.definition({on_list = function(list) vim.print(list) end})

results in the following tables being printed:

{
  items = { {
      col = 5,
      filename = "/home/cg/src/vue/lsp-testing/node_modules/pinia/dist/pinia.d.ts",
      lnum = 639,
      text = "    (pinia?: Pinia | null | undefined, hot?: StoreGeneric): Store<Id, S, G, A>;\r",
      user_data = {
        originSelectionRange = {
          ["end"] = {
            character = 29,
            line = 3
          },
          start = {
            character = 14,
            line = 3
          }
        },
        targetRange = {
          ["end"] = {
            character = 79,
            line = 638
          },
          start = {
            character = 4,
            line = 638
          }
        },
        targetSelectionRange = {
          ["end"] = {
            character = 79,
            line = 638
          },
          start = {
            character = 4,
            line = 638
          }
        },
        targetUri = "file:///home/cg/src/vue/lsp-testing/node_modules/pinia/dist/pinia.d.ts"
      }
    }, {
      col = 14,
      filename = "/home/cg/src/vue/lsp-testing/src/stores/counter.ts",
      lnum = 4,
      text = "export const useCounterStore = defineStore('counter', () => {",
      user_data = {
        originSelectionRange = {
        originSelectionRange = {
          ["end"] = {
            character = 29,
            line = 3
          },
          start = {
            character = 14,
            line = 3
          }
        },
        targetRange = {
          ["end"] = {
            character = 2,
            line = 11
          },
          start = {
            character = 0,
            line = 3
          }
        },
        targetSelectionRange = {
          ["end"] = {
            character = 28,
            line = 3
          },
          start = {
            character = 13,
            line = 3
          }
        },
        targetUri = "file:///home/cg/src/vue/lsp-testing/src/stores/counter.ts"
      }
    } },
  title = "LSP locations"
}

{
  items = { {
      col = 10,
      filename = "/home/cg/src/vue/lsp-testing/src/App.vue",
      lnum = 2,
      text = "import { useCounterStore } from './stores/counter'",
      user_data = {
        range = {
          ["end"] = {
            character = 24,
            line = 1
          },
          start = {
            character = 9,
            line = 1
          }
        },
        uri = "file:///home/cg/src/vue/lsp-testing/src/App.vue"
      }
    } },
  title = "LSP locations"
}

I believe the first table is from tsserver while the second is from @vue/typescript-plugin.

Also if you run

:lua vim.lsp.buf.definition({on_list = function(list) vim.print(list) end})

the resultant output is:

called
called

If we were still using takeover mode, this would not be an issue, but would it even be possible to disable tsserver goto definition in .vue files and still be able to use @vue/typescript-plugin?

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions