9cc4b678d6c340962c6ec08bd29ecd8221565c57e7b3b9e1c9521b15571ad04f89d4eb48096dd4e25f54441e950e67fc92e565d6f0b7b6e656f2de6f2de8bd 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  6. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  7. return new (P || (P = Promise))(function (resolve, reject) {
  8. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  9. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  10. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  11. step((generator = generator.apply(thisArg, _arguments || [])).next());
  12. });
  13. };
  14. import { CancellationToken } from '../../../../base/common/cancellation.js';
  15. import { onUnexpectedExternalError } from '../../../../base/common/errors.js';
  16. import { registerModelAndPositionCommand } from '../../../browser/editorExtensions.js';
  17. import { ReferencesModel } from './referencesModel.js';
  18. import { ILanguageFeaturesService } from '../../../common/services/languageFeatures.js';
  19. function getLocationLinks(model, position, registry, provide) {
  20. const provider = registry.ordered(model);
  21. // get results
  22. const promises = provider.map((provider) => {
  23. return Promise.resolve(provide(provider, model, position)).then(undefined, err => {
  24. onUnexpectedExternalError(err);
  25. return undefined;
  26. });
  27. });
  28. return Promise.all(promises).then(values => {
  29. const result = [];
  30. for (const value of values) {
  31. if (Array.isArray(value)) {
  32. result.push(...value);
  33. }
  34. else if (value) {
  35. result.push(value);
  36. }
  37. }
  38. return result;
  39. });
  40. }
  41. export function getDefinitionsAtPosition(registry, model, position, token) {
  42. return getLocationLinks(model, position, registry, (provider, model, position) => {
  43. return provider.provideDefinition(model, position, token);
  44. });
  45. }
  46. export function getDeclarationsAtPosition(registry, model, position, token) {
  47. return getLocationLinks(model, position, registry, (provider, model, position) => {
  48. return provider.provideDeclaration(model, position, token);
  49. });
  50. }
  51. export function getImplementationsAtPosition(registry, model, position, token) {
  52. return getLocationLinks(model, position, registry, (provider, model, position) => {
  53. return provider.provideImplementation(model, position, token);
  54. });
  55. }
  56. export function getTypeDefinitionsAtPosition(registry, model, position, token) {
  57. return getLocationLinks(model, position, registry, (provider, model, position) => {
  58. return provider.provideTypeDefinition(model, position, token);
  59. });
  60. }
  61. export function getReferencesAtPosition(registry, model, position, compact, token) {
  62. return getLocationLinks(model, position, registry, (provider, model, position) => __awaiter(this, void 0, void 0, function* () {
  63. const result = yield provider.provideReferences(model, position, { includeDeclaration: true }, token);
  64. if (!compact || !result || result.length !== 2) {
  65. return result;
  66. }
  67. const resultWithoutDeclaration = yield provider.provideReferences(model, position, { includeDeclaration: false }, token);
  68. if (resultWithoutDeclaration && resultWithoutDeclaration.length === 1) {
  69. return resultWithoutDeclaration;
  70. }
  71. return result;
  72. }));
  73. }
  74. // -- API commands ----
  75. function _sortedAndDeduped(callback) {
  76. return __awaiter(this, void 0, void 0, function* () {
  77. const rawLinks = yield callback();
  78. const model = new ReferencesModel(rawLinks, '');
  79. const modelLinks = model.references.map(ref => ref.link);
  80. model.dispose();
  81. return modelLinks;
  82. });
  83. }
  84. registerModelAndPositionCommand('_executeDefinitionProvider', (accessor, model, position) => {
  85. const languageFeaturesService = accessor.get(ILanguageFeaturesService);
  86. const promise = getDefinitionsAtPosition(languageFeaturesService.definitionProvider, model, position, CancellationToken.None);
  87. return _sortedAndDeduped(() => promise);
  88. });
  89. registerModelAndPositionCommand('_executeTypeDefinitionProvider', (accessor, model, position) => {
  90. const languageFeaturesService = accessor.get(ILanguageFeaturesService);
  91. const promise = getTypeDefinitionsAtPosition(languageFeaturesService.typeDefinitionProvider, model, position, CancellationToken.None);
  92. return _sortedAndDeduped(() => promise);
  93. });
  94. registerModelAndPositionCommand('_executeDeclarationProvider', (accessor, model, position) => {
  95. const languageFeaturesService = accessor.get(ILanguageFeaturesService);
  96. const promise = getDeclarationsAtPosition(languageFeaturesService.declarationProvider, model, position, CancellationToken.None);
  97. return _sortedAndDeduped(() => promise);
  98. });
  99. registerModelAndPositionCommand('_executeReferenceProvider', (accessor, model, position) => {
  100. const languageFeaturesService = accessor.get(ILanguageFeaturesService);
  101. const promise = getReferencesAtPosition(languageFeaturesService.referenceProvider, model, position, false, CancellationToken.None);
  102. return _sortedAndDeduped(() => promise);
  103. });
  104. registerModelAndPositionCommand('_executeImplementationProvider', (accessor, model, position) => {
  105. const languageFeaturesService = accessor.get(ILanguageFeaturesService);
  106. const promise = getImplementationsAtPosition(languageFeaturesService.implementationProvider, model, position, CancellationToken.None);
  107. return _sortedAndDeduped(() => promise);
  108. });