All files / src msag_references.ts

88.88% Statements 48/54
86.66% Branches 13/15
100% Functions 5/5
88.88% Lines 48/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 6777x 6777x 6777x 6777x 6777x 30x     30x 30x 29x 29x 30x 30x 30x 30x 30x 30x 30x 29x 29x 30x 29x 29x 30x 30x 30x 30x 30x 6777x 6777x 2224x 2262x 2262x         2262x 2262x 2224x 6777x 6777x 256x 256x 6777x 6777x 9x 9x 6777x
import {IMSAGReferences} from "./_imsag_references";
import {Token} from "./abap/1_lexer/tokens/_token";
import {IObject} from "./objects/_iobject";
 
export class MSAGReferences implements IMSAGReferences {
  private readonly nameNumberIndex: { [messageClass: string]: { [number: string]: {filename: string, token: Token}[] } } = {};
  private readonly filenameIndex: { [filename: string]: {token: Token, messageClass: string, number: string}[] } = {};
 
  public addUsing(filename: string, token: Token, messageClass: string, number: string): void {
    if (number.length !== 3) {
      return;
    }
 
    if (this.filenameIndex[filename] === undefined) {
      this.filenameIndex[filename] = [];
    }
    this.filenameIndex[filename].push({
      token: token,
      messageClass: messageClass,
      number: number,
    });
 
    if (this.nameNumberIndex[messageClass] === undefined) {
      this.nameNumberIndex[messageClass] = {};
    }
    if (this.nameNumberIndex[messageClass][number] === undefined) {
      this.nameNumberIndex[messageClass][number] = [];
    }
    this.nameNumberIndex[messageClass][number].push({
      filename: filename,
      token: token,
    });
  }
 
  public clear(obj: IObject): void {
    for (const file of obj.getFiles()) {
      const filename = file.getFilename();
      for (const fIndex of this.filenameIndex[filename] || []) {
// this should be okay for performance, each message should be referenced less than 10 times typically
        this.nameNumberIndex[fIndex.messageClass][fIndex.number] =
          this.nameNumberIndex[fIndex.messageClass][fIndex.number].filter(i => i.filename !== filename);
      }
      delete this.filenameIndex[filename];
    }
  }
 
  public listByFilename(filename: string): { token: Token; messageClass: string; number: string; }[] {
    return this.filenameIndex[filename] || [];
  }
 
  public listByMessage(messageClass: string, number: string): { filename: string; token: Token; }[] {
    return this.nameNumberIndex[messageClass]?.[number] || [];
  }
}