jsonMode.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. /*---------------------------------------------------------------------------------------------
  2. * Copyright (c) Microsoft Corporation. All rights reserved.
  3. * Licensed under the MIT License. See License.txt in the project root for license information.
  4. *--------------------------------------------------------------------------------------------*/
  5. import { WorkerManager } from './workerManager';
  6. import type { JSONWorker } from './jsonWorker';
  7. import { LanguageServiceDefaults } from './monaco.contribution';
  8. import * as languageFeatures from './languageFeatures';
  9. import { createTokenizationSupport } from './tokenization';
  10. import { Uri, IDisposable, languages } from '../fillers/monaco-editor-core';
  11. export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
  12. const disposables: IDisposable[] = [];
  13. const providers: IDisposable[] = [];
  14. const client = new WorkerManager(defaults);
  15. disposables.push(client);
  16. const worker: languageFeatures.WorkerAccessor = (...uris: Uri[]): Promise<JSONWorker> => {
  17. return client.getLanguageServiceWorker(...uris);
  18. };
  19. function registerProviders(): void {
  20. const { languageId, modeConfiguration } = defaults;
  21. disposeAll(providers);
  22. if (modeConfiguration.documentFormattingEdits) {
  23. providers.push(
  24. languages.registerDocumentFormattingEditProvider(
  25. languageId,
  26. new languageFeatures.DocumentFormattingEditProvider(worker)
  27. )
  28. );
  29. }
  30. if (modeConfiguration.documentRangeFormattingEdits) {
  31. providers.push(
  32. languages.registerDocumentRangeFormattingEditProvider(
  33. languageId,
  34. new languageFeatures.DocumentRangeFormattingEditProvider(worker)
  35. )
  36. );
  37. }
  38. if (modeConfiguration.completionItems) {
  39. providers.push(
  40. languages.registerCompletionItemProvider(
  41. languageId,
  42. new languageFeatures.CompletionAdapter(worker)
  43. )
  44. );
  45. }
  46. if (modeConfiguration.hovers) {
  47. providers.push(
  48. languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))
  49. );
  50. }
  51. if (modeConfiguration.documentSymbols) {
  52. providers.push(
  53. languages.registerDocumentSymbolProvider(
  54. languageId,
  55. new languageFeatures.DocumentSymbolAdapter(worker)
  56. )
  57. );
  58. }
  59. if (modeConfiguration.tokens) {
  60. providers.push(languages.setTokensProvider(languageId, createTokenizationSupport(true)));
  61. }
  62. if (modeConfiguration.colors) {
  63. providers.push(
  64. languages.registerColorProvider(
  65. languageId,
  66. new languageFeatures.DocumentColorAdapter(worker)
  67. )
  68. );
  69. }
  70. if (modeConfiguration.foldingRanges) {
  71. providers.push(
  72. languages.registerFoldingRangeProvider(
  73. languageId,
  74. new languageFeatures.FoldingRangeAdapter(worker)
  75. )
  76. );
  77. }
  78. if (modeConfiguration.diagnostics) {
  79. providers.push(new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults));
  80. }
  81. if (modeConfiguration.selectionRanges) {
  82. providers.push(
  83. languages.registerSelectionRangeProvider(
  84. languageId,
  85. new languageFeatures.SelectionRangeAdapter(worker)
  86. )
  87. );
  88. }
  89. }
  90. registerProviders();
  91. disposables.push(languages.setLanguageConfiguration(defaults.languageId, richEditConfiguration));
  92. let modeConfiguration = defaults.modeConfiguration;
  93. defaults.onDidChange((newDefaults) => {
  94. if (newDefaults.modeConfiguration !== modeConfiguration) {
  95. modeConfiguration = newDefaults.modeConfiguration;
  96. registerProviders();
  97. }
  98. });
  99. disposables.push(asDisposable(providers));
  100. return asDisposable(disposables);
  101. }
  102. function asDisposable(disposables: IDisposable[]): IDisposable {
  103. return { dispose: () => disposeAll(disposables) };
  104. }
  105. function disposeAll(disposables: IDisposable[]) {
  106. while (disposables.length) {
  107. disposables.pop()!.dispose();
  108. }
  109. }
  110. const richEditConfiguration: languages.LanguageConfiguration = {
  111. wordPattern: /(-?\d*\.\d\w*)|([^\[\{\]\}\:\"\,\s]+)/g,
  112. comments: {
  113. lineComment: '//',
  114. blockComment: ['/*', '*/']
  115. },
  116. brackets: [
  117. ['{', '}'],
  118. ['[', ']']
  119. ],
  120. autoClosingPairs: [
  121. { open: '{', close: '}', notIn: ['string'] },
  122. { open: '[', close: ']', notIn: ['string'] },
  123. { open: '"', close: '"', notIn: ['string'] }
  124. ]
  125. };