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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1569x 1569x 1569x 1x 1x 5091x 2548x 1718x 4261x 1x 1x 315x 315x 315x 315x 1x 1x 1x 1x 281x 281x 83x 83x 281x 1x 1x 1569x 1569x 281x 281x 1288x 1288x 1569x 1288x 1288x 1569x 49x 49x 1288x 1288x 1569x 14x 14x 1288x 1288x 1569x 569x 569x 1288x 1x 1x 715x 715x 715x 715x 2x 2x 715x 1x 1x | import {MethodDefinition} from "./method_definition";
import {StatementNode, StructureNode} from "../nodes";
import * as Structures from "../3_structures/structures";
import {MethodDef} from "../2_statements/statements";
import {Visibility} from "../4_file_information/visibility";
import {IMethodDefinitions} from "./_method_definitions";
import {IMethodDefinition} from "./_method_definition";
import {SyntaxInput, syntaxIssue} from "../5_syntax/_syntax_input";
export class MethodDefinitions implements IMethodDefinitions {
private readonly all: {[index: string]: IMethodDefinition} = {};
public constructor(node: StructureNode, input: SyntaxInput) {
this.all = {};
this.parse(node, input);
}
public* getAll(): Generator<IMethodDefinition, void, undefined> {
for (const a in this.all) {
yield this.all[a];
}
}
public getByName(name: string | undefined): IMethodDefinition | undefined {
if (name === undefined) {
return undefined;
}
return this.all[name.toUpperCase()];
}
///////////////////////
private parseInterface(node: StructureNode, input: SyntaxInput) {
const defs = node.findAllStatements(MethodDef);
for (const def of defs) {
this.add(def, Visibility.Public, input);
}
}
private parse(node: StructureNode, input: SyntaxInput) {
const idef = node.findDirectStructure(Structures.Interface);
if (idef) {
return this.parseInterface(node, input);
}
const cdef = node.findDirectStructure(Structures.ClassDefinition);
if (!cdef) {
throw new Error("MethodDefinitions, expected ClassDefinition as part of input node");
}
const pri = cdef.findDirectStructure(Structures.PrivateSection);
for (const def of pri?.findAllStatements(MethodDef) || []) {
this.add(def, Visibility.Private, input);
}
const pro = node.findDirectStructure(Structures.ProtectedSection);
for (const def of pro?.findAllStatements(MethodDef) || []) {
this.add(def, Visibility.Protected, input);
}
const pub = node.findDirectStructure(Structures.PublicSection);
for (const def of pub?.findAllStatements(MethodDef) || []) {
this.add(def, Visibility.Public, input);
}
}
private add(def: StatementNode, visibility: Visibility, input: SyntaxInput): void {
try {
const m = new MethodDefinition(def, visibility, input);
this.all[m.getName().toUpperCase()] = m;
} catch (e) {
input.issues.push(syntaxIssue(input, def.getFirstToken(), e.message));
}
}
}
|