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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 8139x 8139x 8139x 8139x 8139x 1x 1x 314x 314x 1x 1x 267x 267x 1x 1x 45540x 45540x 1x 1x 9503x 9503x 1x 1x 8102x 8102x 8102x 8102x 238x 1x 1x 1x 238x 8101x 8101x 8101x 1x 1x 27886x 27886x 1x 1x 213x 220x 208x 208x 220x 5x 5x 1x 1x 40x 40x 40x 40x 40x 40x 40x 1x 1x 16768x 16768x 1x 1x 90x 90x 90x 90x 90x 1x 1x 7017x 7017x 7017x 7017x 7221x 805x 805x 7221x 6212x 7017x 6238x 3x 3x 6238x 6209x 6209x 1x 1x 3366x 3366x 488x 488x 2878x 2878x 1x 1x 506x 506x 511x 505x 505x 505x 511x 1x 1x 1x 1x 3168x 3168x 2777x 2777x 391x 391x 3168x 3168x 1x 1x | import {IFile} from "../files/_ifile"; import {IAllowedNaming, IObject, IParseResult} from "./_iobject"; import {XMLParser} from "fast-xml-parser"; import {Issue} from "../issue"; import {Version} from "../version"; import {Identifier} from "../abap/4_file_information/_identifier"; import {Identifier as IdentifierToken} from "../abap/1_lexer/tokens/identifier"; import {Position} from "../position"; import {IRegistry} from "../_iregistry"; export abstract class AbstractObject implements IObject { protected old: readonly Issue[]; protected dirty: boolean; private files: IFile[]; private readonly name: string; public abstract getType(): string; public abstract getAllowedNaming(): IAllowedNaming; public abstract getDescription(): string | undefined; public constructor(name: string) { this.name = name; this.files = []; this.old = []; this.dirty = false; } public getParsingIssues() { return this.old; } public parse(_version?: Version, _globalMacros?: readonly string[], _reg?: IRegistry): IParseResult { return {updated: false, runtime: 0}; } public getName(): string { return this.name; } public setDirty(): void { this.dirty = true; } public addFile(file: IFile) { this.setDirty(); // update if it already exists for (let i = 0; i < this.files.length; i++) { if (this.files[i].getFilename() === file.getFilename()) { this.files[i] = file; return; } } this.files.push(file); } public getFiles(): readonly IFile[] { return this.files; } public containsFile(filename: string): boolean { for (const f of this.files) { if (f.getFilename() === filename) { return true; } } return false; } public removeFile(file: IFile): void { this.setDirty(); for (let i = 0; i < this.files.length; i++) { if (this.files[i].getFilename() === file.getFilename()) { this.files.splice(i, 1); return; } } throw new Error("removeFile: file not found"); } public isDirty() { return this.dirty; } public getIdentifier(): Identifier | undefined { // this method can be redefined in each object type to give a better result const file = this.getXMLFile(); if (file === undefined) { return undefined; } return new Identifier(new IdentifierToken(new Position(1, 1), this.getName()), file.getFilename()); } public getXMLFile() { // todo, https://github.com/abaplint/abaplint/issues/673 uris const expected1 = this.getName().toLowerCase().replace(/\//g, "#") + "." + this.getType().toLowerCase() + ".xml"; const expected2 = this.getName().toLowerCase().replace(/\//g, "%23") + "." + this.getType().toLowerCase() + ".xml"; for (const file of this.getFiles()) { if (file.getFilename().endsWith(expected1) || file.getFilename().endsWith(expected2)) { return file; } } // uri fallback, assume there is only one xml file for (const file of this.getFiles()) { if (file.getFilename().endsWith(".xml")) { return file; } } return undefined; } public getXML(): string | undefined { const file = this.getXMLFile(); if (file) { return file.getRaw(); } return undefined; } public updateFile(file: IFile) { this.setDirty(); for (let i = 0; i < this.files.length; i++) { if (this.files[i].getFilename() === file.getFilename()) { this.files[i] = file; return; } } throw new Error("updateFile: file not found"); } protected parseRaw2(): any | undefined { const xml = this.getXML(); if (xml === undefined) { return undefined; } try { return new XMLParser({parseTagValue: false, ignoreAttributes: true, trimValues: false}).parse(xml); } catch { return undefined; } } } |