can be final: do not suggest to make final if overriding constructor reassign the field

This commit is contained in:
anna
2011-07-11 09:40:42 +04:00
parent cc9f66001a
commit 972167979b
4 changed files with 40 additions and 1 deletions
@@ -99,7 +99,8 @@ class CanBeFinalAnnotator extends RefGraphAnnotatorEx {
boolean forReading,
boolean forWriting) {
if (!(refWhat instanceof RefField)) return;
if (!(refFrom instanceof RefMethod) || !((RefMethod)refFrom).isConstructor() || ((PsiField)refWhat.getElement()).hasInitializer()) {
if (!(refFrom instanceof RefMethod) || !((RefMethod)refFrom).isConstructor() || ((PsiField)refWhat.getElement()).hasInitializer() ||
((RefMethod)refFrom).getOwnerClass() != ((RefField)refWhat).getOwnerClass()) {
if (!referencedFromClassInitializer && forWriting) {
((RefFieldImpl)refWhat).setFlag(false, CAN_BE_FINAL_MASK);
}
@@ -0,0 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<problems />
@@ -0,0 +1,31 @@
/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
public class A {
protected String myString;
protected String myAnotherString;
public A(String s) {
myString = s;
}
}
final class AImpl extends A {
public AImpl(String s) {
super(s);
myString = s + "";
myAnotherString = s;
}
}
@@ -30,6 +30,10 @@ public class CanBeFinalTest extends InspectionTestCase {
doTest("canBeFinal/" + getTestName(false), tool);
}
public void testsimpleClassInheritanceField() throws Exception {
doTest();
}
public void testsimpleClassInheritance() throws Exception {
doTest();
}