LSP
LSP copied to clipboard
Issue with completions that start with $
Quick bug report as I don't have time to analyze now:

Completing the first four items that start with '$' doesn't insert completion but just closes and re-opens the completion popup.
:: --> lsp-typescript textDocument/completion(44): {'position': {'character': 22, 'line': 171}, 'textDocument': {'uri': 'file:///test/browser.test.js'}}
:: <<< lsp-typescript 44: [{'sortText': '6', 'label': '__dirname', 'data': {'entryNames': ['__dirname'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['$'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': '$', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['$$'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': '$$', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['$$eval'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': '$$eval', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['$eval'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': '$eval', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': '$nuxt', 'data': {'entryNames': ['$nuxt'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': '$route', 'data': {'entryNames': ['$route'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': '$router', 'data': {'entryNames': ['$router'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'about', 'data': {'entryNames': ['about'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'aboutFrLink', 'data': {'entryNames': ['aboutFrLink'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'aboutLink', 'data': {'entryNames': ['aboutLink'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'label': 'accessibility', 'data': {'entryNames': ['accessibility'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'commitCharacters': ['.', ',', '('], 'kind': 5}, {'sortText': '0', 'data': {'entryNames': ['addInitScript'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'addInitScript', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['addListener'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'addListener', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['addScriptTag'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'addScriptTag', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['addStyleTag'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'addStyleTag', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'afterAll', 'data': {'entryNames': ['afterAll'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'alwaysRedirect', 'data': {'entryNames': ['alwaysRedirect'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'beforeAll', 'data': {'entryNames': ['beforeAll'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'browser', 'data': {'entryNames': ['browser'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'BROWSER_STRING', 'data': {'entryNames': ['BROWSER_STRING'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'browserString', 'data': {'entryNames': ['browserString'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['check'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'check', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'chromium', 'data': {'entryNames': ['chromium'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'ChromiumBrowser', 'data': {'entryNames': ['ChromiumBrowser'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['click'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'click', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['close'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'close', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'code', 'data': {'entryNames': ['code'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['content'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'content', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['context'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'context', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'label': 'coverage', 'data': {'entryNames': ['coverage'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'commitCharacters': ['.', ',', '('], 'kind': 5}, {'sortText': '6', 'label': 'createBrowser', 'data': {'entryNames': ['createBrowser'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['dblclick'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'dblclick', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'defaultLocale', 'data': {'entryNames': ['defaultLocale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'describe', 'data': {'entryNames': ['describe'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'destroy', 'data': {'entryNames': ['destroy'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'detectBrowserLanguage', 'data': {'entryNames': ['detectBrowserLanguage'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'dir', 'data': {'entryNames': ['dir'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['dispatchEvent'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'dispatchEvent', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'distDir', 'data': {'entryNames': ['distDir'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['emulateMedia'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'emulateMedia', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'env', 'data': {'entryNames': ['env'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['evaluate'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'evaluate', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['evaluateHandle'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'evaluateHandle', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'expect', 'data': {'entryNames': ['expect'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['exposeFunction'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'exposeFunction', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'fallbackLocale', 'data': {'entryNames': ['fallbackLocale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['fill'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'fill', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['focus'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'focus', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['frame'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'frame', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['frames'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'frames', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'fullPath', 'data': {'entryNames': ['fullPath'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'generate', 'data': {'entryNames': ['generate'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'getRouteFullPath', 'data': {'entryNames': ['getRouteFullPath'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'getTestData', 'data': {'entryNames': ['getTestData'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'getUrl', 'data': {'entryNames': ['getUrl'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['goBack'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'goBack', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['goForward'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'goForward', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['goto'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'goto', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'home', 'data': {'entryNames': ['home'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['hover'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'hover', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'i18n', 'data': {'entryNames': ['i18n'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['isClosed'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'isClosed', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'iso', 'data': {'entryNames': ['iso'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'JSON', 'data': {'entryNames': ['JSON'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'label': 'keyboard', 'data': {'entryNames': ['keyboard'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'commitCharacters': ['.', ',', '('], 'kind': 5}, {'sortText': '6', 'label': 'languageSwitchedListeners', 'data': {'entryNames': ['languageSwitchedListeners'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'launch', 'data': {'entryNames': ['launch'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'loadConfig', 'data': {'entryNames': ['loadConfig'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'localConfig', 'data': {'entryNames': ['localConfig'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'locale', 'data': {'entryNames': ['locale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'locales', 'data': {'entryNames': ['locales'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['mainFrame'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'mainFrame', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'merge', 'data': {'entryNames': ['merge'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'messages', 'data': {'entryNames': ['messages'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'mode', 'data': {'entryNames': ['mode'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'label': 'mouse', 'data': {'entryNames': ['mouse'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'commitCharacters': ['.', ',', '('], 'kind': 5}, {'sortText': '6', 'label': 'name', 'data': {'entryNames': ['name'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'navigate', 'data': {'entryNames': ['navigate'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'newLocale', 'data': {'entryNames': ['newLocale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'newPage', 'data': {'entryNames': ['newPage'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'no', 'data': {'entryNames': ['no'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'nuxt', 'data': {'entryNames': ['nuxt'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'oldLocale', 'data': {'entryNames': ['oldLocale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['on'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'on', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['once'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'once', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['opener'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'opener', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'overrides', 'data': {'entryNames': ['overrides'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'page', 'data': {'entryNames': ['page'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'Page', 'data': {'entryNames': ['Page'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'page2', 'data': {'entryNames': ['page2'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'parse', 'data': {'entryNames': ['parse'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'path', 'data': {'entryNames': ['path'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['pdf'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'pdf', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'pl', 'data': {'entryNames': ['pl'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'plugins', 'data': {'entryNames': ['plugins'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'posts', 'data': {'entryNames': ['posts'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['press'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'press', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'process', 'data': {'entryNames': ['process'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'Promise', 'data': {'entryNames': ['Promise'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'push', 'data': {'entryNames': ['push'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'reject', 'data': {'entryNames': ['reject'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['reload'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'reload', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'resolve', 'data': {'entryNames': ['resolve'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['route'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'route', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'router', 'data': {'entryNames': ['router'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['screenshot'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'screenshot', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['selectOption'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'selectOption', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'server', 'data': {'entryNames': ['server'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['setContent'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setContent', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['setDefaultNavigationTimeout'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setDefaultNavigationTimeout', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['setDefaultTimeout'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setDefaultTimeout', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['setExtraHTTPHeaders'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setExtraHTTPHeaders', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['setInputFiles'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setInputFiles', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'setTimeout', 'data': {'entryNames': ['setTimeout'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'setup', 'data': {'entryNames': ['setup'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['setViewportSize'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'setViewportSize', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'startHttpServer', 'data': {'entryNames': ['startHttpServer'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'storeLocale', 'data': {'entryNames': ['storeLocale'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'strategy', 'data': {'entryNames': ['strategy'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'test', 'data': {'entryNames': ['test'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'testData', 'data': {'entryNames': ['testData'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'textContent', 'data': {'entryNames': ['textContent'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['title'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'title', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'toBe', 'data': {'entryNames': ['toBe'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'toBeDefined', 'data': {'entryNames': ['toBeDefined'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'toContain', 'data': {'entryNames': ['toContain'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'toEqual', 'data': {'entryNames': ['toEqual'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'toMatchObject', 'data': {'entryNames': ['toMatchObject'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['type'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'type', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['uncheck'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'uncheck', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['unroute'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'unroute', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['url'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'url', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'useCookie', 'data': {'entryNames': ['useCookie'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['viewportSize'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'viewportSize', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'vueI18n', 'data': {'entryNames': ['vueI18n'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '6', 'label': 'vuex', 'data': {'entryNames': ['vuex'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['waitForEvent'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForEvent', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForFunction'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForFunction', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForLoadState'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForLoadState', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForNavigation'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForNavigation', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForRequest'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForRequest', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForResponse'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForResponse', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForSelector'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForSelector', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '0', 'data': {'entryNames': ['waitForTimeout'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'waitForTimeout', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}, {'sortText': '6', 'label': 'window', 'data': {'entryNames': ['window'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'kind': 17}, {'sortText': '0', 'data': {'entryNames': ['workers'], 'file': '/test/browser.test.js', 'offset': 23, 'line': 172}, 'label': 'workers', 'insertTextFormat': 2, 'commitCharacters': ['.', ',', '('], 'kind': 2}]
First four completions pretty printed:
[
{
"sortText": "6",
"label": "__dirname",
"data": {
"entryNames": [
"__dirname"
],
"file": "/test/browser.test.js",
"offset": 23,
"line": 172
},
"kind": 17
},
{
"sortText": "0",
"data": {
"entryNames": [
"$"
],
"file": "/test/browser.test.js",
"offset": 23,
"line": 172
},
"label": "$",
"insertTextFormat": 2,
"commitCharacters": [
".",
",",
"("
],
"kind": 2
},
{
"sortText": "0",
"data": {
"entryNames": [
"$$"
],
"file": "/test/browser.test.js",
"offset": 23,
"line": 172
},
"label": "$$",
"insertTextFormat": 2,
"commitCharacters": [
".",
",",
"("
],
"kind": 2
},
{
"sortText": "0",
"data": {
"entryNames": [
"$$eval"
],
"file": "/test/browser.test.js",
"offset": 23,
"line": 172
},
"label": "$$eval",
"insertTextFormat": 2,
"commitCharacters": [
".",
",",
"("
],
"kind": 2
},
]
If the intention is to insert a literal $ or a literal $$, then the "insertTextFormat" should be 1 (plaintext), not 2 (snippet). Alternatively, the typescript language server can keep using "insertTextFormat": 2, but then it should escape the dollar signs according to the TextMate snippet grammar: \$
I suppose this is the server's bug then but I wonder if the interpretation of snippets is different in different clients.
Since the spec says that the placeholders are in a format like $0, $1, ${2:foo}, and those completions don't precisely match that placeholder format, maybe those are only problematic due to how ST handles snippets?
I guess so?
Seems like there just hasn't been put much thought into it:
https://github.com/theia-ide/typescript-language-server/blob/101dae4f7b598e9bafcaa8c316f21e57341e6350/server/src/completion.ts#L43-L45
I'm slowly changing my mind :) https://github.com/sublimehq/sublime_text/issues/3608
I've been looking at documentation the other day and saw:
Since snippets can contain variables, which start with a $, literal $ characters must be written as $. http://www.sublimetext.com/docs/completions.html#snippet_escaping
And there are also those variables supported: http://www.sublimetext.com/docs/completions.html#snippet_variables
So it's a bit more tricky.
> A: Needs to be clarified. The escaping is done using \. So to insert $1 the string has to look like this \\$1
> B: Two backslashes?
> A: Sorry, one backslash. The example is a JavaScript string where you need two backslashes to produce a string.
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#snippet_syntax https://github.com/microsoft/language-server-protocol/issues/232#issuecomment-302059907 https://github.com/microsoft/language-server-protocol/issues/220#issuecomment-302105262
EDIT: I think that this needs to be addressed on the server. ST already supports this:
Since snippets can contain variables, which start with a $, literal $ characters must be written as \$.
http://www.sublimetext.com/docs/completions.html#escaping
From what I remember, it's tricky to address it in the server as a non-snippet completion can become a snippet completion after completion is resolved. But we have to decide the completion type before resolving.
That said, I agree that this is not an LSP bug so resolving.
It was resolved in https://github.com/typescript-language-server/typescript-language-server/commit/7f69c27eb8cce71d3db006623757a74f93d76dd3