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

wurstscript / WurstScript / 228

29 Nov 2023 05:00PM UTC coverage: 62.48% (-0.09%) from 62.574%
228

push

circleci

web-flow
Show dialog for choosing game path, cleanup (#1083)

* show dialog for choosing game path

* cleanup code

* remove logs and refactor

* remove confusing mpq error, make some mpq loads readonly

17295 of 27681 relevant lines covered (62.48%)

0.62 hits per line

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

92.06
de.peeeq.wurstscript/src/main/java/de/peeeq/wurstio/jassinterpreter/ReflectionNativeProvider.java
1
package de.peeeq.wurstio.jassinterpreter;
2

3
import de.peeeq.wurstio.jassinterpreter.providers.*;
4
import de.peeeq.wurstscript.intermediatelang.ILconst;
5
import de.peeeq.wurstscript.intermediatelang.ILconstNull;
6
import de.peeeq.wurstscript.intermediatelang.interpreter.AbstractInterpreter;
7
import de.peeeq.wurstscript.intermediatelang.interpreter.NativesProvider;
8
import de.peeeq.wurstscript.intermediatelang.interpreter.NoSuchNativeException;
9

10
import java.io.PrintStream;
11
import java.lang.reflect.InvocationTargetException;
12
import java.lang.reflect.Method;
13
import java.util.HashMap;
14

15
public class ReflectionNativeProvider implements NativesProvider {
16
    private final HashMap<String, NativeJassFunction> methodMap = new HashMap<>();
1✔
17

18
    public ReflectionNativeProvider(AbstractInterpreter interpreter) {
1✔
19
        addProvider(new GamecacheProvider(interpreter));
1✔
20
        addProvider(new ForceProvider(interpreter));
1✔
21
        addProvider(new HandleProvider(interpreter));
1✔
22
        addProvider(new GroupProvider(interpreter));
1✔
23
        addProvider(new HashtableProvider(interpreter));
1✔
24
        addProvider(new MathProvider(interpreter));
1✔
25
        addProvider(new OutputProvider(interpreter));
1✔
26
        addProvider(new WurstflectionProvider(interpreter));
1✔
27
        addProvider(new StringProvider(interpreter));
1✔
28
        addProvider(new UnitProvider(interpreter));
1✔
29
        addProvider(new PlayerProvider(interpreter));
1✔
30
        addProvider(new TriggerProvider(interpreter));
1✔
31
        addProvider(new TimerProvider(interpreter));
1✔
32
        addProvider(new LocationProvider(interpreter));
1✔
33
        addProvider(new RectProvider(interpreter));
1✔
34
        addProvider(new ItemProvider(interpreter));
1✔
35
        addProvider(new ConversionProvider(interpreter));
1✔
36
        addProvider(new DestructableProvider(interpreter));
1✔
37
        addProvider(new DialogProvider(interpreter));
1✔
38
        addProvider(new EffectProvider(interpreter));
1✔
39
        addProvider(new RegionProvider(interpreter));
1✔
40
        addProvider(new ImageProvider(interpreter));
1✔
41
        addProvider(new IntegerProvider(interpreter));
1✔
42
        addProvider(new FrameProvider(interpreter));
1✔
43
        addProvider(new LuaEnsureTypeProvider(interpreter));
1✔
44
        addProvider(new QuestProvider(interpreter));
1✔
45
        addProvider(new QuestItemProvider(interpreter));
1✔
46
    }
1✔
47

48
    public NativeJassFunction getFunctionPair(String funcName) {
49
        return methodMap.get(funcName);
1✔
50
    }
51

52
    private void addProvider(Provider provider) {
53
        for (Method method : provider.getClass().getMethods()) {
1✔
54
            Implements annotation = method.getAnnotation(Implements.class);
1✔
55
            if (annotation != null) {
1✔
56
                String[] funcNames = annotation.funcNames();
1✔
57
                for (String funcName : funcNames) {
1✔
58
                    if (methodMap.containsKey(funcName)) {
1✔
59
                        throw new Error("Trying to add multiple implementations of <" + funcName + ">");
×
60
                    }
61
                    methodMap.put(funcName, new NativeJassFunction(provider, method));
1✔
62
                }
63
            } else {
1✔
64
                methodMap.put(method.getName(), new NativeJassFunction(provider, method));
1✔
65
            }
66
        }
67
    }
1✔
68

69
    @Override
70
    public ILconst invoke(String funcname, ILconst[] args) throws NoSuchNativeException {
71
        NativeJassFunction candidate = methodMap.get(funcname);
1✔
72
        if (candidate == null) {
1✔
73
            throw new NoSuchNativeException("");
×
74
        }
75

76
        if (candidate.getMethod().getParameterCount() == args.length) {
1✔
77
            String[] parameterTypes = new String[args.length];
1✔
78
            for (int i = 0; i < args.length; i++) {
1✔
79
                parameterTypes[i] = "" + args[i];
1✔
80
                if (!candidate.getMethod().getParameterTypes()[i].isAssignableFrom(args[i].getClass())) {
1✔
81
                    if (args[i] instanceof ILconstNull) {
1✔
82
                        // handle null as a special case and pass it to the native as a Java null
83
                        args[i] = null;
1✔
84
                        continue;
1✔
85
                    }
86
                    throw new Error("The native <" + funcname + "> expects different parameter " + i + "!" +
×
87
                            "\n\tExpected: " + candidate.getMethod().getParameterTypes()[i].getSimpleName() + " Actual: " + parameterTypes[i]);
×
88
                }
89
            }
90
        }
91
        try {
92
            return (ILconst) candidate.getMethod().invoke(candidate.getProvider(), (Object[]) args);
1✔
93
        } catch (IllegalAccessException | InvocationTargetException e) {
1✔
94
            if (e.getCause() instanceof Error) {
1✔
95
                throw (Error) e.getCause();
1✔
96
            } else if (e.getCause() instanceof InterpreterException) {
1✔
97
                throw (InterpreterException) e.getCause();
1✔
98
            }
99
            throw new Error(e.getCause());
×
100
        }
101
    }
102

103
    @Override
104
    public void setOutStream(PrintStream outStream) {
105

106
    }
1✔
107
}
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