diff options
3 files changed, 58 insertions, 8 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/IntegerLiteralExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/IntegerLiteralExpr.java index b26106c9e..58fd20392 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/IntegerLiteralExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/IntegerLiteralExpr.java @@ -76,7 +76,17 @@ public class IntegerLiteralExpr extends LiteralStringValueExpr { } public int asInt() { - return Integer.parseInt(value); + String result = value.replaceAll("_", ""); + if (result.startsWith("0x")) { + return Integer.parseUnsignedInt(result.substring(2), 16); + } + if (result.startsWith("0b")) { + return Integer.parseUnsignedInt(result.substring(2), 2); + } + if (result.startsWith("0")) { + return Integer.parseUnsignedInt(result.substring(1), 8); + } + return Integer.parseInt(result); } public IntegerLiteralExpr setInt(int value) { diff --git a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LongLiteralExpr.java b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LongLiteralExpr.java index af11154d3..0db0b9b12 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LongLiteralExpr.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ast/expr/LongLiteralExpr.java @@ -76,7 +76,21 @@ public class LongLiteralExpr extends LiteralStringValueExpr { } public long asLong() { - return Long.parseLong(value); + String result = value.replaceAll("_", ""); + char lastChar = result.charAt(result.length() - 1); + if (lastChar == 'l' || lastChar == 'L') { + result = result.substring(0, result.length() - 1); + } + if (result.startsWith("0x")) { + return Long.parseUnsignedLong(result.substring(2), 16); + } + if (result.startsWith("0b")) { + return Long.parseUnsignedLong(result.substring(2), 2); + } + if (result.startsWith("0")) { + return Long.parseUnsignedLong(result.substring(1), 8); + } + return Long.parseLong(result); } public LongLiteralExpr setLong(long value) { diff --git a/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/LiteralStringValueExprTest.java b/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/LiteralStringValueExprTest.java index 3b2e7fba3..164b398f3 100644 --- a/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/LiteralStringValueExprTest.java +++ b/javaparser-testing/src/test/java/com/github/javaparser/ast/expr/LiteralStringValueExprTest.java @@ -20,6 +20,7 @@ */ package com.github.javaparser.ast.expr; +import com.github.javaparser.JavaParser; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -28,23 +29,48 @@ public class LiteralStringValueExprTest { @Test public void longLiteralsAreConverted() { - LongLiteralExpr literalExpr = new LongLiteralExpr(25L); + LongLiteralExpr dec = JavaParser.parseExpression("9223372036854775807L"); + LongLiteralExpr posOct = JavaParser.parseExpression("07_7777_7777_7777_7777_7777L"); + LongLiteralExpr negOct = JavaParser.parseExpression("010_0000_0000_0000_0000_0000L"); + LongLiteralExpr posHex = JavaParser.parseExpression("0x7fff_ffff_ffff_ffffL"); + LongLiteralExpr negHex = JavaParser.parseExpression("0xffff_ffff_ffff_ffffL"); + LongLiteralExpr posBin = JavaParser.parseExpression("0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L"); + LongLiteralExpr negBin = JavaParser.parseExpression("0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000L"); - assertThat(literalExpr.asLong()).isEqualTo(25L); + assertThat(dec.asLong()).isEqualTo(9223372036854775807L); + assertThat(posOct.asLong()).isEqualTo(9223372036854775807L); // 07_7777_7777_7777_7777_7777L + assertThat(negOct.asLong()).isEqualTo(-9223372036854775808L); // 010_0000_0000_0000_0000_0000L + assertThat(posHex.asLong()).isEqualTo(0x7fff_ffff_ffff_ffffL); + assertThat(negHex.asLong()).isEqualTo(0xffff_ffff_ffff_ffffL); + assertThat(posBin.asLong()).isEqualTo(0b0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L); + assertThat(negBin.asLong()).isEqualTo(0b1000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000L); } @Test public void integerLiteralsAreConverted() { - IntegerLiteralExpr literalExpr = new IntegerLiteralExpr(25); + IntegerLiteralExpr dec = JavaParser.parseExpression("2147483647"); + IntegerLiteralExpr posOct = JavaParser.parseExpression("0177_7777_7777"); + IntegerLiteralExpr negOct = JavaParser.parseExpression("0377_7777_7777"); + IntegerLiteralExpr posHex = JavaParser.parseExpression("0x7fff_ffff"); + IntegerLiteralExpr negHex = JavaParser.parseExpression("0xffff_ffff"); + IntegerLiteralExpr posBin = JavaParser.parseExpression("0b0111_1111_1111_1111_1111_1111_1111_1111"); + IntegerLiteralExpr negBin = JavaParser.parseExpression("0b1000_0000_0000_0000_0000_0000_0000_0000"); - assertThat(literalExpr.asInt()).isEqualTo(25); + assertThat(dec.asInt()).isEqualTo(2147483647); + assertThat(posOct.asInt()).isEqualTo(2147483647); // 0177_7777_7777 + assertThat(negOct.asInt()).isEqualTo(-1); // 0377_7777_7777 + assertThat(posHex.asInt()).isEqualTo(0x7fff_ffff); + assertThat(negHex.asInt()).isEqualTo(0xffff_ffff); + assertThat(posBin.asInt()).isEqualTo(0b0111_1111_1111_1111_1111_1111_1111_1111); + assertThat(negBin.asInt()).isEqualTo(0b1000_0000_0000_0000_0000_0000_0000_0000); } @Test public void charLiteralsAreConverted() { - CharLiteralExpr literalExpr = new CharLiteralExpr('\t'); + Expression expr = JavaParser.parseExpression("'\\n'"); - assertThat(literalExpr.asChar()).isEqualTo('\t'); + assertThat(expr).isInstanceOf(CharLiteralExpr.class); + assertThat(((CharLiteralExpr) expr).asChar()).isEqualTo('\\'); } @Test |