implicit numeric conversion should detect unary numeric promotion inside array dimension expression and test

This commit is contained in:
Bas Leijdekkers
2011-05-24 17:04:18 +02:00
parent 585b7f5c24
commit 09f7bc6706
4 changed files with 203 additions and 15 deletions
@@ -347,9 +347,7 @@ public class ExpectedTypeUtils{
final PsiMethod method =
PsiTreeUtil.getParentOfType(returnStatement,
PsiMethod.class);
if(method == null){
expectedType = null;
} else{
if (method != null) {
expectedType = method.getReturnType();
}
}
@@ -372,7 +370,8 @@ public class ExpectedTypeUtils{
}
}
@Override public void visitExpressionList(PsiExpressionList expressionList){
@Override public void visitExpressionList(
PsiExpressionList expressionList){
final JavaResolveResult result = findCalledMethod(expressionList);
final PsiMethod method = (PsiMethod) result.getElement();
if(method == null){
@@ -384,6 +383,17 @@ public class ExpectedTypeUtils{
}
}
@Override
public void visitNewExpression(PsiNewExpression expression) {
final PsiExpression[] arrayDimensions =
expression.getArrayDimensions();
for (PsiExpression arrayDimension : arrayDimensions) {
if (wrappedExpression.equals(arrayDimension)) {
expectedType = PsiType.INT;
}
}
}
@NotNull
private static JavaResolveResult findCalledMethod(
PsiExpressionList expressionList){
@@ -1,8 +1,8 @@
package com.siyeh.igtest.confusing;
package com.siyeh.igtest.numeric.implicit_numeric_conversion;
public class ImplicitNumericConversionInspection
public class ImplicitNumericConversion
{
public ImplicitNumericConversionInspection()
public ImplicitNumericConversion()
{
}
@@ -73,14 +73,10 @@ public class ImplicitNumericConversionInspection
{
System.out.println(d);
}
}
class TestQuickFix{
public static final long ONE_HOUR = 3600L;
public void test(){
long time = ONE_HOUR;
long minutes = (time % (3600 * 1000)) / 1000;
long hours = (time % (24 * 3600 * 1000)) / (3600 * 1000);
private void unaryPromotion() {
byte b = 2;
int a[] = new int[b];
a[b] = (byte)1;
}
}
@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>17</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;1&lt;/code&gt; from 'int' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>18</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;i&lt;/code&gt; from 'int' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>21</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;'c'&lt;/code&gt; from 'char' to 'int' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>22</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;ch&lt;/code&gt; from 'char' to 'int' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>24</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;0&lt;/code&gt; from 'int' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>25</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;0.0F&lt;/code&gt; from 'float' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>26</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;-0.0F&lt;/code&gt; from 'float' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>27</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;i&lt;/code&gt; from 'int' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>28</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;ch&lt;/code&gt; from 'char' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>29</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;l&lt;/code&gt; from 'long' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>31</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;f&lt;/code&gt; from 'float' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>33</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;1.0F&lt;/code&gt; from 'float' to 'double' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>35</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;0&lt;/code&gt; from 'int' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>36</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;0L&lt;/code&gt; from 'long' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>38</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;i&lt;/code&gt; from 'int' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>39</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;ch&lt;/code&gt; from 'char' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>40</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;l&lt;/code&gt; from 'long' to 'float' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>44</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;i&lt;/code&gt; from 'int' to 'long' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>45</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;ch&lt;/code&gt; from 'char' to 'long' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>51</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;l&lt;/code&gt; from 'long' to 'int' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>78</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;2&lt;/code&gt; from 'int' to 'byte' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>79</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;b&lt;/code&gt; from 'byte' to 'int' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>80</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;b&lt;/code&gt; from 'byte' to 'int' #loc</description>
</problem>
<problem>
<file>ImplicitNumericConversion.java</file>
<line>80</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Implicit numeric conversion</problem_class>
<description>Implicit numeric conversion of &lt;code&gt;(byte)1&lt;/code&gt; from 'byte' to 'int' #loc</description>
</problem>
</problems>
@@ -0,0 +1,11 @@
package com.siyeh.ig.numeric;
import com.siyeh.ig.IGInspectionTestCase;
public class ImplicitNumericConversionInspectionTest extends IGInspectionTestCase {
public void test() throws Exception {
doTest("com/siyeh/igtest/numeric/implicit_numeric_conversion",
new ImplicitNumericConversionInspection());
}
}