• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

wurstscript / WurstScript / 271

29 Sep 2025 12:12PM UTC coverage: 64.649% (+2.4%) from 62.222%
271

Pull #1096

circleci

Frotty
Merge branch 'perf-improvements' of https://github.com/wurstscript/WurstScript into perf-improvements
Pull Request #1096: Perf improvements

18202 of 28155 relevant lines covered (64.65%)

0.65 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.48
de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/translation/imtojass/ExprTranslation.java
1
package de.peeeq.wurstscript.translation.imtojass;
2

3

4
import de.peeeq.wurstscript.WurstOperator;
5
import de.peeeq.wurstscript.attributes.CompileError;
6
import de.peeeq.wurstscript.jassAst.*;
7
import de.peeeq.wurstscript.jassIm.*;
8
import de.peeeq.wurstscript.translation.imtranslation.ImTranslator;
9
import de.peeeq.wurstscript.types.TypesHelper;
10

11
import static de.peeeq.wurstscript.jassAst.JassAst.*;
12

13
public class ExprTranslation {
×
14

15
    public static JassExpr translate(ImBoolVal e, ImToJassTranslator translator) {
16
        return JassAst.JassExprBoolVal(e.getValB());
1✔
17
    }
18

19
    public static JassExpr translate(ImFuncRef e, ImToJassTranslator translator) {
20
        JassFunctionOrNative f = translator.getJassFuncFor(e.getFunc());
1✔
21
        return JassAst.JassExprFuncRef(f.getName());
1✔
22
    }
23

24
    public static JassExpr translate(ImFunctionCall e, ImToJassTranslator translator) {
25

26
        JassFunctionOrNative f = translator.getJassFuncFor(e.getFunc());
1✔
27
        JassExprlist arguments = JassExprlist();
1✔
28
        for (ImExpr arg : e.getArguments()) {
1✔
29
            arguments.add(arg.translate(translator));
1✔
30
        }
1✔
31
        String funcName = f.getName();
1✔
32
        if (funcName.equals(ImTranslator.$DEBUG_PRINT)) {
1✔
33
            funcName = "BJDebugMsg";
1✔
34
        }
35
        switch (e.getCallType()) {
1✔
36
            case NORMAL:
37
                return JassAst.JassExprFunctionCall(funcName, arguments);
1✔
38
            case EXECUTE:
39
                return JassAst.JassExprFunctionCall("ExecuteFunc", JassAst.JassExprlist(JassAst.JassExprStringVal(f.getName())));
1✔
40
            default:
41
                throw new Error("unhandled case");
×
42
        }
43
    }
44

45
    public static JassExpr translate(ImIntVal e, ImToJassTranslator translator) {
46
        return JassExprIntVal(String.valueOf(e.getValI()));
1✔
47
    }
48

49
    public static JassExpr translate(ImNull e, ImToJassTranslator translator) {
50
        if (e.getType() instanceof ImAnyType
1✔
51
            || TypesHelper.isIntType(e.getType())) {
1✔
52
            return JassExprIntVal("0");
1✔
53
        }
54
        return JassExprNull();
1✔
55
    }
56

57
    public static JassExpr translate(ImOperatorCall e, ImToJassTranslator translator) {
58
        WurstOperator op = e.getOp();
1✔
59
        if (op.isBinaryOp() && e.getArguments().size() == 2) {
1✔
60
            JassExpr left = e.getArguments().get(0).translate(translator);
1✔
61
            JassExpr right = e.getArguments().get(1).translate(translator);
1✔
62

63
            if (op == WurstOperator.PLUS) {
1✔
64
                // special cases for using 'null' as a string constant:
65
                // "a" + null gets translated to just "a"
66
                if (left instanceof JassExprNull) {
1✔
67
                    return right;
1✔
68
                }
69
                if (right instanceof JassExprNull) {
1✔
70
                    return left;
1✔
71
                }
72
            }
73

74
            if (op == WurstOperator.MOD_REAL) {
1✔
75
                return JassExprFunctionCall("ModuloReal", JassExprlist(left, right));
1✔
76
            } else if (op == WurstOperator.MOD_INT) {
1✔
77
                return JassExprFunctionCall("ModuloInteger", JassExprlist(left, right));
1✔
78
            }
79

80
            return JassExprBinary(left, op.jassTranslateBinary(), right);
1✔
81
        } else if (op.isUnaryOp() && e.getArguments().size() == 1) {
1✔
82
            return JassExprUnary(op.jassTranslateUnary(), e.getArguments().get(0).translate(translator));
1✔
83
        } else {
84
            throw new Error("not implemented: " + e);
×
85
        }
86
    }
87

88

89
    public static JassExpr translate(ImRealVal e, ImToJassTranslator translator) {
90
        return JassExprRealVal(e.getValR());
1✔
91
    }
92

93
    public static JassExpr translate(ImStatementExpr e, ImToJassTranslator translator) {
94
        throw new Error("this expr should have been flattened: " + e + "\n\n" + e.getNearestFunc());
×
95
    }
96

97
    public static JassExpr translate(ImStringVal e, ImToJassTranslator translator) {
98
        return JassExprStringVal(e.getValS());
1✔
99
    }
100

101
    public static JassExpr translate(ImTupleExpr e, ImToJassTranslator translator) {
102
        throw new Error("tuples should be eliminated in this phase");
×
103
    }
104

105
    public static JassExpr translate(ImTupleSelection e, ImToJassTranslator translator) {
106
        throw new Error("tuples should be eliminated in this phase");
×
107
    }
108

109
    public static JassExprVarAccess translate(ImVarAccess e, ImToJassTranslator translator) {
110
        JassVar v = translator.getJassVarFor(e.getVar());
1✔
111
        return JassExprVarAccess(v.getName());
1✔
112
    }
113

114
    public static JassExprVarArrayAccess translate(ImVarArrayAccess e, ImToJassTranslator translator) {
115
        JassVar v = translator.getJassVarFor(e.getVar());
1✔
116
        if (e.getIndexes().size() != 1) {
1✔
117
            throw new CompileError(e.attrTrace().attrSource(), "Only one array index allowed.");
×
118
        }
119
        return JassExprVarArrayAccess(v.getName(), e.getIndexes().get(0).translate(translator));
1✔
120
    }
121

122
    public static JassExpr translate(ImClassRelatedExpr e,
123
                                     ImToJassTranslator translator) {
124
        throw new RuntimeException("Eliminate method calls before translating to jass:\n" + e);
×
125
    }
126

127

128
    public static JassExpr translate(ImGetStackTrace imGetStackTrace, ImToJassTranslator translator) {
129
        return JassAst.JassExprStringVal("");
1✔
130
    }
131

132

133
    public static JassExpr translate(ImCompiletimeExpr e, ImToJassTranslator translator) {
134
        throw new CompileError(e.attrTrace().attrSource(),
×
135
                "Compiletime expression must be evaluated before translation. " +
136
                "Enable '-runcompiletimefunctions' to evaluate compiletime expressions.");
137
    }
138

139
    public static JassExpr translate(ImTypeVarDispatch e, ImToJassTranslator translator) {
140
        throw new CompileError(e, "Typevar dispatch not eliminated.");
×
141
    }
142

143
    public static JassExpr translate(ImCast imCast, ImToJassTranslator translator) {
144
        return imCast.getExpr().translate(translator);
1✔
145
    }
146
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc