Skip to content

Commit 3c9e977

Browse files
SONARPY-2115 Migrate S1244 FloatingPointEqualityCheck to the V2 type model (#1954)
1 parent 7e16c7d commit 3c9e977

File tree

1 file changed

+8
-5
lines changed

1 file changed

+8
-5
lines changed

python-checks/src/main/java/org/sonar/python/checks/FloatingPointEqualityCheck.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.util.Arrays;
2323
import java.util.List;
2424
import java.util.Set;
25-
2625
import org.sonar.check.Rule;
2726
import org.sonar.plugins.python.api.PythonSubscriptionCheck;
2827
import org.sonar.plugins.python.api.SubscriptionContext;
@@ -37,7 +36,8 @@
3736
import org.sonar.python.cfg.fixpoint.ReachingDefinitionsAnalysis;
3837
import org.sonar.python.quickfix.TextEditUtils;
3938
import org.sonar.python.tree.TreeUtils;
40-
import org.sonar.python.types.InferredTypes;
39+
import org.sonar.python.types.v2.TriBool;
40+
import org.sonar.python.types.v2.TypeChecker;
4141

4242
@Rule(key = "S1244")
4343
public class FloatingPointEqualityCheck extends PythonSubscriptionCheck {
@@ -60,6 +60,7 @@ public class FloatingPointEqualityCheck extends PythonSubscriptionCheck {
6060
private String importedModuleForIsClose;
6161
private Name importedAlias;
6262
private boolean isMathImported = false;
63+
private TypeChecker typeChecker;
6364

6465
@Override
6566
public void initialize(Context context) {
@@ -75,6 +76,7 @@ private void initializeAnalysis(SubscriptionContext ctx) {
7576
reachingDefinitionsAnalysis = new ReachingDefinitionsAnalysis(ctx.pythonFile());
7677
importedModuleForIsClose = null;
7778
importedAlias = null;
79+
typeChecker = ctx.typeChecker();
7880
}
7981

8082
private void checkFloatingPointEquality(SubscriptionContext ctx) {
@@ -95,15 +97,16 @@ private boolean isAnyOperandFloatingPoint(BinaryExpression binaryExpression) {
9597
isBinaryOperationWithFloat(leftOperand) || isBinaryOperationWithFloat(rightOperand);
9698
}
9799

98-
private static boolean isFloat(Expression expression) {
99-
return expression.is(Tree.Kind.NUMERIC_LITERAL) && expression.type().equals(InferredTypes.FLOAT);
100+
private boolean isFloat(Expression expression) {
101+
TriBool isTypeFloat = typeChecker.typeCheckBuilder().isBuiltinWithName("float").check(expression.typeV2());
102+
return expression.is(Tree.Kind.NUMERIC_LITERAL) && isTypeFloat == TriBool.TRUE;
100103
}
101104

102105
private boolean isAssignedFloat(Expression expression) {
103106
if (expression.is(Tree.Kind.NAME)) {
104107
Set<Expression> values = reachingDefinitionsAnalysis.valuesAtLocation((Name) expression);
105108
if (!values.isEmpty()) {
106-
return values.stream().allMatch(value -> isFloat(value));
109+
return values.stream().allMatch(this::isFloat);
107110
}
108111
}
109112
return false;

0 commit comments

Comments
 (0)