From d90276560a4741b267dc8a8a3ab738985ca30dc5 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 20 Feb 2012 16:57:13 +0100 Subject: [PATCH] IDEA-81416 ("Non-private field accessed in synchronized context" triggers for public fields of private member variables) --- ...cessedInSynchronizedContextInspection.java | 26 +++++++++---------- .../Foo.java | 26 +++++++++++++++++++ .../expected.xml | 16 ++++++++++++ ...edInSynchronizedContextInspectionTest.java | 12 +++++++++ 4 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/Foo.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/expected.xml create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspectionTest.java diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspection.java index d2a6455a7f38..653c0986c627 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2012 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. @@ -22,13 +22,11 @@ import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.psiutils.SynchronizationUtil; import org.jetbrains.annotations.NotNull; -public class PublicFieldAccessedInSynchronizedContextInspection - extends BaseInspection { +public class PublicFieldAccessedInSynchronizedContextInspection extends BaseInspection { @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "public.field.accessed.in.synchronized.context.display.name"); + return InspectionGadgetsBundle.message("public.field.accessed.in.synchronized.context.display.name"); } @NotNull @@ -38,34 +36,34 @@ public class PublicFieldAccessedInSynchronizedContextInspection @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "public.field.accessed.in.synchronized.context.problem.descriptor"); + return InspectionGadgetsBundle.message("public.field.accessed.in.synchronized.context.problem.descriptor"); } public BaseInspectionVisitor buildVisitor() { return new PublicFieldAccessedInSynchronizedContextVisitor(); } - private static class PublicFieldAccessedInSynchronizedContextVisitor - extends BaseInspectionVisitor { + private static class PublicFieldAccessedInSynchronizedContextVisitor extends BaseInspectionVisitor { @Override - public void visitReferenceExpression( - @NotNull PsiReferenceExpression expression) { + public void visitReferenceExpression(@NotNull PsiReferenceExpression expression) { + final PsiExpression qualifier = expression.getQualifierExpression(); + if (qualifier != null && !(qualifier instanceof PsiThisExpression) && !(qualifier instanceof PsiSuperExpression)) { + return; + } final PsiElement element = expression.resolve(); if (!(element instanceof PsiField)) { return; } final PsiField field = (PsiField)element; - if (field.hasModifierProperty(PsiModifier.PRIVATE) || - field.hasModifierProperty(PsiModifier.FINAL)) { + if (field.hasModifierProperty(PsiModifier.PRIVATE) || field.hasModifierProperty(PsiModifier.FINAL)) { return; } if (!SynchronizationUtil.isInSynchronizedContext(expression)) { return; } final PsiClass containingClass = field.getContainingClass(); - if (containingClass.hasModifierProperty(PsiModifier.PRIVATE)) { + if (containingClass == null || containingClass.hasModifierProperty(PsiModifier.PRIVATE)) { return; } registerError(expression); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/Foo.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/Foo.java new file mode 100644 index 000000000000..8aeff1248395 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/Foo.java @@ -0,0 +1,26 @@ +package com.siyeh.igtest.threading.public_field_accessed_in_synchronized_context; + +import java.util.List; + +class Bar2 { + public String field1; + private String field2; + + public void setField2(String s) { + field2 = s; + } +} +public class Foo { + public Bar2 myBar; + private List myBars; + + synchronized public void setSingle() { + myBar.field1 = "bar"; + myBar.setField2("bar"); + } + + synchronized public void setViaList() { + myBars.iterator().next().field1 = "bar"; + myBars.iterator().next().setField2("bar"); + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/expected.xml new file mode 100644 index 000000000000..180519b7f224 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context/expected.xml @@ -0,0 +1,16 @@ + + + + Foo.java + 18 + Non-private field accessed in synchronized context + Non-private field <code>myBar</code> accessed in synchronized context #loc + + + + Foo.java + 19 + Non-private field accessed in synchronized context + Non-private field <code>myBar</code> accessed in synchronized context #loc + + \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspectionTest.java new file mode 100644 index 000000000000..3f766a4631b0 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/threading/PublicFieldAccessedInSynchronizedContextInspectionTest.java @@ -0,0 +1,12 @@ +package com.siyeh.ig.threading; + +import com.siyeh.ig.IGInspectionTestCase; + +public class PublicFieldAccessedInSynchronizedContextInspectionTest + extends IGInspectionTestCase { + + public void test() throws Exception { + doTest("com/siyeh/igtest/threading/public_field_accessed_in_synchronized_context", + new PublicFieldAccessedInSynchronizedContextInspection()); + } +} \ No newline at end of file