From c7acac7f290954848ec88fa14238ef0ca578830c Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Thu, 20 Oct 2022 17:15:18 +0200 Subject: [PATCH] [javascript] InaccurateNumericLiteral - consider underscores Fixes #4165 --- docs/pages/release_notes.md | 2 ++ .../lang/ecmascript/ast/ASTNumberLiteral.java | 17 +++++++++++++++++ .../xml/InnaccurateNumericLiteral.xml | 13 +++++++++++++ 3 files changed, 32 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 687f3714a1..8baf189b79 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -33,6 +33,8 @@ The rule is part of the quickstart.xml ruleset. * [#4163](https://github.com/pmd/pmd/issues/4163): \[doc] Broken links on page "Architecture Decisions" * java-documentation * [#4141](https://github.com/pmd/pmd/issues/4141): \[java] UncommentedEmptyConstructor FP when constructor annotated with @Autowired +* javascript + * [#4165](https://github.com/pmd/pmd/issues/4165): \[javascript] InaccurateNumericLiteral underscore separator notation false positive ### API Changes diff --git a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTNumberLiteral.java b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTNumberLiteral.java index 0eda685238..f8618b5eb2 100644 --- a/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTNumberLiteral.java +++ b/pmd-javascript/src/main/java/net/sourceforge/pmd/lang/ecmascript/ast/ASTNumberLiteral.java @@ -23,7 +23,10 @@ public class ASTNumberLiteral extends AbstractEcmascriptNode { public String getNormalizedImage() { String image = getImage(); + image = image.replaceAll("_", ""); image = normalizeHexIntegerLiteral(image); + image = normalizeBinaryLiteral(image); + image = normalizeOctalLiteral(image); image = image.replace('e', 'E'); if (image.indexOf('.') == -1 && image.indexOf('E') == -1) { image = image + ".0"; @@ -38,6 +41,20 @@ public class ASTNumberLiteral extends AbstractEcmascriptNode { return image; } + private String normalizeBinaryLiteral(String image) { + if (image.startsWith("0b") || image.startsWith("0B")) { + return String.valueOf(Integer.parseInt(image.substring(2), 2)); + } + return image; + } + + private String normalizeOctalLiteral(String image) { + if (image.startsWith("0o") || image.startsWith("0O")) { + return String.valueOf(Integer.parseInt(image.substring(2), 8)); + } + return image; + } + public double getNumber() { return node.getNumber(); } diff --git a/pmd-javascript/src/test/resources/net/sourceforge/pmd/lang/ecmascript/rule/errorprone/xml/InnaccurateNumericLiteral.xml b/pmd-javascript/src/test/resources/net/sourceforge/pmd/lang/ecmascript/rule/errorprone/xml/InnaccurateNumericLiteral.xml index 30c3094cca..fd304c19ae 100644 --- a/pmd-javascript/src/test/resources/net/sourceforge/pmd/lang/ecmascript/rule/errorprone/xml/InnaccurateNumericLiteral.xml +++ b/pmd-javascript/src/test/resources/net/sourceforge/pmd/lang/ecmascript/rule/errorprone/xml/InnaccurateNumericLiteral.xml @@ -58,4 +58,17 @@ var hex1 = 0x20; var hex2 = 0X20; ]]> + + + [javascript] InaccurateNumericLiteral underscore separator notation false positive #4165 + 0 + +