getHover.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  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 { AsyncIterableObject } from '../../../base/common/async.js';
  15. import { CancellationToken } from '../../../base/common/cancellation.js';
  16. import { onUnexpectedExternalError } from '../../../base/common/errors.js';
  17. import { registerModelAndPositionCommand } from '../../browser/editorExtensions.js';
  18. import { HoverProviderRegistry } from '../../common/modes.js';
  19. export class HoverProviderResult {
  20. constructor(provider, hover, ordinal) {
  21. this.provider = provider;
  22. this.hover = hover;
  23. this.ordinal = ordinal;
  24. }
  25. }
  26. function executeProvider(provider, ordinal, model, position, token) {
  27. return __awaiter(this, void 0, void 0, function* () {
  28. try {
  29. const result = yield Promise.resolve(provider.provideHover(model, position, token));
  30. if (result && isValid(result)) {
  31. return new HoverProviderResult(provider, result, ordinal);
  32. }
  33. }
  34. catch (err) {
  35. onUnexpectedExternalError(err);
  36. }
  37. return undefined;
  38. });
  39. }
  40. export function getHover(model, position, token) {
  41. const providers = HoverProviderRegistry.ordered(model);
  42. const promises = providers.map((provider, index) => executeProvider(provider, index, model, position, token));
  43. return AsyncIterableObject.fromPromises(promises).coalesce();
  44. }
  45. export function getHoverPromise(model, position, token) {
  46. return getHover(model, position, token).map(item => item.hover).toPromise();
  47. }
  48. registerModelAndPositionCommand('_executeHoverProvider', (model, position) => getHoverPromise(model, position, CancellationToken.None));
  49. function isValid(result) {
  50. const hasRange = (typeof result.range !== 'undefined');
  51. const hasHtmlContent = typeof result.contents !== 'undefined' && result.contents && result.contents.length > 0;
  52. return hasRange && hasHtmlContent;
  53. }