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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7651x 7651x 7651x 7651x 7651x 1x 1x 337x 337x 1x 1x 251x 251x 1x 1x 46615x 46615x 1x 1x 8942x 8942x 1x 1x 7623x 7623x 7623x 1x 1x 26868x 26868x 1x 1x 197x 204x 192x 192x 204x 5x 5x 1x 1x 40x 40x 40x 40x 40x 40x 40x 1x 1x 15813x 15813x 1x 1x 85x 85x 85x 85x 85x 1x 1x 6799x 6799x 6799x 6799x 6994x 773x 773x 6994x 6026x 6799x 6050x 3x 3x 6050x 6023x 6023x 1x 1x 3190x 3190x 462x 462x 2728x 2728x 1x 1x 500x 500x 505x 499x 499x 499x 505x 1x 1x 1x 1x 3039x 3039x 2668x 2668x 371x 371x 3039x 3039x 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(); 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; } } } |