VariableAccessFromInnerClassJava10: fix review issues: IDEA-CR-31797

This commit is contained in:
Roman.Ivanov
2018-05-22 16:55:00 +07:00
parent ed44abf498
commit 5f3a81b04a
4 changed files with 44 additions and 34 deletions

View File

@@ -26,6 +26,7 @@ import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static com.intellij.util.ObjectUtils.tryCast;
import static java.util.Collections.emptyList;
@@ -37,7 +38,6 @@ public class VariableAccessFromInnerClassJava10Fix extends BaseIntentionAction {
"context",
"rContext"
};
private static final LinkedHashSet<String> ourSuggestions = new LinkedHashSet<>(Arrays.asList(NAMES));
private final PsiElement myContext;
@@ -60,6 +60,9 @@ public class VariableAccessFromInnerClassJava10Fix extends BaseIntentionAction {
if (reference == null) return false;
PsiLocalVariable variable = tryCast(reference.resolve(), PsiLocalVariable.class);
if (variable == null) return false;
PsiDeclarationStatement declarationStatement = tryCast(variable.getParent(), PsiDeclarationStatement.class);
if (declarationStatement == null) return false;
if (declarationStatement.getDeclaredElements().length != 1) return false;
String name = variable.getName();
if (name == null) return false;
@@ -102,35 +105,34 @@ public class VariableAccessFromInnerClassJava10Fix extends BaseIntentionAction {
JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(project);
String boxName = codeStyleManager.suggestUniqueVariableName(NAMES[0], variable, true);
if (editor != null) {
String boxDeclarationText = "var " +
boxName +
" = new Object(){" +
variableText +
"};";
PsiStatement boxDeclaration = factory.createStatementFromText(boxDeclarationText, variable);
replaceReferences(variable, factory, boxName);
PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)variable.replace(boxDeclaration);
PsiLocalVariable localVariable = (PsiLocalVariable)declarationStatement.getDeclaredElements()[0];
SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(project);
SmartPsiElementPointer<PsiLocalVariable> pointer = smartPointerManager.createSmartPsiElementPointer(localVariable);
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument());
PsiLocalVariable varToChange = pointer.getElement();
if (varToChange == null) return;
editor.getCaretModel().moveToOffset(varToChange.getTextOffset());
editor.getSelectionModel().removeSelection();
new MemberInplaceRenamer(varToChange, varToChange, editor).performInplaceRefactoring(ourSuggestions);
}
else {
String boxDeclarationText = "var " +
boxName +
" = new Object(){" +
variableText +
"};";
PsiStatement boxDeclaration = factory.createStatementFromText(boxDeclarationText, variable);
replaceReferences(variable, factory, boxName);
String boxDeclarationText = "var " +
boxName +
" = new Object(){" +
variableText +
"};";
PsiStatement boxDeclaration = factory.createStatementFromText(boxDeclarationText, variable);
replaceReferences(variable, factory, boxName);
if (editor == null) {
variable.replace(boxDeclaration);
return;
}
PsiStatement statement = PsiTreeUtil.getParentOfType(variable, PsiStatement.class);
if (statement == null) return;
PsiDeclarationStatement declarationStatement = (PsiDeclarationStatement)statement.replace(boxDeclaration);
PsiLocalVariable localVariable = (PsiLocalVariable)declarationStatement.getDeclaredElements()[0];
SmartPointerManager smartPointerManager = SmartPointerManager.getInstance(project);
SmartPsiElementPointer<PsiLocalVariable> pointer = smartPointerManager.createSmartPsiElementPointer(localVariable);
PsiDocumentManager.getInstance(project).doPostponedOperationsAndUnblockDocument(editor.getDocument());
PsiLocalVariable varToChange = pointer.getElement();
if (varToChange == null) return;
editor.getCaretModel().moveToOffset(varToChange.getTextOffset());
editor.getSelectionModel().removeSelection();
LinkedHashSet<String> suggestions = Arrays.stream(NAMES)
.map(
suggestion -> codeStyleManager
.suggestUniqueVariableName(suggestion, varToChange, var -> var == varToChange))
.collect(Collectors.toCollection(() -> new LinkedHashSet<>()));
new MemberInplaceRenamer(varToChange, varToChange, editor).performInplaceRefactoring(suggestions);
}
});
}
@@ -252,6 +254,6 @@ public class VariableAccessFromInnerClassJava10Fix extends BaseIntentionAction {
@Override
public boolean startInWriteAction() {
return true;
return false;
}
}

View File

@@ -21,6 +21,7 @@ import com.intellij.openapi.util.Condition;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
import gnu.trove.THashMap;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;

View File

@@ -0,0 +1,7 @@
// "Move 'x' into anonymous object" "false"
class Test {
void test() {
int x = 1, y = 2;
Runnable r = () -> <caret>x++;
}
}

View File

@@ -1,11 +1,11 @@
// "Move 'x' into anonymous object" "false"
class Test {
public void test() {
var x = new Object() {
int y = 12;
}
void test() {
Integer i = 1;
var x = (Number & Comparable<?>)i;
Runnable r = () -> {
x<caret> = null;
x<caret> = 2;
};
System.out.println(x.compareTo(null));
}
}