2 * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com
.siyeh
.ig
.threading
;
18 import com
.intellij
.psi
.PsiClass
;
19 import com
.intellij
.psi
.PsiField
;
20 import com
.intellij
.psi
.PsiModifier
;
21 import com
.intellij
.psi
.PsiElement
;
22 import com
.siyeh
.InspectionGadgetsBundle
;
23 import com
.siyeh
.ig
.BaseInspection
;
24 import com
.siyeh
.ig
.BaseInspectionVisitor
;
25 import com
.siyeh
.ig
.InspectionGadgetsFix
;
26 import com
.siyeh
.ig
.fixes
.MakeFieldFinalFix
;
27 import com
.siyeh
.ig
.ui
.SingleCheckboxOptionsPanel
;
28 import org
.jetbrains
.annotations
.NotNull
;
29 import org
.jetbrains
.annotations
.Nullable
;
34 public class FieldAccessedSynchronizedAndUnsynchronizedInspection
35 extends BaseInspection
{
37 /** @noinspection PublicField*/
38 public boolean countGettersAndSetters
= false;
41 public String
getDisplayName(){
42 return InspectionGadgetsBundle
.message(
43 "field.accessed.synchronized.and.unsynchronized.display.name");
47 protected String
buildErrorString(Object
... infos
){
48 return InspectionGadgetsBundle
.message(
49 "field.accessed.synchronized.and.unsynchronized.problem.descriptor");
54 public JComponent
createOptionsPanel() { return new SingleCheckboxOptionsPanel(
55 InspectionGadgetsBundle
.message(
56 "field.accessed.synchronized.and.unsynchronized.option"),
57 this, "countGettersAndSetters");
61 public boolean runForWholeFile() {
66 protected InspectionGadgetsFix
buildFix(Object
... infos
) {
67 return MakeFieldFinalFix
.buildFix((PsiField
)infos
[0]);
71 public BaseInspectionVisitor
buildVisitor(){
72 return new FieldAccessedSynchronizedAndUnsynchronizedVisitor();
75 private class FieldAccessedSynchronizedAndUnsynchronizedVisitor
76 extends BaseInspectionVisitor
{
78 @Override public void visitClass(@NotNull PsiClass aClass
){
79 if(!containsSynchronization(aClass
)){
82 final VariableAccessVisitor visitor
=
83 new VariableAccessVisitor(aClass
, countGettersAndSetters
);
84 aClass
.accept(visitor
);
85 final Set
<PsiField
> fields
=
86 visitor
.getInappropriatelyAccessedFields();
87 for(final PsiField field
: fields
){
88 if (field
.hasModifierProperty(PsiModifier
.FINAL
) ||
89 field
.hasModifierProperty(PsiModifier
.VOLATILE
)) {
92 final PsiClass containingClass
= field
.getContainingClass();
93 if(aClass
.equals(containingClass
)){
94 registerFieldError(field
, field
);
99 private boolean containsSynchronization(PsiElement context
){
100 final ContainsSynchronizationVisitor visitor
=
101 new ContainsSynchronizationVisitor();
102 context
.accept(visitor
);
103 return visitor
.containsSynchronization();