cssMode.ts 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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 { CSSWorker } from './cssWorker';
  7. import { LanguageServiceDefaults } from './monaco.contribution';
  8. import * as languageFeatures from './languageFeatures';
  9. import { Uri, IDisposable, languages } from '../fillers/monaco-editor-core';
  10. export function setupMode(defaults: LanguageServiceDefaults): IDisposable {
  11. const disposables: IDisposable[] = [];
  12. const providers: IDisposable[] = [];
  13. const client = new WorkerManager(defaults);
  14. disposables.push(client);
  15. const worker: languageFeatures.WorkerAccessor = (...uris: Uri[]): Promise<CSSWorker> => {
  16. return client.getLanguageServiceWorker(...uris);
  17. };
  18. function registerProviders(): void {
  19. const { languageId, modeConfiguration } = defaults;
  20. disposeAll(providers);
  21. if (modeConfiguration.completionItems) {
  22. providers.push(
  23. languages.registerCompletionItemProvider(
  24. languageId,
  25. new languageFeatures.CSSCompletionAdapter(worker)
  26. )
  27. );
  28. }
  29. if (modeConfiguration.hovers) {
  30. providers.push(
  31. languages.registerHoverProvider(languageId, new languageFeatures.CSSHoverAdapter(worker))
  32. );
  33. }
  34. if (modeConfiguration.documentHighlights) {
  35. providers.push(
  36. languages.registerDocumentHighlightProvider(
  37. languageId,
  38. new languageFeatures.CSSDocumentHighlightAdapter(worker)
  39. )
  40. );
  41. }
  42. if (modeConfiguration.definitions) {
  43. providers.push(
  44. languages.registerDefinitionProvider(
  45. languageId,
  46. new languageFeatures.CSSDefinitionAdapter(worker)
  47. )
  48. );
  49. }
  50. if (modeConfiguration.references) {
  51. providers.push(
  52. languages.registerReferenceProvider(
  53. languageId,
  54. new languageFeatures.CSSReferenceAdapter(worker)
  55. )
  56. );
  57. }
  58. if (modeConfiguration.documentSymbols) {
  59. providers.push(
  60. languages.registerDocumentSymbolProvider(
  61. languageId,
  62. new languageFeatures.DocumentSymbolAdapter(worker)
  63. )
  64. );
  65. }
  66. if (modeConfiguration.rename) {
  67. providers.push(
  68. languages.registerRenameProvider(languageId, new languageFeatures.CSSRenameAdapter(worker))
  69. );
  70. }
  71. if (modeConfiguration.colors) {
  72. providers.push(
  73. languages.registerColorProvider(
  74. languageId,
  75. new languageFeatures.DocumentColorAdapter(worker)
  76. )
  77. );
  78. }
  79. if (modeConfiguration.foldingRanges) {
  80. providers.push(
  81. languages.registerFoldingRangeProvider(
  82. languageId,
  83. new languageFeatures.FoldingRangeAdapter(worker)
  84. )
  85. );
  86. }
  87. if (modeConfiguration.diagnostics) {
  88. providers.push(new languageFeatures.CSSDiagnosticsAdapter(languageId, worker, defaults));
  89. }
  90. if (modeConfiguration.selectionRanges) {
  91. providers.push(
  92. languages.registerSelectionRangeProvider(
  93. languageId,
  94. new languageFeatures.SelectionRangeAdapter(worker)
  95. )
  96. );
  97. }
  98. }
  99. registerProviders();
  100. disposables.push(asDisposable(providers));
  101. return asDisposable(disposables);
  102. }
  103. function asDisposable(disposables: IDisposable[]): IDisposable {
  104. return { dispose: () => disposeAll(disposables) };
  105. }
  106. function disposeAll(disposables: IDisposable[]) {
  107. while (disposables.length) {
  108. disposables.pop().dispose();
  109. }
  110. }