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 697x 697x 697x 697x 697x 697x 697x 697x 2x 2x 2x 2x 695x 695x 695x 695x 697x 697x 1x 1x 1x 1x 694x 694x 697x 537x 537x 537x 694x 694x 694x 694x 697x 9x 9x 9x 9x 685x 685x 685x 685x 697x 50x 29x 29x 21x 50x 21x 21x 685x 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 || methodDefinition === undefined) {
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);
}
}
} |