mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-13 21:55:01 +07:00
IDEA-36326 "set" support added
This commit is contained in:
+59
-8
@@ -21,9 +21,11 @@ import com.intellij.codeInsight.intention.IntentionAction;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.CodeStyleManager;
|
||||
import com.intellij.psi.util.TypeConversionUtil;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* @author Danila Ponomarenko
|
||||
@@ -50,24 +52,36 @@ public class ReplaceWithListAccessFix implements IntentionAction {
|
||||
@Override
|
||||
public boolean isAvailable(@NotNull Project project, Editor editor, PsiFile file) {
|
||||
if (!myArrayAccessExpression.isValid()) return false;
|
||||
if (!TypeConversionUtil.areTypesAssignmentCompatible(PsiType.INT, myArrayAccessExpression.getIndexExpression())){
|
||||
if (!TypeConversionUtil.areTypesAssignmentCompatible(PsiType.INT, myArrayAccessExpression.getIndexExpression())) {
|
||||
return false;
|
||||
}
|
||||
final PsiElement parent = myArrayAccessExpression.getParent();
|
||||
if (parent instanceof PsiAssignmentExpression) {
|
||||
final PsiExpression lExpression = ((PsiAssignmentExpression)parent).getLExpression();
|
||||
if (lExpression.equals(myArrayAccessExpression) && !(parent.getParent() instanceof PsiExpressionStatement)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
final PsiExpression arrayExpression = myArrayAccessExpression.getArrayExpression();
|
||||
final PsiType type = arrayExpression.getType();
|
||||
final PsiType listType = createUtilListType(project);
|
||||
|
||||
if (type == null) return false;
|
||||
if (type == null || listType == null) return false;
|
||||
|
||||
|
||||
return listType.isAssignableFrom(type);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private PsiType createUtilListType(@NotNull Project project) {
|
||||
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
|
||||
final PsiClass listClass = JavaPsiFacade.getInstance(project).findClass(CommonClassNames.JAVA_UTIL_LIST, myArrayAccessExpression.getResolveScope());
|
||||
|
||||
if (listClass == null) return false;
|
||||
if (listClass == null) return null;
|
||||
|
||||
final PsiElementFactory factory = facade.getElementFactory();
|
||||
final PsiType listType = factory.createType(listClass);
|
||||
|
||||
return listType.isAssignableFrom(type);
|
||||
return factory.createType(listClass);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -79,9 +93,46 @@ public class ReplaceWithListAccessFix implements IntentionAction {
|
||||
if (indexExpression == null) return;
|
||||
|
||||
final PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
|
||||
final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(project);
|
||||
|
||||
final PsiElement parent = myArrayAccessExpression.getParent();
|
||||
final PsiElement listAccess = factory.createExpressionFromText(arrayExpression.getText() + ".get(" + indexExpression.getText() + ")", parent);
|
||||
myArrayAccessExpression.replace(listAccess);
|
||||
if (parent instanceof PsiAssignmentExpression) {
|
||||
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)parent;
|
||||
|
||||
final PsiExpression lExpression = assignmentExpression.getLExpression();
|
||||
final PsiExpression rExpression = assignmentExpression.getRExpression();
|
||||
if (lExpression.equals(myArrayAccessExpression) && parent.getParent() instanceof PsiExpressionStatement && rExpression != null) {
|
||||
replaceWithSet(factory, codeStyleManager, arrayExpression, indexExpression, rExpression, assignmentExpression);
|
||||
return;
|
||||
}
|
||||
}
|
||||
replaceWithGet(factory, codeStyleManager, arrayExpression, indexExpression, myArrayAccessExpression);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static PsiElement replaceWithGet(@NotNull PsiElementFactory factory,
|
||||
@NotNull CodeStyleManager codeStyleManager,
|
||||
@NotNull PsiExpression arrayExpression,
|
||||
@NotNull PsiExpression indexExpression,
|
||||
@NotNull PsiElement anchor) {
|
||||
|
||||
final PsiElement listAccess = factory.createExpressionFromText(
|
||||
arrayExpression.getText() + ".get(" + indexExpression.getText() + ")",
|
||||
anchor);
|
||||
return anchor.replace(codeStyleManager.reformat(listAccess));
|
||||
}
|
||||
|
||||
private static PsiElement replaceWithSet(@NotNull PsiElementFactory factory,
|
||||
@NotNull CodeStyleManager codeStyleManager,
|
||||
@NotNull PsiExpression arrayExpression,
|
||||
@NotNull PsiExpression indexExpression,
|
||||
@NotNull PsiExpression expression,
|
||||
@NotNull PsiElement anchor) {
|
||||
final PsiElement listAccess = factory.createExpressionFromText(
|
||||
arrayExpression.getText() + ".set(" + indexExpression.getText() + "," + expression.getText() + ")",
|
||||
anchor
|
||||
);
|
||||
return anchor.replace(codeStyleManager.reformat(listAccess));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
// "Replace with list access" "true"
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
class A {
|
||||
void test(ArrayList<Integer> list) {
|
||||
list.set(0, 5);
|
||||
}
|
||||
}
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
// "Replace with list access" "false"
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
class A {
|
||||
void test(ArrayList<Integer> list) {
|
||||
if (lis<caret>t[0] = 5 == 5){
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
// "Replace with list access" "true"
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
class A {
|
||||
void test(ArrayList<Integer> list) {
|
||||
lis<caret>t[0] = 5;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user