return new PyStructureViewElement(element, visibility, inherited, field);
}
+ @Nullable
@Override
public PyElement getValue() {
- return myElement;
+ return myElement.isValid() ? myElement : null;
}
public boolean isInherited() {
@Override
public void navigate(boolean requestFocus) {
- myElement.navigate(requestFocus);
+ final PyElement element = getValue();
+ if (element != null) {
+ myElement.navigate(requestFocus);
+ }
}
@Override
public boolean canNavigate() {
- return myElement.canNavigate();
+ return myElement.isValid() && myElement.canNavigate();
}
@Override
public boolean canNavigateToSource() {
- return myElement.canNavigateToSource();
+ return myElement.isValid() && myElement.canNavigateToSource();
}
public void setIcon(Icon icon) {
@NotNull
public StructureViewTreeElement[] getChildren() {
+ final PyElement element = getValue();
+ if (element == null) {
+ return EMPTY_ARRAY;
+ }
+
final Collection<StructureViewTreeElement> children = new ArrayList<>();
- for (PyElement e : getElementChildren(myElement)) {
+ for (PyElement e : getElementChildren(element)) {
children.add(createChild(e, getElementVisibility(e), false, elementIsField(e)));
}
- PyPsiUtils.assertValid(myElement);
- if (myElement instanceof PyClass) {
- for (PyClass c : ((PyClass)myElement).getAncestorClasses(null)) {
+ PyPsiUtils.assertValid(element);
+ if (element instanceof PyClass) {
+ for (PyClass c : ((PyClass)element).getAncestorClasses(null)) {
for (PyElement e: getElementChildren(c)) {
final StructureViewTreeElement inherited = createChild(e, getElementVisibility(e), true, elementIsField(e));
if (!children.contains(inherited)) {
@NotNull
@Override
public ItemPresentation getPresentation() {
- final ItemPresentation presentation = myElement.getPresentation();
+ final PyElement element = getValue();
+ final ItemPresentation presentation = element != null ? element.getPresentation() : null;
+
return new ColoredItemPresentation() {
@Nullable
@Override
public String getPresentableText() {
- if (myElement instanceof PyFile) {
- return myElement.getName();
+ if (element instanceof PyFile) {
+ return element.getName();
}
return presentation != null ? presentation.getPresentableText() : PyNames.UNNAMED_ELEMENT;
}
@Nullable
@Override
public Icon getIcon(boolean open) {
- Icon normal_icon = myElement.getIcon(0);
+ if (element == null) {
+ return null;
+ }
+
+ Icon normal_icon = element.getIcon(0);
if (myIcon != null) normal_icon = myIcon; // override normal
if (myVisibility == Visibility.NORMAL) {
return normal_icon;
*/
package com.jetbrains.python;
-import com.intellij.ide.structureView.newStructureView.StructureViewComponent;
-import com.intellij.util.Consumer;
+import com.intellij.navigation.ItemPresentation;
+import com.intellij.openapi.command.WriteCommandAction;
import com.jetbrains.python.fixtures.PyTestCase;
+import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.structureView.PyStructureViewElement;
+
+import javax.swing.*;
import static com.intellij.testFramework.PlatformTestUtil.assertTreeEqual;
true);
}
+ // EA-83566
+ public void testInvalidatedElement() {
+ myFixture.configureByText("a.py",
+ "def f():\n" +
+ " pass");
+ final PyFunction function = myFixture.findElementByText("f", PyFunction.class);
+ final PyStructureViewElement node = new PyStructureViewElement(function);
+ WriteCommandAction.runWriteCommandAction(myFixture.getProject(), function::delete);
+ assertNull(node.getValue());
+ final ItemPresentation presentation = node.getPresentation();
+ assertNotNull(presentation);
+ final Icon icon = presentation.getIcon(false);
+ assertNull(icon);
+ }
+
private void doTest(final String expected, final boolean inherited) {
myFixture.testStructureView(component -> {
component.setActionActive("SHOW_INHERITED", !inherited);