All files / src/lsp hover.ts

90.74% Statements 49/54
83.33% Branches 15/18
100% Functions 2/2
90.74% Lines 49/54

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 541x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 94x 94x 1x 1x 94x 94x     94x 94x     94x 94x 94x   94x 94x 94x 94x 1x 94x 2x 2x 1x 1x 2x 2x 91x 91x 94x 87x 87x 4x 94x 2x 2x 2x 2x 2x 1x 1x
import * as LServer from "vscode-languageserver-types";
import {IRegistry} from "../_iregistry";
import {ABAPObject} from "../objects/_abap_object";
import {LSPUtils} from "./_lsp_utils";
import * as Tokens from "../abap/1_lexer/tokens";
import {ITextDocumentPositionParams} from "./_interfaces";
import {LSPLookup} from "./_lookup";
 
export class Hover {
  private readonly reg: IRegistry;
 
  public constructor(reg: IRegistry) {
    this.reg = reg;
  }
 
  public find(pos: ITextDocumentPositionParams): LServer.MarkupContent | undefined {
    const file = LSPUtils.getABAPFile(this.reg, pos.textDocument.uri);
    if (file === undefined) {
      return undefined;
    }
    const obj = this.reg.getObject(file.getObjectType(), file.getObjectName());
    if (!(obj instanceof ABAPObject)) {
      return undefined;
    }
 
    const found = LSPUtils.findCursor(this.reg, pos);
    if (found === undefined) {
      return undefined;
    } else if (found.token instanceof Tokens.StringTemplate
      || found.token instanceof Tokens.StringTemplateBegin
      || found.token instanceof Tokens.StringTemplateEnd
      || found.token instanceof Tokens.StringTemplateMiddle) {
      return {kind: LServer.MarkupKind.Markdown, value: "String Template"};
    } else if (found.token instanceof Tokens.Comment) {
      let type = "Comment";
      if (found.token.getStr().startsWith(`"!`)) {
        type = "ABAP Doc Comment";
      }
      return {kind: LServer.MarkupKind.Markdown, value: type};
    }
 
    const lookup = LSPLookup.lookup(found, this.reg, obj);
    if (lookup?.hover) {
      return {kind: LServer.MarkupKind.Markdown, value: lookup.hover};
    }
 
    if (found.token instanceof Tokens.StringToken) {
      return {kind: LServer.MarkupKind.Markdown, value: "String"};
    }
 
    return undefined;
  }
 
}