forked from phoedos/pmd
[ecmascript] InnaccurateNumericLiteral false positive with hex literals
Fixes #861
This commit is contained in:
@ -21,6 +21,8 @@ This is a minor release.
|
|||||||
|
|
||||||
### Fixed Issues
|
### Fixed Issues
|
||||||
|
|
||||||
|
* ecmascript
|
||||||
|
* [#861](https://github.com/pmd/pmd/issues/861): \[ecmascript] InnaccurateNumericLiteral false positive with hex literals
|
||||||
* java-codestyle
|
* java-codestyle
|
||||||
* [#1158](https://github.com/pmd/pmd/issues/1158): \[java] Fix IdenticalCatchBranches false positive
|
* [#1158](https://github.com/pmd/pmd/issues/1158): \[java] Fix IdenticalCatchBranches false positive
|
||||||
* xml
|
* xml
|
||||||
|
@ -6,7 +6,6 @@ package net.sourceforge.pmd.lang.ecmascript.ast;
|
|||||||
|
|
||||||
import org.mozilla.javascript.ast.NumberLiteral;
|
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 class ASTNumberLiteral extends AbstractEcmascriptNode<NumberLiteral> {
|
||||||
public ASTNumberLiteral(NumberLiteral numberLiteral) {
|
public ASTNumberLiteral(NumberLiteral numberLiteral) {
|
||||||
super(numberLiteral);
|
super(numberLiteral);
|
||||||
@ -21,8 +20,20 @@ public class ASTNumberLiteral extends AbstractEcmascriptNode<NumberLiteral> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getNormalizedImage() {
|
public String getNormalizedImage() {
|
||||||
// TODO Implement
|
String image = getImage();
|
||||||
return super.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() {
|
public double getNumber() {
|
||||||
|
@ -107,11 +107,7 @@ precision in a floating point number. This may result in numeric calculations b
|
|||||||
<property name="xpath">
|
<property name="xpath">
|
||||||
<value>
|
<value>
|
||||||
<![CDATA[
|
<![CDATA[
|
||||||
//NumberLiteral[
|
//NumberLiteral[@NormalizedImage != @Number]
|
||||||
@Image != @Number
|
|
||||||
and translate(@Image, "e", "E") != @Number
|
|
||||||
and concat(@Image, ".0") != @Number
|
|
||||||
and @Image != substring-before(translate(@Number, ".", ""), "E")]
|
|
||||||
]]>
|
]]>
|
||||||
</value>
|
</value>
|
||||||
</property>
|
</property>
|
||||||
|
@ -63,4 +63,14 @@ var x = 1.12345678901234567e-4;
|
|||||||
]]></code>
|
]]></code>
|
||||||
<source-type>ecmascript 3</source-type>
|
<source-type>ecmascript 3</source-type>
|
||||||
</test-code>
|
</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>
|
</test-data>
|
||||||
|
Reference in New Issue
Block a user