Fix "Field repeatedly accessed in method" bug

This commit is contained in:
Bas Leijdekkers
2011-07-12 17:23:31 +02:00
parent 3db3301161
commit 62a0380d27
4 changed files with 42 additions and 8 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2003-2010 Dave Griffith, Bas Leijdekkers
* Copyright 2003-2011 Dave Griffith, Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -29,13 +29,14 @@ class VariableAccessVisitor extends JavaRecursiveElementVisitor {
new HashSet<PsiField>(2);
@Override public void visitReferenceExpression(
@NotNull PsiReferenceExpression ref) {
super.visitReferenceExpression(ref);
final PsiExpression qualifier = ref.getQualifierExpression();
@NotNull PsiReferenceExpression referenceExpression) {
super.visitReferenceExpression(referenceExpression);
final PsiExpression qualifier =
referenceExpression.getQualifierExpression();
if (qualifier != null && !(qualifier instanceof PsiThisExpression)) {
return;
}
final PsiElement element = ref.resolve();
final PsiElement element = referenceExpression.resolve();
if (!(element instanceof PsiField)) {
return;
}
@@ -44,15 +45,15 @@ class VariableAccessVisitor extends JavaRecursiveElementVisitor {
if (overAccessedFields.contains(field)) {
return;
}
if (ControlFlowUtils.isInLoop(field)) {
if (ControlFlowUtils.isInLoop(referenceExpression)) {
overAccessedFields.add(field);
}
final Map<PsiField,Integer> accessCounts = m_accessCounts;
final Integer count = accessCounts.get(field);
if (count == null) {
accessCounts.put(field, 1);
accessCounts.put(field, Integer.valueOf(1));
} else if (count.intValue() == 1) {
accessCounts.put(field, 2);
accessCounts.put(field, Integer.valueOf(2));
} else {
overAccessedFields.add(field);
}
@@ -0,0 +1,12 @@
package com.siyeh.igtest.j2me.field_repeatedly_accessed;
public class FieldRepeatedlyAccessed {
String s = "";
void foo() {
while(true) {
System.out.println(s);
}
}
}
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems>
<problem>
<file>FieldRepeatedlyAccessed.java</file>
<line>7</line>
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Field repeatedly accessed in method</problem_class>
<description>Field 's' accessed repeatedly in method &lt;code&gt;foo(0&lt;/code&gt; #loc</description>
</problem>
</problems>
@@ -0,0 +1,11 @@
package com.siyeh.ig.j2me;
import com.siyeh.ig.IGInspectionTestCase;
public class FieldRepeatedlyAccessedInspectionTest extends IGInspectionTestCase {
public void test() throws Exception {
doTest("com/siyeh/igtest/j2me/field_repeatedly_accessed",
new FieldRepeatedlyAccessedInspection());
}
}