IDEADEV-28589 Add quickfix "Make field final" for "Field accessed in synchronized...
[fedora-idea.git] / plugins / InspectionGadgets / src / com / siyeh / ig / threading / FieldAccessedSynchronizedAndUnsynchronizedInspection.java
blobc301ccd8fd023102d4a4c94aca361ee9de3ddc9c
1 /*
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;
31 import javax.swing.*;
32 import java.util.Set;
34 public class FieldAccessedSynchronizedAndUnsynchronizedInspection
35 extends BaseInspection {
37 /** @noinspection PublicField*/
38 public boolean countGettersAndSetters = false;
40 @Override @NotNull
41 public String getDisplayName(){
42 return InspectionGadgetsBundle.message(
43 "field.accessed.synchronized.and.unsynchronized.display.name");
46 @Override @NotNull
47 protected String buildErrorString(Object... infos){
48 return InspectionGadgetsBundle.message(
49 "field.accessed.synchronized.and.unsynchronized.problem.descriptor");
52 @Override
53 @Nullable
54 public JComponent createOptionsPanel() { return new SingleCheckboxOptionsPanel(
55 InspectionGadgetsBundle.message(
56 "field.accessed.synchronized.and.unsynchronized.option"),
57 this, "countGettersAndSetters");
60 @Override
61 public boolean runForWholeFile() {
62 return true;
65 @Override
66 protected InspectionGadgetsFix buildFix(Object... infos) {
67 return MakeFieldFinalFix.buildFix((PsiField)infos[0]);
70 @Override
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)){
80 return;
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)) {
90 continue;
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();