Skip to content

Commit 1d06512

Browse files
authored
Fixes eclipse-jdt#4971 - NumberFormatException in indexing when using dom based ops (eclipse-jdt#4972)
* Fixes eclipse-jdt#4971 - NumberFormatException in indexing when using dom based operations Signed-off-by: Rob Stryker <rob@oxbeef.net>
1 parent dfb7663 commit 1d06512

1 file changed

Lines changed: 41 additions & 4 deletions

File tree

org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DOMToModelPopulator.java

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -803,20 +803,31 @@ public Entry<Object, Integer> memberValue(Expression dom) {
803803
value = token.substring(0, token.length() - 1);
804804
}
805805
if (value instanceof String valueString) {
806+
ValueRadix valueRadix = null;
806807
// I tried using `yield`, but this caused ECJ to throw an AIOOB, preventing compilation
807808
switch (type) {
808809
case IMemberValuePair.K_INT: {
809810
try {
810811
value = Integer.parseInt(valueString);
811812
} catch (NumberFormatException e) {
812813
type = IMemberValuePair.K_LONG;
813-
value = Long.parseLong(valueString);
814+
valueRadix = numberToStringRadix(valueString);
815+
value = Long.parseLong(valueRadix.val, valueRadix.radix);
814816
}
815817
break;
816818
}
817-
case IMemberValuePair.K_LONG: value = Long.parseLong(valueString); break;
818-
case IMemberValuePair.K_SHORT: value = Short.parseShort(valueString); break;
819-
case IMemberValuePair.K_BYTE: value = Byte.parseByte(valueString); break;
819+
case IMemberValuePair.K_LONG:
820+
valueRadix = numberToStringRadix(valueString);
821+
value = Long.parseLong(valueRadix.val, valueRadix.radix);
822+
break;
823+
case IMemberValuePair.K_SHORT:
824+
valueRadix = numberToStringRadix(valueString);
825+
value = Short.parseShort(valueRadix.val, valueRadix.radix);
826+
break;
827+
case IMemberValuePair.K_BYTE:
828+
valueRadix = numberToStringRadix(valueString);
829+
value = Byte.parseByte(valueRadix.val, valueRadix.radix);
830+
break;
820831
case IMemberValuePair.K_FLOAT: value = Float.parseFloat(valueString); break;
821832
case IMemberValuePair.K_DOUBLE: value = Double.parseDouble(valueString); break;
822833
default: throw new IllegalArgumentException("Type not (yet?) supported"); //$NON-NLS-1$
@@ -835,6 +846,32 @@ public Entry<Object, Integer> memberValue(Expression dom) {
835846
return new SimpleEntry<>(null, IMemberValuePair.K_UNKNOWN);
836847
}
837848

849+
private record ValueRadix(String val, Integer radix) {}
850+
private ValueRadix numberToStringRadix(String s) {
851+
// 1. Remove underscores
852+
s = s.replace("_", ""); //$NON-NLS-1$ //$NON-NLS-2$
853+
854+
// 2. Remove long suffix
855+
if (s.endsWith("l") || s.endsWith("L")) {//$NON-NLS-1$ //$NON-NLS-2$
856+
s = s.substring(0, s.length() - 1);
857+
}
858+
859+
int radix = 10;
860+
861+
// 3. Detect radix
862+
if (s.startsWith("0x") || s.startsWith("0X")) {//$NON-NLS-1$ //$NON-NLS-2$
863+
radix = 16;
864+
s = s.substring(2);
865+
} else if (s.startsWith("0b") || s.startsWith("0B")) {//$NON-NLS-1$ //$NON-NLS-2$
866+
radix = 2;
867+
s = s.substring(2);
868+
} else if (s.startsWith("0") && s.length() > 1) {//$NON-NLS-1$
869+
radix = 8;
870+
s = s.substring(1);
871+
}
872+
return new ValueRadix(s, radix);
873+
}
874+
838875
private int toAnnotationValuePairType(String token) {
839876
// inspired by NumberLiteral.setToken
840877
Scanner scanner = new Scanner();

0 commit comments

Comments
 (0)