From bfd12da4ad37ae9d8092f52b9e8fd19f794ed9e0 Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 29 Dec 2010 17:55:01 +0300 Subject: [PATCH] field can be local: extend "immutable" types (IDEA-63561) --- .../FieldCanBeLocalInspection.java | 13 ++++++++++++- .../fieldWithImmutableType/expected.xml | 8 ++++++++ .../fieldWithImmutableType/src/Test.java | 8 ++++++++ .../codeInspection/FieldCanBeLocalTest.java | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/expected.xml create mode 100644 java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/src/Test.java diff --git a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java index cecb8c7231d5..8a0303f1cd73 100644 --- a/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/varScopeCanBeNarrowed/FieldCanBeLocalInspection.java @@ -31,6 +31,7 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.JDOMExternalizableStringList; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.WriteExternalException; @@ -190,7 +191,7 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { final PsiElement resolved = readBeforeWrite.resolve(); if (resolved instanceof PsiField) { final PsiField field = (PsiField)resolved; - if (!(field.getType() instanceof PsiPrimitiveType) || !PsiUtil.isConstantExpression(field.getInitializer()) || getWrittenVariables(controlFlow, writtenVariables).contains(field)){ + if (!isImmutableState(field.getType()) || !PsiUtil.isConstantExpression(field.getInitializer()) || getWrittenVariables(controlFlow, writtenVariables).contains(field)){ PsiElement parent = body.getParent(); if (!(parent instanceof PsiMethod) || !((PsiMethod)parent).isConstructor() || @@ -208,6 +209,16 @@ public class FieldCanBeLocalInspection extends BaseLocalInspectionTool { } } + private static boolean isImmutableState(PsiType type) { + if (type instanceof PsiPrimitiveType) { + return true; + } + if (PsiPrimitiveType.getUnboxedType(type) != null) { + return true; + } + return Comparing.strEqual(CommonClassNames.JAVA_LANG_STRING, type.getCanonicalText()); + } + private static Collection getWrittenVariables(ControlFlow controlFlow, Ref> writtenVariables) { if (writtenVariables.get() == null) { writtenVariables.set(ControlFlowUtil.getWrittenVariables(controlFlow, 0, controlFlow.getSize(), false)); diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/expected.xml b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/expected.xml new file mode 100644 index 000000000000..a52b0a101498 --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/expected.xml @@ -0,0 +1,8 @@ + + + + Test.java + 2 + Field can be converted to a local variable + + diff --git a/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/src/Test.java b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/src/Test.java new file mode 100644 index 000000000000..08488ba4557d --- /dev/null +++ b/java/java-tests/testData/inspection/fieldCanBeLocal/fieldWithImmutableType/src/Test.java @@ -0,0 +1,8 @@ +class Test { + private String f = ""; + + void foo () { + f.substring(0); + } + +} diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java index a4bcdf6e5276..07076a6d6321 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/FieldCanBeLocalTest.java @@ -30,6 +30,7 @@ public class FieldCanBeLocalTest extends InspectionTestCase { public void testLocalStateVar2InnerClass() throws Exception { doTest(); } public void testNotConstantInitializer() throws Exception {doTest();} public void testInnerClassFieldInitializer() throws Exception {doTest();} + public void testFieldWithImmutableType() throws Exception {doTest();} public void testIgnoreAnnotated() throws Exception { final FieldCanBeLocalInspection inspection = new FieldCanBeLocalInspection(); inspection.EXCLUDE_ANNOS.add(Deprecated.class.getName());