do not store reference to PsiElement in add field quickfix

This commit is contained in:
Ekaterina Tuzova
2014-03-11 19:20:46 +04:00
parent 532e079f0d
commit 85b572bfeb
3 changed files with 26 additions and 12 deletions
@@ -754,7 +754,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
actions.add(new AddMethodQuickFix(refText, (PyClassType)type, true));
}
else if (!(reference instanceof PyOperatorReference)) {
actions.add(new AddFieldQuickFix(refText, (PyClassType)type, "None"));
actions.add(new AddFieldQuickFix(refText, "None", type.getName()));
}
}
}
@@ -42,7 +42,6 @@ import com.jetbrains.python.psi.impl.PyImportStatementNavigator;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.search.PyOverridingMethodsSearch;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
import com.jetbrains.python.psi.types.PyClassTypeImpl;
import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -297,7 +296,7 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor {
}
}
final LocalQuickFix[] fixes = mayBeField
? new LocalQuickFix[] { new AddFieldQuickFix(name, new PyClassTypeImpl(containingClass, false), name) }
? new LocalQuickFix[] { new AddFieldQuickFix(name, name, containingClass.getName()) }
: LocalQuickFix.EMPTY_ARRAY;
registerWarning(element, PyBundle.message("INSP.unused.locals.parameter.isnot.used", name), fixes);
}
@@ -416,9 +415,6 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor {
private static boolean isEmptyFunction(@NotNull PyFunction f) {
final PyStatementList statementList = f.getStatementList();
if (statementList == null) {
return true;
}
final PyStatement[] statements = statementList.getStatements();
if (statements.length == 0) {
return true;
@@ -29,6 +29,7 @@ import com.intellij.openapi.ui.MessageType;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
@@ -36,6 +37,9 @@ import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
import com.jetbrains.python.psi.types.PyClassType;
import com.jetbrains.python.psi.types.PyClassTypeImpl;
import com.jetbrains.python.psi.types.PyType;
import com.jetbrains.python.psi.types.TypeEvalContext;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -48,19 +52,19 @@ import static com.jetbrains.python.PyNames.FAKE_OLD_BASE;
*/
public class AddFieldQuickFix implements LocalQuickFix {
private PyClassType myQualifierType;
private final String myInitializer;
private final String myClassName;
private String myIdentifier;
public AddFieldQuickFix(String identifier, PyClassType qualifierType, String initializer) {
public AddFieldQuickFix(@NotNull final String identifier, @NotNull final String initializer, final String className) {
myIdentifier = identifier;
myQualifierType = qualifierType;
myInitializer = initializer;
myClassName = className;
}
@NotNull
public String getName() {
return PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", myIdentifier, myQualifierType.getName());
return PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", myIdentifier, myClassName);
}
@NotNull
@@ -87,9 +91,12 @@ public class AddFieldQuickFix implements LocalQuickFix {
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
// expect the descriptor to point to the unresolved identifier.
PyClass cls = myQualifierType.getPyClass();
final PsiElement element = descriptor.getPsiElement();
final PyClassType type = getClassType(element);
if (type == null) return;
final PyClass cls = type.getPyClass();
PsiElement initStatement;
if (!myQualifierType.isDefinition()) {
if (!type.isDefinition()) {
initStatement = addFieldToInit(project, cls, myIdentifier, new CreateFieldCallback(project, myIdentifier, myInitializer));
}
else {
@@ -105,6 +112,17 @@ public class AddFieldQuickFix implements LocalQuickFix {
PyUtil.showBalloon(project, PyBundle.message("QFIX.failed.to.add.field"), MessageType.ERROR);
}
private static PyClassType getClassType(@NotNull final PsiElement element) {
if (element instanceof PyQualifiedExpression) {
final PyExpression qualifier = ((PyQualifiedExpression)element).getQualifier();
if (qualifier == null) return null;
final PyType type = TypeEvalContext.userInitiated(element.getContainingFile()).getType(qualifier);
return type instanceof PyClassType ? (PyClassType)type : null;
}
final PyClass aClass = PsiTreeUtil.getParentOfType(element, PyClass.class);
return aClass != null ? new PyClassTypeImpl(aClass, false) : null;
}
private void showTemplateBuilder(PsiElement initStatement, @NotNull final PsiFile file) {
initStatement = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(initStatement);
if (initStatement instanceof PyAssignmentStatement) {