CommentTracker: support removal of reference qualifier; used in AddSingleMemberStaticImportAction

This commit is contained in:
Tagir Valeev
2018-01-18 12:00:24 +07:00
parent 32e4a691f1
commit 44585d34d9
5 changed files with 54 additions and 8 deletions
@@ -35,9 +35,12 @@ import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntentionAction {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.intention.impl.AddSingleMemberStaticImportAction");
private static final Key<PsiElement> TEMP_REFERENT_USER_DATA = new Key<>("TEMP_REFERENT_USER_DATA");
@@ -99,7 +102,7 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
final PsiElement currentFileResolveScope = resolveResult.getCurrentFileResolveScope();
if (currentFileResolveScope instanceof PsiImportStaticStatement) {
//don't hide another on-demand import and don't create ambiguity
if (MethodSignatureUtil.areSignaturesEqual((PsiMethod)method, (PsiMethod)resolved)) {
if (resolved instanceof PsiMethod && MethodSignatureUtil.areSignaturesEqual((PsiMethod)method, (PsiMethod)resolved)) {
return null;
}
}
@@ -268,7 +271,7 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
}
if (aClass instanceof PsiClass && InheritanceUtil.isInheritorOrSelf((PsiClass)aClass, resolvedClass, true)) {
try {
qualifierExpression.delete();
new CommentTracker().deleteAndRestoreComments(qualifierExpression);
}
catch (IncorrectOperationException e) {
LOG.error(e);
@@ -293,7 +296,8 @@ public class AddSingleMemberStaticImportAction extends BaseElementAtCaretIntenti
PsiElementFactory factory = JavaPsiFacade.getInstance(reference.getProject()).getElementFactory();
PsiReferenceExpression copy = (PsiReferenceExpression)factory.createExpressionFromText("A." + reference.getReferenceName(), null);
reference = (PsiReferenceExpression)reference.replace(copy);
((PsiReferenceExpression)reference.getQualifier()).bindToElement(targetClass);
PsiReferenceExpression qualifier = Objects.requireNonNull((PsiReferenceExpression)reference.getQualifier());
qualifier.bindToElement(targetClass);
return reference;
}
@@ -0,0 +1,8 @@
import java.util.*;
class Test {
void test() {
List<String> list = /*1*/Arrays/*2*/./*3*/as<caret>List/*4*/("foo", "bar");
List<String> list2 = /*1*/Arrays/*2*/./*3*/asList/*4*/("baz", "qux");
}
}
@@ -0,0 +1,10 @@
import java.util.*;
import static java.util.Arrays.asList;
class Test {
void test() {
List<String> list = /*1*//*2*//*3*/asList/*4*/("foo", "bar");
List<String> list2 = /*1*//*2*//*3*/asList/*4*/("baz", "qux");
}
}
@@ -173,6 +173,14 @@ public class AddSingleStaticImportActionTest extends JavaCodeInsightFixtureTestC
assertNull(intention);
}
public void testComment() {
myFixture.configureByFile(getTestName(false) + ".java");
IntentionAction intention = myFixture.getAvailableIntention("Add static import for 'java.util.Arrays.asList'");
assertNotNull(intention);
myFixture.launchAction(intention);
myFixture.checkResultByFile(getTestName(false) + "_after.java");
}
@Override
protected String getTestDataPath() {
return JavaTestUtil.getJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport";
@@ -87,10 +87,7 @@ public class CommentTracker {
* @param element element to delete
*/
public void delete(@NotNull PsiElement element) {
if (element instanceof PsiExpression && element.getParent() instanceof PsiExpressionStatement) {
element = element.getParent();
}
grabComments(element);
grabCommentsOnDelete(element);
element.delete();
}
@@ -114,7 +111,7 @@ public class CommentTracker {
* @param element element to delete
*/
public void deleteAndRestoreComments(@NotNull PsiElement element) {
grabComments(element);
grabCommentsOnDelete(element);
insertCommentsBefore(element instanceof PsiVariable ? element.getParent() : element);
element.delete();
}
@@ -264,6 +261,25 @@ public class CommentTracker {
return ignoredParents.stream().anyMatch(p -> PsiTreeUtil.isAncestor(p, comment, false));
}
private void grabCommentsOnDelete(PsiElement element) {
if (element instanceof PsiExpression && element.getParent() instanceof PsiExpressionStatement) {
element = element.getParent();
}
if (element.getParent() instanceof PsiJavaCodeReferenceElement) {
PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement)element.getParent();
if (element == ref.getQualifier()) {
for (PsiElement child : ref.getChildren()) {
if(child.textMatches(".")) {
break;
}
grabComments(child);
}
return;
}
}
grabComments(element);
}
private void grabComments(PsiElement element) {
checkState();
for (PsiComment comment : PsiTreeUtil.collectElementsOfType(element, PsiComment.class)) {