All files / src/lsp hover.ts

91.66% Statements 55/60
87.5% Branches 21/24
100% Functions 2/2
91.66% Lines 55/60

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 54 55 56 57 58 59 601x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 118x 118x 1x 1x 118x 118x     118x 118x     118x 118x 118x   118x 118x 118x 118x 1x 118x 1x 117x 1x 116x 2x 2x 1x 1x 2x 2x 113x 113x 118x 108x 108x 5x 118x 2x 2x 3x 3x 3x 1x 1x
import * as Tokens from "../abap/1_lexer/tokens";
import * as Statements from "../abap/2_statements/statements";
import * as LServer from "vscode-languageserver-types";
import {IRegistry} from "../_iregistry";
import {ABAPObject} from "../objects/_abap_object";
import {LSPUtils} from "./_lsp_utils";
import {ITextDocumentPositionParams} from "./_interfaces";
import {LSPLookup} from "./_lookup";
import {MacroCall} from "../abap/2_statements/statements/_statement";
 
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.snode.get() instanceof MacroCall) {
      return {kind: LServer.MarkupKind.Markdown, value: "Macro Call"};
    } else if (found.snode.get() instanceof Statements.Define && found.stack.length === 2) {
      return {kind: LServer.MarkupKind.Markdown, value: "Macro Name"};
    } 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;
  }
 
}