async provideHover()

in src/provider/hoverProvider.ts [33:87]


  async provideHover(document: vscode.TextDocument, position: vscode.Position) {
    const service = alicloudAPIMessageService;
    const apis = service.pontManager.localPontSpecs
      .map((pontSpec) => {
        return AlicloudApiCommands.getPickItems(pontSpec);
      })
      .reduce((pre, next) => pre.concat(next), []);

    const wordRange = document.getWordRangeAtPosition(position);
    const word = document.getText(wordRange);
    const keyWord = getKeyWord(word);

    const hoverdAPI = apis?.find((item) => item?.label?.toLocaleLowerCase() === keyWord?.toLocaleLowerCase());
    const productInstance = await getProductRequestInstance();
    const hoverdProduct = productInstance?.products?.find((item) =>
      getProductsKeywords(item.code, item.versions)?.includes(keyWord?.toLocaleLowerCase()),
    );
    // 匹配关键字为 API 名称
    if (hoverdAPI) {
      const apiName = hoverdAPI?.label;
      const { product, version } = getSpecInfoFromName(hoverdAPI?.info?.split("/")[0]);
      const service = new AlicloudAPIService();
      const samples = await service.requestSamplesByAPI(product, version, keyWord);
      const args = [{ apiName, product, version }];
      const docCommandUri = vscode.Uri.parse(
        `command:alicloud.api.quickOpenDocument?${encodeURIComponent(JSON.stringify(args))}`,
      );
      const contents = new vscode.MarkdownString(
        I18N.template(I18N.provider.hoverProvider.checkDoc, { val1: apiName, val2: docCommandUri }),
      );
      contents.isTrusted = true;
      return new vscode.Hover([
        contents,
        samples?.length
          ? I18N.template(I18N.provider.hoverProvider.checkCodeSample, {
              val1: apiName,
              val2: product,
              val3: version,
              val4: apiName,
            })
          : I18N.template(I18N.provider.hoverProvider.checkCodeSampleProduct, { val1: product, val2: product }),
        hoverdAPI?.summary || "",
      ]);
    }
    // 匹配关键字为产品名称
    if (hoverdProduct) {
      return new vscode.Hover([
        I18N.template(I18N.provider.hoverProvider.checkCodeSampleProduct2, {
          val1: hoverdProduct?.name || hoverdProduct?.code,
          val2: hoverdProduct?.code,
        }),
        hoverdProduct?.description || hoverdProduct?.name,
      ]);
    }
  }