AddOnDemandStaticImportAction: handle comments

This commit is contained in:
Tagir Valeev
2018-01-25 12:05:05 +07:00
parent f4211ff3e1
commit eeb1483ed0
3 changed files with 52 additions and 20 deletions
@@ -28,11 +28,13 @@ import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import gnu.trove.TIntArrayList;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author ven
@@ -145,7 +147,8 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc
PsiElement copy = root.copy();
final PsiManager manager = root.getManager();
final TIntArrayList expressionToDequalifyOffsets = new TIntArrayList();
List<PsiJavaCodeReferenceElement> expressionsToDequalify = new ArrayList<>();
copy.accept(new JavaRecursiveElementWalkingVisitor() {
int delta;
@Override
@@ -163,7 +166,16 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc
delta += end - expression.getTextRange().getEndOffset();
PsiElement after = expression.resolve();
if (manager.areElementsEquivalent(after, resolved)) {
expressionToDequalifyOffsets.add(expression.getTextRange().getStartOffset() + delta);
int offset = expression.getTextRange().getStartOffset() + delta;
PsiJavaCodeReferenceElement originalExpression =
PsiTreeUtil.findElementOfClassAtOffset(root, offset, PsiJavaCodeReferenceElement.class, false);
if (originalExpression != null) {
PsiElement originalQualifier = originalExpression.getQualifier();
if (originalQualifier instanceof PsiJavaCodeReferenceElement &&
((PsiJavaCodeReferenceElement)originalQualifier).isReferenceTo(aClass)) {
expressionsToDequalify.add(originalExpression);
}
}
}
else {
conflict.set(true);
@@ -177,24 +189,18 @@ public class AddOnDemandStaticImportAction extends BaseElementAtCaretIntentionAc
}
});
expressionToDequalifyOffsets.forEachDescending(offset -> {
PsiJavaCodeReferenceElement expression = PsiTreeUtil.findElementOfClassAtOffset(root, offset, PsiJavaCodeReferenceElement.class, false);
if (expression == null) {
return false;
for (PsiJavaCodeReferenceElement expression : expressionsToDequalify) {
new CommentTracker().deleteAndRestoreComments(Objects.requireNonNull(expression.getQualifier()));
}
if (editor != null) {
for (PsiJavaCodeReferenceElement expression : expressionsToDequalify) {
HighlightManager.getInstance(project)
.addRangeHighlight(editor, expression.getTextRange().getStartOffset(), expression.getTextRange().getEndOffset(),
EditorColorsManager.getInstance().getGlobalScheme()
.getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES),
false, null);
}
PsiElement qualifierExpression = expression.getQualifier();
if (qualifierExpression instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)qualifierExpression).isReferenceTo(aClass)) {
qualifierExpression.delete();
if (editor != null) {
HighlightManager.getInstance(project)
.addRangeHighlight(editor, expression.getTextRange().getStartOffset(), expression.getTextRange().getEndOffset(),
EditorColorsManager.getInstance().getGlobalScheme().getAttributes(EditorColors.SEARCH_RESULT_ATTRIBUTES),
false, null);
}
}
return true;
});
}
}
return conflict.get();
}
@@ -0,0 +1,14 @@
// "Add on demand static import for 'java.util.Arrays'" "true"
import java.util.*;
import static java.util.Arrays.*;
class Foo {
void test(String[] foos, String[] bars) {
System.out.println(/*foos1*//*foos2*/asList(foos)+":"+ /*bars1*//*bars2*/asList(bars));
}
void test2(String[] foos, String[] bars) {
System.out.println(/*foos1*//*foos2*/asList(foos)+":"+ /*bars1*//*bars2*/asList(bars));
}
}
@@ -0,0 +1,12 @@
// "Add on demand static import for 'java.util.Arrays'" "true"
import java.util.*;
class Foo {
void test(String[] foos, String[] bars) {
System.out.println(<caret>Arrays/*foos1*/./*foos2*/asList(foos)+":"+Arrays/*bars1*/./*bars2*/asList(bars));
}
void test2(String[] foos, String[] bars) {
System.out.println(Arrays/*foos1*/./*foos2*/asList(foos)+":"+Arrays/*bars1*/./*bars2*/asList(bars));
}
}