@@ -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