From d4ff7e2ed6bd37f2b0b9657d5f1201c0bf28d331 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Sun, 2 Feb 2014 19:05:04 +0100 Subject: [PATCH] IDEA-119415 (Inspection for Static field/method referenced via subclass should ignore fields/methods in non accessible base class.) --- .../bugs/StaticCallOnSubclassInspection.java | 9 ++-- ...ticFieldReferenceOnSubclassInspection.java | 12 ++--- .../src/com/siyeh/ig/psiutils/ClassUtils.java | 19 +------ .../igtest/bugs/StaticCallOnSubclass.java | 17 ------ ...ieldReferenceOnSubclassInspectionTest.java | 54 +++++++++++++++++++ 5 files changed, 64 insertions(+), 47 deletions(-) delete mode 100644 plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/StaticCallOnSubclass.java create mode 100644 plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspectionTest.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticCallOnSubclassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticCallOnSubclassInspection.java index 5e9e6e5449d9..237ec31f748c 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticCallOnSubclassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticCallOnSubclassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,6 @@ import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.PsiReplacementUtil; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class StaticCallOnSubclassInspection extends BaseInspection { @@ -141,10 +140,8 @@ public class StaticCallOnSubclassInspection extends BaseInspection { if (declaringClass.equals(referencedClass)) { return; } - final PsiClass containingClass = - ClassUtils.getContainingClass(call); - if (!ClassUtils.isClassVisibleFromClass(containingClass, - declaringClass)) { + final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(call.getProject()).getResolveHelper(); + if (!resolveHelper.isAccessible(declaringClass, call, null)) { return; } registerMethodCallError(call, declaringClass, referencedClass); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java index 934dc29c58a3..696df9bd2fb0 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2008 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,6 @@ import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.ig.PsiReplacementUtil; -import com.siyeh.ig.psiutils.ClassUtils; import org.jetbrains.annotations.NotNull; public class StaticFieldReferenceOnSubclassInspection @@ -124,13 +123,14 @@ public class StaticFieldReferenceOnSubclassInspection if (declaringClass.equals(referencedClass)) { return; } - final PsiClass containingClass = - ClassUtils.getContainingClass(expression); - if (!ClassUtils.isClassVisibleFromClass(containingClass, - declaringClass)) { + final PsiResolveHelper resolveHelper = JavaPsiFacade.getInstance(expression.getProject()).getResolveHelper(); + if (!resolveHelper.isAccessible(declaringClass, expression, null)) { return; } final PsiElement identifier = expression.getReferenceNameElement(); + if (identifier == null) { + return; + } registerError(identifier, declaringClass, referencedClass); } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java index 9bbc5b6065a5..40daa3332896 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ClassUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2003-2013 Dave Griffith, Bas Leijdekkers + * Copyright 2003-2014 Dave Griffith, Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -206,21 +206,4 @@ public class ClassUtils { final PsiClass parentClass = (PsiClass)parent; return !parentClass.isInterface(); } - - public static boolean isClassVisibleFromClass(PsiClass baseClass, - PsiClass referencedClass) { - if (referencedClass.hasModifierProperty(PsiModifier.PUBLIC)) { - return true; - } - else if (referencedClass.hasModifierProperty(PsiModifier.PROTECTED)) { - return inSamePackage(baseClass, referencedClass); - } - else if (referencedClass.hasModifierProperty(PsiModifier.PRIVATE)) { - return PsiTreeUtil.findCommonParent(baseClass, referencedClass) != - null; - } - else { - return inSamePackage(baseClass, referencedClass); - } - } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/StaticCallOnSubclass.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/StaticCallOnSubclass.java deleted file mode 100644 index 55dfea251b93..000000000000 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/StaticCallOnSubclass.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.siyeh.igtest.bugs; - -import com.siyeh.igtest.abstraction.StaticCallOnSubclassChild; - -public class StaticCallOnSubclass { - - public void foo() throws InterruptedException { - Thread.sleep(1000L); - InnerThread.sleep(1000L, 1000); - final int priority = InnerThread.MAX_PRIORITY; - StaticCallOnSubclassChild.foo(); - } - - class InnerThread extends Thread - { - } -} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspectionTest.java new file mode 100644 index 000000000000..33c74e4b4262 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/StaticFieldReferenceOnSubclassInspectionTest.java @@ -0,0 +1,54 @@ +/* + * Copyright 2000-2014 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. + */ +package com.siyeh.ig.bugs; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.siyeh.ig.LightInspectionTestCase; + +/** + * @author Bas Leijdekkers + */ +public class StaticFieldReferenceOnSubclassInspectionTest extends LightInspectionTestCase { + @Override + protected InspectionProfileEntry getInspection() { + return new StaticFieldReferenceOnSubclassInspection(); + } + + @Override + protected String[] getEnvironmentClasses() { + return new String[] { + "package a;" + + "public class A {" + + " private static class AA {\n" + + " public static final int VALUE = 5;\n" + + " }" + + " public static class AB extends AA {\n" + + " }" + + " public static final String S = \"\";" + + "}", + "package a;" + + "public class B extends A {}" + }; + } + + public void testSimple() { + doStatementTest("System.out.println(a.B./*Static field 'S' declared in class 'a.A' but referenced via subclass 'a.B'*/S/**/);"); + } + + public void testNoWarn() { + doStatementTest("System.out.println(a.A.AB.VALUE);"); + } +}