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 | 1x 1x 1x 7723x 7723x 7723x 7723x 7723x 252x 252x 77x 77x 252x 7723x 7723x 595x 595x 595x 595x 595x 595x 406x 406x 595x 406x 406x 595x 595x 595x 595x 513x 363x 363x 513x 441x 441x 513x 513x 595x 7723x 7723x 2847x 2847x 86x 58x 58x 58x 58x 58x 86x 2847x 2847x 2847x 2847x 2847x 50x 50x 2847x 7723x 7723x 121x 121x 7723x 7723x 2851x 2851x 2851x 2851x 2851x 53x 2851x 2798x 2798x 2851x 7723x 7723x 127x 127x 127x 127x 127x 127x 127x 93x 93x 145x 119x 119x 145x 93x 93x 127x 127x 127x 7723x 7723x | import {IObject} from "./objects/_iobject";
import {IDDICReferences, IObjectAndToken} from "./_iddic_references";
export class DDICReferences implements IDDICReferences {
private readonly nameTypeIndex: { [name: string]: { [type: string]: IObjectAndToken[] } } = {};
private readonly filenameIndex: { [filename: string]: { [line: number]: IObjectAndToken[] } } = {};
public setUsing(obj: IObject, using: IObjectAndToken[]): void {
this.clear(obj);
for (const u of using) {
this.addUsing(obj, u);
}
}
public addUsing(obj: IObject, using: IObjectAndToken | undefined) {
if (using === undefined) {
return;
}
// add to name and type index
const newName = obj.getName().toUpperCase();
const newType = obj.getType();
if (this.nameTypeIndex[newName] === undefined) {
this.nameTypeIndex[newName] = {};
}
if (this.nameTypeIndex[newName][newType] === undefined) {
this.nameTypeIndex[newName][newType] = [];
}
this.nameTypeIndex[newName][newType].push(using);
// add to filename index
if (using.filename && using.token) {
if (this.filenameIndex[using.filename] === undefined) {
this.filenameIndex[using.filename] = {};
}
if (this.filenameIndex[using.filename][using.token.getRow()] === undefined) {
this.filenameIndex[using.filename][using.token.getRow()] = [];
}
this.filenameIndex[using.filename][using.token.getRow()].push(using);
}
}
public clear(obj: IObject) {
// remove from filenameIndex first
for (const u of this.listUsing(obj)) {
if (u.filename && u.token) {
const found = this.filenameIndex[u.filename]?.[u.token.getRow()];
if (found) {
found.pop(); // TODODOD, this assumes there is max one reference on each line
}
}
}
// remove from name + type index
const name = obj.getName().toUpperCase();
const type = obj.getType();
if (this.nameTypeIndex[name]?.[type]) {
this.nameTypeIndex[name][type] = [];
}
}
public listByFilename(filename: string, line: number): IObjectAndToken[] {
return this.filenameIndex[filename]?.[line] || [];
}
public listUsing(obj: IObject): readonly IObjectAndToken[] {
const newName = obj.getName().toUpperCase();
const newType = obj.getType();
const found = this.nameTypeIndex[newName]?.[newType];
if (found !== undefined) {
return found;
} else {
return [];
}
}
public listWhereUsed(obj: IObject) {
// todo, add reverse index, this is slow
const ret = [];
const searchName = obj.getName().toUpperCase();
const searchType = obj.getType();
for (const name in this.nameTypeIndex) {
for (const type in this.nameTypeIndex[name]) {
for (const f of this.nameTypeIndex[name][type]) {
if (f.object && f.object.getType() === searchType && f.object.getName() === searchName) {
ret.push({type, name, token: f.token, filename: f.filename});
}
}
}
}
return ret;
}
} |