4de4a050d9a8ebf6a4f032dc82fd24127b2f6b741a50e89a76012a98c86f0384247b626da368808fb9b9f43e7abdb070f74c04dff9c0d76d18f339b3d8700a 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 { CancellationToken } from '../../../../base/common/cancellation.js';
  6. import { illegalArgument } from '../../../../base/common/errors.js';
  7. import { URI } from '../../../../base/common/uri.js';
  8. import { Range } from '../../../common/core/range.js';
  9. import { IModelService } from '../../../common/services/model.js';
  10. import { CommandsRegistry } from '../../../../platform/commands/common/commands.js';
  11. import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';
  12. export function getColors(registry, model, token) {
  13. const colors = [];
  14. const providers = registry.ordered(model).reverse();
  15. const promises = providers.map(provider => Promise.resolve(provider.provideDocumentColors(model, token)).then(result => {
  16. if (Array.isArray(result)) {
  17. for (const colorInfo of result) {
  18. colors.push({ colorInfo, provider });
  19. }
  20. }
  21. }));
  22. return Promise.all(promises).then(() => colors);
  23. }
  24. export function getColorPresentations(model, colorInfo, provider, token) {
  25. return Promise.resolve(provider.provideColorPresentations(model, colorInfo, token));
  26. }
  27. CommandsRegistry.registerCommand('_executeDocumentColorProvider', function (accessor, ...args) {
  28. const [resource] = args;
  29. if (!(resource instanceof URI)) {
  30. throw illegalArgument();
  31. }
  32. const { colorProvider: colorProviderRegistry } = accessor.get(ILanguageFeaturesService);
  33. const model = accessor.get(IModelService).getModel(resource);
  34. if (!model) {
  35. throw illegalArgument();
  36. }
  37. const rawCIs = [];
  38. const providers = colorProviderRegistry.ordered(model).reverse();
  39. const promises = providers.map(provider => Promise.resolve(provider.provideDocumentColors(model, CancellationToken.None)).then(result => {
  40. if (Array.isArray(result)) {
  41. for (const ci of result) {
  42. rawCIs.push({ range: ci.range, color: [ci.color.red, ci.color.green, ci.color.blue, ci.color.alpha] });
  43. }
  44. }
  45. }));
  46. return Promise.all(promises).then(() => rawCIs);
  47. });
  48. CommandsRegistry.registerCommand('_executeColorPresentationProvider', function (accessor, ...args) {
  49. const [color, context] = args;
  50. const { uri, range } = context;
  51. if (!(uri instanceof URI) || !Array.isArray(color) || color.length !== 4 || !Range.isIRange(range)) {
  52. throw illegalArgument();
  53. }
  54. const [red, green, blue, alpha] = color;
  55. const { colorProvider: colorProviderRegistry } = accessor.get(ILanguageFeaturesService);
  56. const model = accessor.get(IModelService).getModel(uri);
  57. if (!model) {
  58. throw illegalArgument();
  59. }
  60. const colorInfo = {
  61. range,
  62. color: { red, green, blue, alpha }
  63. };
  64. const presentations = [];
  65. const providers = colorProviderRegistry.ordered(model).reverse();
  66. const promises = providers.map(provider => Promise.resolve(provider.provideColorPresentations(model, colorInfo, CancellationToken.None)).then(result => {
  67. if (Array.isArray(result)) {
  68. presentations.push(...result);
  69. }
  70. }));
  71. return Promise.all(promises).then(() => presentations);
  72. });