field naming convention: retrieve mutability from external annotations

IDEA-187941
This commit is contained in:
Anna.Kozlova
2018-03-09 11:44:47 +01:00
parent 51f6813ee3
commit a2cac15bf5
3 changed files with 62 additions and 3 deletions
@@ -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;
}
}
@@ -0,0 +1,7 @@
package com.siyeh.igtest.naming.constant_naming_convention;
import java.util.*;
class ConstantNamingConvention {
static final List<String> unmodifiableList = Collections.unmodifiableList(new ArrayList<>());
}
@@ -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;
}
}