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 494x 494x 494x 494x 494x 494x 494x 494x 2x 2x 2x 2x 492x 492x 492x 492x 494x 494x 1x 1x 1x 1x 491x 491x 494x 375x 375x 375x 491x 491x 491x 491x 494x 7x 7x 7x 7x 484x 484x 484x 484x 494x 42x 23x 23x 19x 42x 19x 19x 484x 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);
}
}
} |