diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConvention.java b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConvention.java index fba8cbf232f9..727346d47004 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConvention.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConvention.java @@ -15,10 +15,10 @@ */ package com.siyeh.ig.naming; +import com.intellij.codeInspection.dataFlow.Mutability; import com.intellij.codeInspection.naming.NamingConvention; import com.intellij.codeInspection.naming.NamingConventionBean; -import com.intellij.psi.PsiField; -import com.intellij.psi.PsiModifier; +import com.intellij.psi.*; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.psiutils.ClassUtils; @@ -48,6 +48,18 @@ public class ConstantWithMutableFieldTypeNamingConvention extends NamingConventi @Override public boolean isApplicable(PsiField field) { - return field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL) && !ClassUtils.isImmutable(field.getType()); + if (field.hasModifierProperty(PsiModifier.STATIC) && field.hasModifierProperty(PsiModifier.FINAL)) { + PsiExpression initializer = field.getInitializer(); + if (initializer instanceof PsiCallExpression) { + PsiMethod method = ((PsiCallExpression)initializer).resolveMethod(); + if (method != null && Mutability.getMutability(method).isUnmodifiable()) { + return false; + } + } + if (!ClassUtils.isImmutable(field.getType())) { + return true; + } + } + return false; } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/field_naming_convention/ConstantWithMutableFieldTypeNamingConvention.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/field_naming_convention/ConstantWithMutableFieldTypeNamingConvention.java new file mode 100644 index 000000000000..d853438e61bd --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/naming/field_naming_convention/ConstantWithMutableFieldTypeNamingConvention.java @@ -0,0 +1,7 @@ +package com.siyeh.igtest.naming.constant_naming_convention; + +import java.util.*; + +class ConstantNamingConvention { + static final List unmodifiableList = Collections.unmodifiableList(new ArrayList<>()); +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConventionInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConventionInspectionTest.java new file mode 100644 index 000000000000..4d5ba358810f --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/naming/ConstantWithMutableFieldTypeNamingConventionInspectionTest.java @@ -0,0 +1,40 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.siyeh.ig.naming; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.testFramework.IdeaTestUtil; +import com.intellij.testFramework.LightProjectDescriptor; +import com.intellij.testFramework.PsiTestUtil; +import com.intellij.testFramework.fixtures.DefaultLightProjectDescriptor; +import com.siyeh.ig.LightInspectionTestCase; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ConstantWithMutableFieldTypeNamingConventionInspectionTest extends LightInspectionTestCase { + + public void testConstantWithMutableFieldTypeNamingConvention() { + doTest(); + } + + @Nullable + @Override + protected InspectionProfileEntry getInspection() { + FieldNamingConventionInspection inspection = new FieldNamingConventionInspection(); + inspection.setEnabled(true, new ConstantWithMutableFieldTypeNamingConvention().getShortName()); + return inspection; + } + + private static final DefaultLightProjectDescriptor PROJECT_DESCRIPTOR = new DefaultLightProjectDescriptor() { + @Override + public Sdk getSdk() { + return PsiTestUtil.addJdkAnnotations(IdeaTestUtil.getMockJdk18()); + } + }; + + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return PROJECT_DESCRIPTOR; + } +} \ No newline at end of file