diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnqualifiedInnerClassAccessInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnqualifiedInnerClassAccessInspection.java index fdc224f4453b..0584a64c2120 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnqualifiedInnerClassAccessInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/style/UnqualifiedInnerClassAccessInspection.java @@ -23,6 +23,7 @@ import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.InspectionGadgetsFix; +import com.siyeh.ig.psiutils.ClassUtils; import com.siyeh.ig.psiutils.HighlightUtils; import com.siyeh.ig.psiutils.ImportUtils; import org.jetbrains.annotations.NotNull; @@ -68,8 +69,8 @@ public class UnqualifiedInnerClassAccessInspection extends UnqualifiedInnerClass if (!(target instanceof PsiClass)) { return; } - final PsiClass aClass = (PsiClass)target; - final PsiClass containingClass = aClass.getContainingClass(); + final PsiClass innerClass = (PsiClass)target; + final PsiClass containingClass = innerClass.getContainingClass(); if (containingClass == null) { return; } @@ -82,7 +83,7 @@ public class UnqualifiedInnerClassAccessInspection extends UnqualifiedInnerClass return; } final PsiJavaFile javaFile = (PsiJavaFile)containingFile; - final String innerClassName = aClass.getQualifiedName(); + final String innerClassName = innerClass.getQualifiedName(); if (innerClassName == null) { return; } @@ -132,7 +133,8 @@ public class UnqualifiedInnerClassAccessInspection extends UnqualifiedInnerClass if (referenceImportStatement != null) { referenceImportStatement.delete(); } - ImportUtils.addImportIfNeeded(containingClass, referenceElement); + final PsiClass outerClass = ClassUtils.getOutermostContainingClass(containingClass); + ImportUtils.addImportIfNeeded(outerClass, referenceElement); final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); final Document document = documentManager.getDocument(containingFile); if (document == null) { @@ -158,7 +160,7 @@ public class UnqualifiedInnerClassAccessInspection extends UnqualifiedInnerClass } //noinspection SuspiciousMethodCalls if (references.contains(element)) { - final String shortClassName = aClass.getName(); + final String shortClassName = getShortClassName(aClass, new StringBuilder()).toString(); if (isReferenceToTargetClass(shortClassName, aClass, element)) { out.append(shortClassName); } @@ -178,6 +180,16 @@ public class UnqualifiedInnerClassAccessInspection extends UnqualifiedInnerClass return out; } + private static StringBuilder getShortClassName(@NotNull PsiClass aClass, @NotNull StringBuilder builder) { + final PsiClass containingClass = aClass.getContainingClass(); + if (containingClass != null) { + getShortClassName(containingClass, builder); + builder.append('.'); + } + builder.append(aClass.getName()); + return builder; + } + private static boolean isReferenceToTargetClass(String referenceText, PsiClass targetClass, PsiElement context) { final PsiManager manager = targetClass.getManager(); final JavaPsiFacade facade = JavaPsiFacade.getInstance(manager.getProject()); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.after.java new file mode 100644 index 000000000000..9fbfaabe738a --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.after.java @@ -0,0 +1,14 @@ +package unqualified_inner_class_access; + +class Deep { + public static class One { + public static class Two { + public static class Three {} + } + } +} +class User { + public static void main(String[] args) { + new Deep.One.Two.Three(); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.java new file mode 100644 index 000000000000..66f4544e05af --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/style/unqualified_inner_class_access/Deep.java @@ -0,0 +1,16 @@ +package unqualified_inner_class_access; + +import unqualified_inner_class_access.Deep.One.Two.Three; + +class Deep { + public static class One { + public static class Two { + public static class Three {} + } + } +} +class User { + public static void main(String[] args) { + new Three(); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/style/UnqualifiedInnerClassAccessFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/style/UnqualifiedInnerClassAccessFixTest.java new file mode 100644 index 000000000000..61a26128cc02 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/style/UnqualifiedInnerClassAccessFixTest.java @@ -0,0 +1,36 @@ +/* + * 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.fixes.style; + +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.IGQuickFixesTestCase; +import com.siyeh.ig.style.UnqualifiedInnerClassAccessInspection; + +/** + * @author Bas Leijdekkers + */ +public class UnqualifiedInnerClassAccessFixTest extends IGQuickFixesTestCase { + + @Override + protected void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(new UnqualifiedInnerClassAccessInspection()); + myRelativePath = "style/unqualified_inner_class_access"; + myDefaultHint = InspectionGadgetsBundle.message("unqualified.inner.class.access.quickfix"); + } + + public void testDeep() { doTest(); } +}