mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
CommentTracker: support removal of reference qualifier; used in AddSingleMemberStaticImportAction
This commit is contained in:
+7
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+8
@@ -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");
|
||||
}
|
||||
}
|
||||
+10
@@ -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");
|
||||
}
|
||||
}
|
||||
+8
@@ -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";
|
||||
|
||||
+21
-5
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user