java: add import on inner class: disable if qualifier has provided type arguments (IDEA-267858)

fix for deep type parameters, according to the review

GitOrigin-RevId: 77b28eb04ae16ba9e063b10c0f24c4a473f7a3c0
This commit is contained in:
Anna Kozlova
2021-05-04 14:17:14 +02:00
committed by intellij-monorepo-bot
parent 6fc32f26d6
commit a07b56e42c
3 changed files with 20 additions and 7 deletions

View File

@@ -107,13 +107,7 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
.createReferenceFromText(refNameElement.getText(), refExpr);
final PsiElement target = copy.resolve();
if (target != null && PsiTreeUtil.getParentOfType(target, PsiClass.class) != aClass) return null;
PsiElement qualifier = refExpr.getQualifier();
if (qualifier instanceof PsiJavaCodeReferenceElement) {
PsiReferenceParameterList parameterList = ((PsiJavaCodeReferenceElement)qualifier).getParameterList();
if (parameterList != null && parameterList.getTypeParameterElements().length > 0) {
return null;
}
}
if (hasTypeArguments(refExpr.getQualifier())) return null;
}
return new ImportAvailability(qName + "." +refExpr.getReferenceName(), (PsiMember) resolved);
}
@@ -125,6 +119,11 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
return null;
}
private static boolean hasTypeArguments(PsiElement qualifier) {
return !PsiTreeUtil.processElements(qualifier, element -> !(element instanceof PsiReferenceParameterList) ||
((PsiReferenceParameterList)element).getTypeParameterElements().length == 0);
}
private static PsiImportStatementBase findExistingImport(PsiFile file, PsiClass aClass, String refName) {
if (file instanceof PsiJavaFile) {
PsiImportList importList = ((PsiJavaFile)file).getImportList();

View File

@@ -0,0 +1,9 @@
package foo;
class Outer<O> {
public abstract class Inner {
class Inner1 {}
}
final class AnoterInner extends Outer<String>.Inner.Inn<caret>er1 { }
}

View File

@@ -35,6 +35,11 @@ public class AddSingleStaticImportActionTest extends JavaCodeInsightFixtureTestC
assertNull(myFixture.getAvailableIntention("Add import for 'foo.Outer.Inner'"));
}
public void testDisabledInsideParameterizedQualifierReferenceDeep() {
myFixture.configureByFile(getTestName(false) + ".java");
assertNull(myFixture.getAvailableIntention("Add import for 'foo.Outer.Inner.Inner1'"));
}
public void testWrongCandidateAfterImport() {
myFixture.addClass("package foo; class Empty {}"); //to ensure package is in the project
doTest("Add static import for 'foo.Test.X.test'");