You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2019/09/28 07:24:41 UTC
[groovy] 01/02: Numbers class: prepare for removal of antlr2
This is an automated email from the ASF dual-hosted git repository.
paulk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 9874a326e2c5af94d31a4244c4af8c1fb3b5734f
Author: Paul King <pa...@asert.com.au>
AuthorDate: Sat Sep 28 17:12:07 2019 +1000
Numbers class: prepare for removal of antlr2
---
.../codehaus/groovy/antlr/AntlrParserPlugin.java | 1 +
.../java/org/codehaus/groovy/syntax/Numbers.java | 113 +++++++++++++++++----
.../apache/groovy/parser/antlr4/AstBuilder.java | 4 +-
3 files changed, 94 insertions(+), 24 deletions(-)
diff --git a/src/main/java/org/codehaus/groovy/antlr/AntlrParserPlugin.java b/src/main/java/org/codehaus/groovy/antlr/AntlrParserPlugin.java
index e3f6abb..f6330c0 100644
--- a/src/main/java/org/codehaus/groovy/antlr/AntlrParserPlugin.java
+++ b/src/main/java/org/codehaus/groovy/antlr/AntlrParserPlugin.java
@@ -136,6 +136,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX;
/**
* A parser plugin which adapts the JSR Antlr Parser to the Groovy runtime
*/
+@Deprecated
public class AntlrParserPlugin extends ASTHelper implements ParserPlugin, GroovyTokenTypes {
private static class AnonymousInnerClassCarrier extends Expression {
diff --git a/src/main/java/org/codehaus/groovy/syntax/Numbers.java b/src/main/java/org/codehaus/groovy/syntax/Numbers.java
index be43e69..cc9231a 100644
--- a/src/main/java/org/codehaus/groovy/syntax/Numbers.java
+++ b/src/main/java/org/codehaus/groovy/syntax/Numbers.java
@@ -32,7 +32,6 @@ public class Numbers {
//---------------------------------------------------------------------------
// LEXING SUPPORT
-
/**
* Returns true if the specified character is a base-10 digit.
*/
@@ -40,7 +39,6 @@ public class Numbers {
return c >= '0' && c <= '9';
}
-
/**
* Returns true if the specific character is a base-8 digit.
*/
@@ -48,7 +46,6 @@ public class Numbers {
return c >= '0' && c <= '7';
}
-
/**
* Returns true if the specified character is a base-16 digit.
*/
@@ -56,7 +53,6 @@ public class Numbers {
return isDigit(c) || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
}
-
/**
* Returns true if the specified character is a valid type specifier
* for a numeric value.
@@ -87,11 +83,9 @@ public class Numbers {
return false;
}
-
//---------------------------------------------------------------------------
// PARSING SUPPORT
-
private static final BigInteger MAX_LONG = BigInteger.valueOf(Long.MAX_VALUE);
private static final BigInteger MIN_LONG = BigInteger.valueOf(Long.MIN_VALUE);
@@ -104,20 +98,102 @@ public class Numbers {
private static final BigDecimal MAX_FLOAT = new BigDecimal(String.valueOf(Float.MAX_VALUE));
private static final BigDecimal MIN_FLOAT = MAX_FLOAT.negate();
-
/**
* Builds a Number from the given integer descriptor. Creates the narrowest
* type possible, or a specific type, if specified.
*
* @param text literal text to parse
* @return instantiated Number object
- * @throws NumberFormatException if the number does not fit within the type
- * requested by the type specifier suffix (invalid numbers don't make
- * it here)
+ * @throws NumberFormatException if the number does not fit within the type requested by the type
+ * specifier suffix (invalid numbers don't make it here)
*/
- @Deprecated
public static Number parseInteger(String text) {
- return parseInteger(null, text);
+ String text1 = text;
+ // remove place holder underscore before starting
+ text1 = text1.replace("_", "");
+
+ char c = ' ';
+ int length = text1.length();
+
+ //
+ // Strip off the sign, if present
+
+ boolean negative = false;
+ if ((c = text1.charAt(0)) == '-' || c == '+') {
+ negative = (c == '-');
+ text1 = text1.substring(1, length);
+ length -= 1;
+ }
+
+ //
+ // Determine radix (default is 10).
+
+ int radix = 10;
+ if (text1.charAt(0) == '0' && length > 1) {
+ c = text1.charAt(1);
+ if (c == 'X' || c == 'x') {
+ radix = 16;
+ text1 = text1.substring(2, length);
+ length -= 2;
+ } else if (c == 'B' || c == 'b') {
+ radix = 2;
+ text1 = text1.substring(2, length);
+ length -= 2;
+ } else {
+ radix = 8;
+ }
+ }
+
+ //
+ // Strip off any type specifier and convert it to lower
+ // case, if present.
+
+ char type = 'x'; // pick best fit
+ if (isNumericTypeSpecifier(text1.charAt(length - 1), false)) {
+ type = Character.toLowerCase(text1.charAt(length - 1));
+ text1 = text1.substring(0, length - 1);
+
+ length -= 1;
+ }
+
+ //
+ // Add the sign back, if necessary
+
+ if (negative) {
+ text1 = "-" + text1;
+ }
+
+ //
+ // Build the specified type or, if no type was specified, the
+ // smallest type in which the number will fit.
+
+ BigInteger value = new BigInteger(text1, radix);
+
+ switch (type) {
+ case 'i':
+ if (radix == 10 && (value.compareTo(MAX_INTEGER) > 0 || value.compareTo(MIN_INTEGER) < 0)) {
+ throw new NumberFormatException("Number of value " + value + " does not fit in the range of int, but int was enforced.");
+ } else {
+ return value.intValue();
+ }
+ case 'l':
+ if (radix == 10 && (value.compareTo(MAX_LONG) > 0 || value.compareTo(MIN_LONG) < 0)) {
+ throw new NumberFormatException("Number of value " + value + " does not fit in the range of long, but long was enforced.");
+ } else {
+ return value.longValue();
+ }
+ case 'g':
+ return value;
+ default:
+ // If not specified, we will return the narrowest possible
+ // of Integer, Long, and BigInteger.
+ if (value.compareTo(MAX_INTEGER) <= 0 && value.compareTo(MIN_INTEGER) >= 0) {
+ return value.intValue();
+ } else if (value.compareTo(MAX_LONG) <= 0 && value.compareTo(MIN_LONG) >= 0) {
+ return value.longValue();
+ }
+ return value;
+ }
}
/**
@@ -127,10 +203,10 @@ public class Numbers {
* @param reportNode at node for error reporting in the parser
* @param text literal text to parse
* @return instantiated Number object
- * @throws NumberFormatException if the number does not fit within the type
- * requested by the type specifier suffix (invalid numbers don't make
- * it here)
+ * @throws NumberFormatException if the number does not fit within the type requested by the type
+ * specifier suffix (invalid numbers don't make it here)
*/
+ @Deprecated
public static Number parseInteger(AST reportNode, String text) {
// remove place holder underscore before starting
text = text.replace("_", "");
@@ -138,7 +214,6 @@ public class Numbers {
char c = ' ';
int length = text.length();
-
//
// Strip off the sign, if present
@@ -149,7 +224,6 @@ public class Numbers {
length -= 1;
}
-
//
// Determine radix (default is 10).
@@ -169,7 +243,6 @@ public class Numbers {
}
}
-
//
// Strip off any type specifier and convert it to lower
// case, if present.
@@ -182,7 +255,6 @@ public class Numbers {
length -= 1;
}
-
//
// Add the sign back, if necessary
@@ -190,7 +262,6 @@ public class Numbers {
text = "-" + text;
}
-
//
// Build the specified type or, if no type was specified, the
// smallest type in which the number will fit.
@@ -224,7 +295,6 @@ public class Numbers {
}
}
-
/**
* Builds a Number from the given decimal descriptor. Uses BigDecimal,
* unless, Double or Float is requested.
@@ -239,7 +309,6 @@ public class Numbers {
text = text.replace("_", "");
int length = text.length();
-
//
// Strip off any type specifier and convert it to lower
// case, if present.
diff --git a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
index ee109cb..f102184 100644
--- a/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
+++ b/subprojects/parser-antlr4/src/main/java/org/apache/groovy/parser/antlr4/AstBuilder.java
@@ -2837,7 +2837,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
String integerLiteralText = constantExpression.getNodeMetaData(INTEGER_LITERAL_TEXT);
if (null != integerLiteralText) {
- ConstantExpression result = new ConstantExpression(Numbers.parseInteger(null, SUB_STR + integerLiteralText));
+ ConstantExpression result = new ConstantExpression(Numbers.parseInteger(SUB_STR + integerLiteralText));
this.numberFormatError = null; // reset the numberFormatError
@@ -3471,7 +3471,7 @@ public class AstBuilder extends GroovyParserBaseVisitor<Object> implements Groov
Number num = null;
try {
- num = Numbers.parseInteger(null, text);
+ num = Numbers.parseInteger(text);
} catch (Exception e) {
this.numberFormatError = tuple(ctx, e);
}