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 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 188x 188x 188x 188x 59x 59x 59x 59x 59x 59x 59x 3x 3x 3x 3x 56x 56x 59x 59x 56x 56x 59x 59x 59x 59x 59x 59x 59x 59x 59x 1x 1x 1x 1x 59x 184x 184x 184x 1x | import {ExpressionNode} from "../../nodes";
import {AnyType, CLikeType, CharacterType, NumericGenericType, NumericType, StringType, StructureType, UTCLongType, UnknownType, VoidType} from "../../types/basic";
import {AbstractType} from "../../types/basic/_abstract_type";
import * as Expressions from "../../2_statements/expressions";
import {Source} from "./source";
import {TypeUtils} from "../_type_utils";
import {CheckSyntaxKey, SyntaxInput, syntaxIssue} from "../_syntax_input";
export class StringTemplate {
public static runSyntax(node: ExpressionNode, input: SyntaxInput): AbstractType {
const typeUtils = new TypeUtils(input.scope);
const ret = StringType.get();
for (const templateSource of node.findAllExpressions(Expressions.StringTemplateSource)) {
const s = templateSource.findDirectExpression(Expressions.Source);
const type = Source.runSyntax(s, input, ret);
if (type === undefined) {
const message = "No target type determined";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
} else if ((typeUtils.isCharLike(type) === false
&& typeUtils.isHexLike(type) === false
&& !(type instanceof UTCLongType))
|| type instanceof StructureType) {
const message = "String template, not character like, " + type.constructor.name;
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
const format = templateSource.findDirectExpression(Expressions.StringTemplateFormatting);
const formatConcat = format?.concatTokens();
for (const formatSource of format?.findAllExpressions(Expressions.Source) || []) {
Source.runSyntax(formatSource, input);
}
if (format
&& formatConcat?.includes("ALPHA = ")
&& !(type instanceof UnknownType)
&& !(type instanceof VoidType)
&& !(type instanceof StringType)
&& !(type instanceof CLikeType)
&& !(type instanceof CharacterType)
&& !(type instanceof NumericGenericType)
&& !(type instanceof NumericType)
&& !(type instanceof AnyType)) {
const message = `Cannot apply ALPHA to this type (${type.constructor.name})`;
input.issues.push(syntaxIssue(input, format.getFirstToken(), message));
return VoidType.get(CheckSyntaxKey);
}
}
return ret;
}
} |