goToSymbol.js 5.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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 { DeclarationProviderRegistry, DefinitionProviderRegistry, ImplementationProviderRegistry, ReferenceProviderRegistry, TypeDefinitionProviderRegistry } from '../../common/modes.js';
  18. import { ReferencesModel } from './referencesModel.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 (let 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(model, position, token) {
  42. return getLocationLinks(model, position, DefinitionProviderRegistry, (provider, model, position) => {
  43. return provider.provideDefinition(model, position, token);
  44. });
  45. }
  46. export function getDeclarationsAtPosition(model, position, token) {
  47. return getLocationLinks(model, position, DeclarationProviderRegistry, (provider, model, position) => {
  48. return provider.provideDeclaration(model, position, token);
  49. });
  50. }
  51. export function getImplementationsAtPosition(model, position, token) {
  52. return getLocationLinks(model, position, ImplementationProviderRegistry, (provider, model, position) => {
  53. return provider.provideImplementation(model, position, token);
  54. });
  55. }
  56. export function getTypeDefinitionsAtPosition(model, position, token) {
  57. return getLocationLinks(model, position, TypeDefinitionProviderRegistry, (provider, model, position) => {
  58. return provider.provideTypeDefinition(model, position, token);
  59. });
  60. }
  61. export function getReferencesAtPosition(model, position, compact, token) {
  62. return getLocationLinks(model, position, ReferenceProviderRegistry, (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', (model, position) => _sortedAndDeduped(() => getDefinitionsAtPosition(model, position, CancellationToken.None)));
  85. registerModelAndPositionCommand('_executeDeclarationProvider', (model, position) => _sortedAndDeduped(() => getDeclarationsAtPosition(model, position, CancellationToken.None)));
  86. registerModelAndPositionCommand('_executeImplementationProvider', (model, position) => _sortedAndDeduped(() => getImplementationsAtPosition(model, position, CancellationToken.None)));
  87. registerModelAndPositionCommand('_executeTypeDefinitionProvider', (model, position) => _sortedAndDeduped(() => getTypeDefinitionsAtPosition(model, position, CancellationToken.None)));
  88. registerModelAndPositionCommand('_executeReferenceProvider', (model, position) => _sortedAndDeduped(() => getReferencesAtPosition(model, position, false, CancellationToken.None)));