qualify with all containing classes not just the first one

This commit is contained in:
Bas Leijdekkers
2014-02-05 12:17:45 +01:00
parent 252e5f8045
commit 37ea597dcc
4 changed files with 83 additions and 5 deletions
@@ -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());
@@ -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();
}
}
@@ -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 <caret>Three();
}
}
@@ -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(); }
}