|
1 | 1 | package org.mcphackers.mcp.tools.constants; |
2 | 2 |
|
| 3 | +import java.util.HashMap; |
| 4 | +import java.util.Map; |
3 | 5 | import java.util.regex.Pattern; |
4 | 6 |
|
5 | 7 | public class MathConstants extends Constants { |
6 | 8 |
|
7 | 9 | // Used to prevent strings from being captured, such as "2.0D" |
8 | 10 | private static final Pattern _CONSTANT_REGEX = Pattern.compile("(?![\\\"\\'][.\\w\\s]*)-*\\d+\\.*\\w*(?![.\\w\\s]*[\\\"\\'])"); |
| 11 | + private static final Map<String, String> _CONSTANTS = new HashMap<String, String>(); |
| 12 | + |
| 13 | + static { |
| 14 | + for (int i = 1; i <= 100; i++) { |
| 15 | + double d = i * 0.01D; |
| 16 | + if(d != (double)(float)d) { // if imprecise |
| 17 | + floatCastedToDouble((float)d); |
| 18 | + } |
| 19 | + } |
| 20 | + floatCastedToDouble(0.0075F); |
| 21 | + floatCastedToDouble(0.999F); |
| 22 | + floatCastedToDouble(0.997F); |
| 23 | + floatCastedToDouble(1.62F); |
| 24 | + replaceValue(Math.PI, "Math.PI"); |
| 25 | + replaceValue((float)Math.PI, "(float)Math.PI"); |
| 26 | + replaceValue((float)Math.PI / 2F, "(float)Math.PI / 2F"); |
| 27 | + replaceValue((float)Math.PI / 4.5F, "(float)Math.PI / 4.5F"); |
| 28 | + replaceValue((double)(float)Math.PI, "(double)(float)Math.PI"); |
| 29 | + replaceValue(Math.PI * 2D, "Math.PI * 2D"); |
| 30 | + replaceValue(Math.PI / 2D, "Math.PI / 2D"); |
| 31 | + replaceValue(0xFFFFFF, "0xFFFFFF"); // TODO Might do this in fernflower at some point |
| 32 | + replaceValue(0x20200000, "0x20200000"); |
| 33 | + replaceValue(0x20400000, "0x20400000"); |
| 34 | + replaceValue(0xFF000000, "0xFF000000"); |
| 35 | + replaceValue(2.0D / 256D, "2.0D / 256D"); |
| 36 | + replaceValue(6.0D / 256D, "6.0D / 256D"); |
| 37 | + replaceValue(7.0D / 256D, "7.0D / 256D"); |
| 38 | + replaceValue(8.0D / 256D, "8.0D / 256D"); |
| 39 | + replaceValue(9.0D / 256D, "9.0D / 256D"); |
| 40 | + } |
9 | 41 |
|
10 | 42 | protected String replace_constants(String code) { |
11 | 43 | return replaceTextOfMatchGroup(code, _CONSTANT_REGEX, match1 -> { |
12 | 44 | String constant = match1.group(0); |
13 | | - |
14 | | - constant = replaceValue(constant, Math.PI, "Math.PI"); |
15 | | - constant = replaceValue(constant, (float)Math.PI, "(float)Math.PI"); |
16 | | - constant = replaceValue(constant, (float)Math.PI / 2F, "(float)Math.PI / 2F"); |
17 | | - constant = replaceValue(constant, (float)Math.PI / 4.5F, "(float)Math.PI / 4.5F"); |
18 | | - constant = replaceValue(constant, (double)(float)Math.PI, "(double)(float)Math.PI"); |
19 | | - constant = replaceValue(constant, Math.PI * 2D, "Math.PI * 2D"); |
20 | | - constant = replaceValue(constant, Math.PI / 2D, "Math.PI / 2D"); |
21 | | - for (int i = 1; i <= 100; i++) { |
22 | | - double d = i * 0.01D; |
23 | | - if(d != (double)(float)d) { // if imprecise |
24 | | - constant = floatCastedToDouble(constant, (float)d); |
25 | | - } |
26 | | - } |
27 | | - constant = floatCastedToDouble(constant, 0.0075F); |
28 | | - constant = floatCastedToDouble(constant, 0.999F); |
29 | | - constant = floatCastedToDouble(constant, 0.997F); |
30 | | - constant = floatCastedToDouble(constant, 1.62F); |
31 | | - constant = replaceValue(constant, 0xFFFFFF, "0xFFFFFF"); // TODO Might do this in fernflower at some point |
32 | | - constant = replaceValue(constant, 0x20200000, "0x20200000"); |
33 | | - constant = replaceValue(constant, 0x20400000, "0x20400000"); |
34 | | - constant = replaceValue(constant, 0xFF000000, "0xFF000000"); |
35 | | - //brugh |
36 | | - constant = replaceValue(constant, 2.0D / 256D, "2.0D / 256D"); |
37 | | - constant = replaceValue(constant, 6.0D / 256D, "6.0D / 256D"); |
38 | | - constant = replaceValue(constant, 7.0D / 256D, "7.0D / 256D"); |
39 | | - constant = replaceValue(constant, 8.0D / 256D, "8.0D / 256D"); |
40 | | - constant = replaceValue(constant, 9.0D / 256D, "9.0D / 256D"); |
41 | | - return constant; |
| 45 | + return _CONSTANTS.containsKey(constant) ? _CONSTANTS.get(constant) : constant; |
42 | 46 | }); |
43 | 47 | } |
44 | 48 |
|
45 | | - private String floatCastedToDouble(String code, float value) { |
46 | | - return code.replace((double)value + "D", "(double)" + value + "F"); |
| 49 | + private static String floatCastedToDouble(float value) { |
| 50 | + return _CONSTANTS.put((double)value + "D", "(double)" + value + "F"); |
47 | 51 | } |
48 | 52 |
|
49 | | - private String replaceValue(String code, double value, String replace) { |
50 | | - return code.replace(value + "D", replace); |
| 53 | + private static String replaceValue(double value, String replace) { |
| 54 | + return _CONSTANTS.put(value + "D", replace); |
51 | 55 | } |
52 | 56 |
|
53 | | - private String replaceValue(String code, float value, String replace) { |
54 | | - return code.replace(value + "F", replace); |
| 57 | + private static String replaceValue(float value, String replace) { |
| 58 | + return _CONSTANTS.put(value + "F", replace); |
55 | 59 | } |
56 | 60 |
|
57 | | - private String replaceValue(String code, int value, String replace) { |
58 | | - return code.replace(value + "", replace); |
| 61 | + private static String replaceValue(int value, String replace) { |
| 62 | + return _CONSTANTS.put(String.valueOf(value), replace); |
59 | 63 | } |
60 | 64 |
|
61 | | - private String replaceValue(String code, long value, String replace) { |
62 | | - return code.replace(value + "L", replace); |
| 65 | + private static String replaceValue(long value, String replace) { |
| 66 | + return _CONSTANTS.put(value + "L", replace); |
63 | 67 | } |
64 | 68 | } |
0 commit comments