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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11509x 11509x 11509x 11509x 11509x 11509x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 34371x 11509x 11509x 11014x 11014x 11509x 11509x 235x 235x 11509x 11509x 238x 238x 238x 311x 311x 311x 104x 104x 68x 68x 104x 32x 32x 104x 32x 32x 36x 36x 311x 238x 238x 11509x 11509x 308x 308x 308x 102x 102x 67x 67x 35x 35x 102x 7x 7x 7x 102x 241x 308x 2x 2x 241x 241x 241x 11509x 11509x 2x 2x 3x 3x 3x 1x 1x 1x 2x 2x 1x 1x 11509x 11509x | import {Issue} from "../issue";
import {IRule, IRuleMetadata} from "./_irule";
import {IObject} from "../objects/_iobject";
import {IRegistry} from "../_iregistry";
import {BasicRuleConfig} from "./_basic_rule_config";
import {FunctionGroup} from "../objects";
export class IdenticalDescriptionsConf extends BasicRuleConfig {
}
export class IdenticalDescriptions implements IRule {
private conf = new IdenticalDescriptionsConf();
private descriptions: {[type: string]: {[description: string]: string[]}};
private types: string[];
public getMetadata(): IRuleMetadata {
return {
key: "identical_descriptions",
title: "Identical descriptions",
shortDescription: `Searches for objects with the same type and same description`,
extendedInformation: `Case insensitive
Only checks the master language descriptions
Dependencies are skipped
Works for: INTF, CLAS, DOMA, DTEL, FUNC in same FUGR`,
tags: [],
};
}
public getConfig() {
return this.conf;
}
public setConfig(conf: IdenticalDescriptionsConf) {
this.conf = conf;
}
public initialize(reg: IRegistry) {
this.descriptions = {};
this.types = ["INTF", "CLAS", "DOMA", "DTEL"];
for (const o of reg.getObjects()) {
if (reg.isDependency(o)) {
continue;
}
const type = o.getType();
if (this.types.includes(type)) {
const description = o.getDescription()?.toUpperCase();
if (description === undefined || description === "") {
continue;
}
if (this.descriptions[type] === undefined) {
this.descriptions[type] = {};
}
if (this.descriptions[type][description] === undefined) {
this.descriptions[type][description] = [];
}
this.descriptions[type][description].push(o.getName());
}
}
return this;
}
public run(o: IObject): Issue[] {
const issues: Issue[] = [];
const type = o.getType();
if (this.types.includes(type)) {
const description = o.getDescription()?.toUpperCase();
if (description === undefined || description === "") {
return issues;
}
const found = this.descriptions[type][description].filter(a => a !== o.getName());
if (found.length > 0) {
const message = "Identical description: " + found[0];
issues.push(Issue.atRow(o.getXMLFile()!, 1, message, this.getMetadata().key, this.getConfig().severity));
}
}
if (o instanceof FunctionGroup) {
issues.push(...this.checkFunctionModules(o));
}
return issues;
}
private checkFunctionModules(fugr: FunctionGroup): Issue[] {
const descriptions: {[type: string]: boolean} = {};
for (const fm of fugr.getModules()) {
const d = fm.getDescription()?.toUpperCase();
if (d === undefined || d === "") {
continue;
}
if (descriptions[d] !== undefined) {
const message = "FUGR " + fugr.getName() + " contains function modules with identical descriptions";
return [Issue.atRow(fugr.getXMLFile()!, 1, message, this.getMetadata().key, this.getConfig().severity)];
}
descriptions[d] = true;
}
return [];
}
} |