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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 619x 619x 619x 619x 619x 619x 619x 619x 2x 2x 2x 2x 617x 617x 617x 617x 619x 619x 1x 1x 1x 1x 616x 616x 619x 476x 476x 476x 616x 616x 616x 616x 619x 8x 8x 8x 8x 608x 608x 608x 608x 619x 45x 25x 25x 20x 45x 20x 20x 608x 1x | import {StatementNode} from "../../nodes";
import * as Expressions from "../../2_statements/expressions";
import {ObjectOriented} from "../_object_oriented";
import {ScopeType} from "../_scope_type";
import {ReferenceType} from "../_reference";
import {StatementSyntax} from "../_statement_syntax";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
import {Visibility} from "../../4_file_information/visibility";
export class MethodImplementation implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
const helper = new ObjectOriented(input.scope);
const className = input.scope.getName();
const methodToken = node.findFirstExpression(Expressions.MethodName)!.getFirstToken();
const methodName = methodToken?.getStr();
const classDefinition = input.scope.findClassDefinition(className);
if (classDefinition === undefined) {
const message = "Class definition for \"" + className + "\" not found";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const {method: methodDefinition} = helper.searchMethodName(classDefinition, methodName);
if (classDefinition.isForTesting()
&& methodDefinition?.getVisibility() !== Visibility.Private
&& ["SETUP", "TEARDOWN", "CLASS_SETUP", "CLASS_TEARDOWN"].includes(methodName.toUpperCase())) {
const message = "Special test method \"" + methodName + "\" must be private";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const start = node.getFirstToken().getStart();
if (methodDefinition?.isStatic() === false) {
input.scope.push(ScopeType.MethodInstance, methodName, start, input.filename);
input.scope.addList(classDefinition.getAttributes().getInstance());
}
input.scope.push(ScopeType.Method, methodName, start, input.filename);
// note: the scope must be pushed before returning
if (methodDefinition === undefined) {
const message = "Method definition \"" + methodName + "\" not found";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
input.scope.addReference(methodToken, methodDefinition, ReferenceType.MethodImplementationReference, input.filename);
input.scope.addList(methodDefinition.getParameters().getAll());
for (const i of helper.findInterfaces(classDefinition)) {
if (methodName.toUpperCase().startsWith(i.name.toUpperCase() + "~") === false) {
continue;
}
const idef = input.scope.findInterfaceDefinition(i.name);
if (idef === undefined) {
continue;
}
input.scope.addReference(methodToken, idef, ReferenceType.ObjectOrientedReference, input.filename);
}
}
} |