[ecmascript] InnaccurateNumericLiteral false positive with hex literals

Fixes #861
This commit is contained in:
Andreas Dangel
2018-06-01 09:28:37 +02:00
parent 63e22779bc
commit 439624319a
4 changed files with 27 additions and 8 deletions

View File

@ -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<NumberLiteral> {
public ASTNumberLiteral(NumberLiteral numberLiteral) {
super(numberLiteral);
@ -21,8 +20,20 @@ public class ASTNumberLiteral extends AbstractEcmascriptNode<NumberLiteral> {
}
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() {

View File

@ -107,11 +107,7 @@ precision in a floating point number. This may result in numeric calculations b
<property name="xpath">
<value>
<![CDATA[
//NumberLiteral[
@Image != @Number
and translate(@Image, "e", "E") != @Number
and concat(@Image, ".0") != @Number
and @Image != substring-before(translate(@Number, ".", ""), "E")]
//NumberLiteral[@NormalizedImage != @Number]
]]>
</value>
</property>

View File

@ -63,4 +63,14 @@ var x = 1.12345678901234567e-4;
]]></code>
<source-type>ecmascript 3</source-type>
</test-code>
<test-code>
<description>#861 [ecmascript] InnaccurateNumericLiteral false positive</description>
<expected-problems>0</expected-problems>
<code><![CDATA[
var hex1 = 0x20;
var hex2 = 0X20;
]]></code>
<source-type>ecmascript 3</source-type>
</test-code>
</test-data>