diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 17ffcc423b..af83be2dd6 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -21,6 +21,8 @@ This is a minor release. ### Fixed Issues +* ecmascript + * [#861](https://github.com/pmd/pmd/issues/861): \[ecmascript] InnaccurateNumericLiteral false positive with hex literals * java-codestyle * [#1158](https://github.com/pmd/pmd/issues/1158): \[java] Fix IdenticalCatchBranches false positive * xml 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 a0eda4c93e..9adcfd447d 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 @@ -6,7 +6,6 @@ package net.sourceforge.pmd.lang.ecmascript.ast; import org.mozilla.javascript.ast.NumberLiteral; -// TODO The Rhino node does not tell us whether this was specified via decimal, octal or hexidecimal. public class ASTNumberLiteral extends AbstractEcmascriptNode { public ASTNumberLiteral(NumberLiteral numberLiteral) { super(numberLiteral); @@ -21,8 +20,20 @@ public class ASTNumberLiteral extends AbstractEcmascriptNode { } public String getNormalizedImage() { - // TODO Implement - return super.getImage(); + String image = getImage(); + image = normalizeHexIntegerLiteral(image); + image = image.replace('e', 'E'); + if (image.indexOf('.') == -1 && image.indexOf('E') == -1) { + image = image + ".0"; + } + return image; + } + + private String normalizeHexIntegerLiteral(String image) { + if (image.startsWith("0x") || image.startsWith("0X")) { + return String.valueOf(Integer.parseInt(image.substring(2), 16)); + } + return image; } public double getNumber() { diff --git a/pmd-javascript/src/main/resources/category/ecmascript/errorprone.xml b/pmd-javascript/src/main/resources/category/ecmascript/errorprone.xml index 6ece0ac336..1aea173480 100644 --- a/pmd-javascript/src/main/resources/category/ecmascript/errorprone.xml +++ b/pmd-javascript/src/main/resources/category/ecmascript/errorprone.xml @@ -107,11 +107,7 @@ precision in a floating point number. This may result in numeric calculations b 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 6659953521..d5123e1887 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 @@ -3,64 +3,66 @@ xmlns="http://pmd.sourceforge.net/rule-tests" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/rule-tests http://pmd.sourceforge.net/rule-tests_1_0_0.xsd"> + - + Ok integer 0 ecmascript 3 + - + Bad integer 1 - + var x = 999999999999999999999999; ecmascript 3 + - + Ok float 0 ecmascript 3 + - + Bad float 1 ecmascript 3 + - + Ok float w/ exponent 0 ecmascript 3 + - + Bad float w/ exponent 1 ecmascript 3 + + + #861 [ecmascript] InnaccurateNumericLiteral false positive + 0 + + ecmascript 3 +