1 | // Can a be converted to b? |
2 | |
3 | // score 0 = exact match |
4 | // score Int.MAX_VALUE = no match |
5 | // score 1 = conversion needed (boxing/unboxing or non-primitve widening) |
6 | // score -2 = primitive widening needed |
7 | |
8 | static int typeConversionScore(Class a, Class b) { |
9 | if (a == b) ret 0; |
10 | |
11 | if (b.isPrimitive()) { |
12 | // target type is primitive |
13 | |
14 | if (a.isPrimitive()) { |
15 | // both types are primitive |
16 | |
17 | // No widenings to bool |
18 | if (b == bool.class) ret Int.MAX_VALUE; |
19 | |
20 | // No widenings to byte |
21 | if (b == byte.class) ret Int.MAX_VALUE; |
22 | |
23 | // byte can be converted to char |
24 | if (b == char.class) ret a == byte.class ? -2 : Int.MAX_VALUE; |
25 | |
26 | // byte can be converted to short |
27 | if (b == short.class) ret a == byte.class ? -2 : Int.MAX_VALUE; |
28 | |
29 | // byte, char and short can be converted to int |
30 | if (b == int.class) ret a == byte.class || a == char.class || a == short.class ? -2 : Int.MAX_VALUE; |
31 | |
32 | // byte, char, short and int can be converted to long |
33 | if (b == long.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; |
34 | |
35 | // byte, char, short and int can be converted to float |
36 | if (b == float.class) ret a == byte.class || a == char.class || a == short.class || a == int.class ? -2 : Int.MAX_VALUE; |
37 | |
38 | // all primitive types except bool can be converted to double |
39 | ret a != bool.class ? -2 : Int.MAX_VALUE; |
40 | } else { |
41 | // source type is boxed - check if they're a match |
42 | ret primitiveToBoxedType(b) == a ? 1 : Int.MAX_VALUE; |
43 | } |
44 | } else { |
45 | // target type is not primitive |
46 | |
47 | // object type is primitive - check for exact match |
48 | if (a.isPrimitive()) ret primitiveToBoxedType(a) == b ? 1 : Int.MAX_VALUE; |
49 | |
50 | // both types are not primitive |
51 | ret b.isAssignableFrom(a) ? 1 : Int.MAX_VALUE; |
52 | } |
53 | } |
Began life as a copy of #1034747
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mowyntqkapby, mqqgnosmbjvj
No comments. add comment
Snippet ID: | #1035459 |
Snippet name: | typeConversionScore - backup before precise subtype dispatch |
Eternal ID of this version: | #1035459/2 |
Text MD5: | 62c12248b21ab04e6f76cb9f16b1a8b4 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2022-05-19 20:28:32 |
Source code size: | 1948 bytes / 53 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 111 / 121 |
Version history: | 1 change(s) |
Referenced in: | [show references] |