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 7834x 7834x 7834x 7834x 7834x 256x 256x 77x 77x 256x 7834x 7834x 617x 617x 617x 617x 617x 617x 418x 418x 617x 418x 418x 617x 617x 617x 617x 535x 375x 375x 535x 463x 463x 535x 535x 617x 7834x 7834x 2912x 2912x 86x 58x 58x 58x 58x 58x 86x 2912x 2912x 2912x 2912x 2912x 50x 50x 2912x 7834x 7834x 123x 123x 7834x 7834x 2916x 2916x 2916x 2916x 2916x 53x 2916x 2863x 2863x 2916x 7834x 7834x 127x 127x 127x 127x 127x 127x 127x 93x 93x 145x 119x 119x 145x 93x 93x 127x 127x 127x 7834x 7834x | 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;
}
} |