enable add import for inner classes (IDEA-183488)

This commit is contained in:
Anna.Kozlova
2017-12-14 11:41:51 +01:00
parent 0bc1e140a3
commit 571b62d662
4 changed files with 33 additions and 3 deletions
@@ -24,6 +24,7 @@ import com.intellij.codeInsight.intention.BaseElementAtCaretIntentionAction;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
@@ -76,7 +77,8 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
JavaResolveResult[] results = refExpr.multiResolve(false);
for (JavaResolveResult result : results) {
final PsiElement resolved = result.getElement();
if (resolved instanceof PsiMember && ((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.STATIC)) {
if (resolved instanceof PsiMember && ((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.STATIC) ||
resolved instanceof PsiClass) {
PsiClass aClass = getResolvedClass(element, (PsiMember)resolved);
String qName = aClass != null ? aClass.getQualifiedName() : null;
if (aClass != null &&
@@ -256,7 +258,9 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
}
}
}
else if (referent == null || referent instanceof PsiMember && ((PsiMember)referent).hasModifierProperty(PsiModifier.STATIC)) {
else if (referent == null ||
referent instanceof PsiClass ||
referent instanceof PsiMember && ((PsiMember)referent).hasModifierProperty(PsiModifier.STATIC)) {
if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
PsiElement aClass = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
if (aClass instanceof PsiVariable) {
@@ -269,7 +273,7 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
catch (IncorrectOperationException e) {
LOG.error(e);
}
if (reference.resolve() != referent) {
if (!Comparing.equal(reference.resolve(), referent)) {
reference = rebind(reference, resolvedClass);
}
}
@@ -0,0 +1,8 @@
import foo.Foo;
class Test {
void test() {
Foo.B<caret>ar bar;
}
}
@@ -0,0 +1,9 @@
import foo.Foo;
import foo.Foo.Bar;
class Test {
void test() {
Bar bar;
}
}
@@ -155,6 +155,15 @@ public class AddSingleStaticImportActionTest extends JavaCodeInsightFixtureTestC
assertNull(intention);
}
public void testNonStaticInnerClassImport() {
myFixture.addClass("package foo; public class Foo {public class Bar {}}");
myFixture.configureByFile(getTestName(false) + ".java");
IntentionAction intention = myFixture.getAvailableIntention("Add import for 'foo.Foo.Bar'");
assertNotNull(intention);
myFixture.launchAction(intention);
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
public void testProhibitWhenMethodWithIdenticalSignatureAlreadyImportedFromAnotherClass() {
myFixture.addClass("package foo; class Foo {public static void foo(int i){}}");
myFixture.addClass("package foo; class Bar {public static void foo(int i){}}");