Я никогда раньше не использовал этот языковой сервер, но я использовал Python, который Qt использует в их примере . Я подумал, что посмотрю, работает ли он на моей машине.
Я использую следующий Qt Creator:
Qt Creator 4.10.0
Based on Qt 5.13.1 (GCC 5.3.1 20160406 (Red Hat 5.3.1-6), 64 bit)
Built on Sep 4 2019 04:47:37
From revision 9b7bab7d35
И я установил плагин, используя эти инструкции :
npm install --save vscode-json-languageservice
Служба python, которую они используют в примере, взаимодействует через stdio, поэтому я попытался использовать ее вместо этого, например:
*.json,
startup behaviour: "Requires an Open File"
Executable: /usr/bin/node
Arguments: /home/netherda/node_modules/vscode-json-languageserver --stdio
Когда я попробовал это локально,появился что-то сделать. К сожалению, что-то должно было вызвать ошибку инициализации:
Cannot read property 'provideFormatter' of undefined
Я не уверен, что виноват сервер или qt-creator (или сочетание обоих), но это, кажется, вызвано qt-создатель не предоставил никаких параметров инициализации и серверный код, предполагая, что они будут там.
Я придумал локальное исправление, которое должно проверять, существуют ли варианты инициализации, прежде чем пытаться их использовать, и, похоже, это работает. Я собираюсь открыть запрос на получение vscode для предлагаемого исправления.
В то же время, если вы видите ту же проблему и с удовольствием используете мою идею, вы можетередактировать 2 строки connection.onInitialize ((params) => callback внутри jsonServerMain. (js / ts) (В версии, предоставленной моим менеджером пакетов, это js, но похоже, чтоизменено на ts в последней , проблема, кажется, существует, какую бы версию вы ни использовали ...)
например, на моей машине это: node_modules / vscode-json-languageserver / out / jsonServerMain.js
Я изменил:
dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && (typeof params.initializationOptions.provideFormatter !== 'boolean');
на
dynamicFormatterRegistration = getClientCapability('textDocument.rangeFormatting.dynamicRegistration', false) && ((params.initializationOptions) && typeof params.initializationOptions.provideFormatter !== 'boolean');
и в объекте возможностей def я изменил:
documentRangeFormattingProvider: params.initializationOptions.provideFormatter === true
должно быть
documentRangeFormattingProvider: (params.initializationOptions) ? params.initializationOptions.provideFormatter === true : false
Вы можете сказать, что оно работает, если заполнено поле возможностей. (Попробуйте изменить поведение при запуске на «Всегда включено» во время тестирования):