support .class guard (IDEA-169707)

This commit is contained in:
Anna.Kozlova
2017-03-21 17:21:27 +01:00
parent a862d1694f
commit 4184796590
3 changed files with 28 additions and 9 deletions
@@ -91,11 +91,19 @@ public class FieldAccessNotGuardedInspection extends BaseJavaBatchLocalInspectio
if (JCiPUtil.isGuardedBy(containingMethod, guard) || containingMethod.isConstructor()) {
return;
}
if (containingMethod.hasModifierProperty(PsiModifier.SYNCHRONIZED) && guardExpression instanceof PsiThisExpression) {
final PsiThisExpression thisExpression = (PsiThisExpression)guardExpression;
final PsiClass aClass = getClassFromThisExpression(thisExpression, field);
if (aClass == null || aClass.equals(containingMethod.getContainingClass())) {
return;
if (containingMethod.hasModifierProperty(PsiModifier.SYNCHRONIZED)) {
if (guardExpression instanceof PsiThisExpression) {
final PsiThisExpression thisExpression = (PsiThisExpression)guardExpression;
final PsiClass aClass = getClassFromThisExpression(thisExpression, field);
if (aClass == null || aClass.equals(containingMethod.getContainingClass())) {
return;
}
}
else if (containingMethod.hasModifierProperty(PsiModifier.STATIC) && guardExpression instanceof PsiClassObjectAccessExpression) {
PsiClass psiClass = PsiUtil.resolveClassInType(((PsiClassObjectAccessExpression)guardExpression).getOperand().getType());
if (psiClass == null || psiClass.equals(containingMethod.getContainingClass())) {
return;
}
}
}
}
@@ -0,0 +1,10 @@
import javax.annotation.concurrent.GuardedBy;
class GuardedByDemo {
@GuardedBy("GuardedByDemo.class")
static final long foo = 23;
synchronized static void bar() {
long a = foo;
}
}
@@ -28,22 +28,22 @@ public class FieldAccessedNotGuardedInspectionTest extends LightCodeInsightFixtu
}
public void testJavax_itself() throws Exception {
myFixture.addClass("package javax.annotation.concurrent;\n" + getGuardedByAnnotationText());
doTest();
}
public void testSyncOnFieldQualifier() throws Exception {
myFixture.addClass("package javax.annotation.concurrent;\n" + getGuardedByAnnotationText());
doTest();
}
public void testFieldAccessNotGuarded() {
myFixture.addClass("package javax.annotation.concurrent;\n" + getGuardedByAnnotationText());
doTest();
}
public void testCheapReadWriteLock() {
myFixture.addClass("package javax.annotation.concurrent;\n" + getGuardedByAnnotationText());
doTest();
}
public void testStaticSyncOnClass() {
doTest();
}
@@ -64,6 +64,7 @@ public class FieldAccessedNotGuardedInspectionTest extends LightCodeInsightFixtu
@Override
protected void setUp() throws Exception {
super.setUp();
myFixture.addClass("package javax.annotation.concurrent;\n" + getGuardedByAnnotationText());
myFixture.enableInspections(new FieldAccessNotGuardedInspection());
}