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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 65x 65x 65x 65x 65x 65x 65x 65x 65x 52x 52x 18x 18x 18x 18x 52x 28x 28x 28x 34x 6x 6x 6x 6x 46x 52x 18x 18x 52x 59x 59x 65x 13x 13x 5x 13x 1x 1x 8x 7x 7x 7x 7x 13x 52x 65x 1x 1x 52x 52x 52x 65x 2x 2x 52x 65x 2x 2x 52x 65x 12x 12x 65x 52x 65x 5x 5x 52x 65x 65x 65x 50x 50x 2x 2x 50x 65x 4x 4x 4x 65x 65x 1x | import * as Expressions from "../../2_statements/expressions";
import {ExpressionNode, StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {IReferenceExtras, ReferenceType} from "../_reference";
import {ObjectReferenceType, VoidType} from "../../types/basic";
import {StatementSyntax} from "../_statement_syntax";
import {MessageSource} from "../expressions/message_source";
import {RaiseWith} from "../expressions/raise_with";
import {ObjectOriented} from "../_object_oriented";
import {IMethodDefinition} from "../../types/_method_definition";
import {MethodParameters} from "../expressions/method_parameters";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
export class Raise implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
// todo
const helper = new ObjectOriented(input.scope);
let method: IMethodDefinition | VoidType | undefined;
const classTok = node.findDirectExpression(Expressions.ClassName)?.getFirstToken();
const className = classTok?.getStr();
if (classTok && className) {
const found = input.scope.existsObject(className);
if (found?.id) {
input.scope.addReference(classTok, found.id, ReferenceType.ObjectOrientedReference, input.filename);
const def = input.scope.findObjectDefinition(className);
method = helper.searchMethodName(def, "CONSTRUCTOR")?.method;
} else if (input.scope.getDDIC().inErrorNamespace(className) === false) {
const extra: IReferenceExtras = {ooName: className, ooType: "Void"};
input.scope.addReference(classTok, undefined, ReferenceType.ObjectOrientedVoidReference, input.filename, extra);
method = VoidType.get(className);
} else {
const message = "RAISE, unknown class " + className;
input.issues.push(syntaxIssue(input, classTok, message));
return;
}
if (method === undefined) {
method = VoidType.get(className);
}
}
const c = node.findExpressionAfterToken("EXCEPTION");
if (c instanceof ExpressionNode && (c.get() instanceof Expressions.SimpleSource2 || c.get() instanceof Expressions.Source)) {
const type = Source.runSyntax(c, input);
if (type instanceof VoidType) {
method = type;
} else if (type instanceof ObjectReferenceType) {
const def = input.scope.findObjectDefinition(type.getIdentifierName());
method = helper.searchMethodName(def, "CONSTRUCTOR")?.method;
} else if (type !== undefined) {
const message = "RAISE EXCEPTION, must be object reference, got " + type.constructor.name;
input.issues.push(syntaxIssue(input, c.getFirstToken(), message));
return;
}
}
if (method === undefined) {
method = VoidType.get("Exception");
}
// check parameters vs constructor
const param = node.findDirectExpression(Expressions.ParameterListS);
if (param) {
new MethodParameters().checkExporting(param, input, method, true);
}
for (const s of node.findDirectExpressions(Expressions.RaiseWith)) {
RaiseWith.runSyntax(s, input);
}
for (const s of node.findDirectExpressions(Expressions.Source)) {
Source.runSyntax(s, input);
}
for (const s of node.findDirectExpressions(Expressions.SimpleSource2)) {
Source.runSyntax(s, input);
}
for (const s of node.findDirectExpressions(Expressions.MessageSource)) {
MessageSource.runSyntax(s, input);
}
const id = node.findExpressionAfterToken("ID")?.concatTokens();
let number = node.findDirectExpression(Expressions.MessageNumber)?.concatTokens();
if (number === undefined) {
const num = node.findExpressionAfterToken("NUMBER")?.concatTokens();
if (num?.startsWith("'")) {
number = num.substring(1, num.length - 1).toUpperCase();
}
}
if (id?.startsWith("'") && number) {
const messageClass = id.substring(1, id.length - 1).toUpperCase();
input.scope.getMSAGReferences().addUsing(input.filename, node.getFirstToken(), messageClass, number);
}
}
} |