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 1639x 1639x 1639x 1x 1x 5613x 2419x 2411x 5605x 1x 1x 1376x 1376x 1376x 1376x 1x 1x 1x 1x 282x 282x 84x 84x 282x 1x 1x 1639x 1639x 282x 282x 1357x 1357x 1639x 1357x 1357x 1639x 52x 52x 1357x 1357x 1639x 14x 14x 1357x 1357x 1639x 620x 620x 1357x 1x 1x 770x 770x 770x 770x 2x 2x 770x 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));
}
}
}
|