Fix problems with nulls on abstract classes from jdk

This commit is contained in:
Vladimir Rudev
2012-11-01 00:14:04 +04:00
committed by Nikolay Krasko
parent 511e3d9cd7
commit 98eefd0f1c
2 changed files with 12 additions and 10 deletions
@@ -37,13 +37,11 @@ import javax.swing.*;
public class DescriptorClassMember implements ClassMemberWithElement { public class DescriptorClassMember implements ClassMemberWithElement {
public static final String NO_PARENT_FOR = "No parent for "; public static final String NO_PARENT_FOR = "No parent for ";
@NotNull @NotNull
private final DeclarationDescriptor myDescriptor; private final DeclarationDescriptor myDescriptor;
@NotNull
private final PsiElement myPsiElement; private final PsiElement myPsiElement;
public DescriptorClassMember(@NotNull PsiElement element, @NotNull DeclarationDescriptor descriptor) { public DescriptorClassMember(PsiElement element, @NotNull DeclarationDescriptor descriptor) {
myPsiElement = element; myPsiElement = element;
myDescriptor = descriptor; myDescriptor = descriptor;
} }
@@ -51,16 +49,15 @@ public class DescriptorClassMember implements ClassMemberWithElement {
@Override @Override
public MemberChooserObject getParentNodeDelegate() { public MemberChooserObject getParentNodeDelegate() {
final DeclarationDescriptor parent = myDescriptor.getContainingDeclaration(); final DeclarationDescriptor parent = myDescriptor.getContainingDeclaration();
PsiElement declaration; PsiElement declaration = null;
if (myPsiElement instanceof JetDeclaration) { if (myPsiElement instanceof JetDeclaration) {
// kotlin // kotlin
declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, JetNamedDeclaration.class); declaration = PsiTreeUtil.getStubOrPsiParentOfType(myPsiElement, JetNamedDeclaration.class);
} }
else { else if (myPsiElement != null) {
// java or bytecode // java or bytecode
declaration = ((PsiMember) myPsiElement).getContainingClass(); declaration = ((PsiMember) myPsiElement).getContainingClass();
} }
assert declaration != null : NO_PARENT_FOR + myPsiElement;
assert parent != null : NO_PARENT_FOR + myDescriptor; assert parent != null : NO_PARENT_FOR + myDescriptor;
return new DescriptorClassMember(declaration, parent); return new DescriptorClassMember(declaration, parent);
} }
@@ -68,7 +65,7 @@ public class DescriptorClassMember implements ClassMemberWithElement {
@Override @Override
public void renderTreeNode(SimpleColoredComponent component, JTree tree) { public void renderTreeNode(SimpleColoredComponent component, JTree tree) {
component.append(getText()); component.append(getText());
if (myPsiElement.isValid()) { if (myPsiElement != null && myPsiElement.isValid()) {
component.setIcon(myPsiElement.getIcon(0)); component.setIcon(myPsiElement.getIcon(0));
} }
else { else {
@@ -52,9 +52,14 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
) { ) {
List<DescriptorClassMember> members = new ArrayList<DescriptorClassMember>(); List<DescriptorClassMember> members = new ArrayList<DescriptorClassMember>();
for (CallableMemberDescriptor memberDescriptor : missingImplementations) { for (CallableMemberDescriptor memberDescriptor : missingImplementations) {
PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(bindingContext, memberDescriptor); List<PsiElement> psiElements = BindingContextUtils.descriptorToDeclarations(bindingContext, memberDescriptor);
assert psiElement != null : "Can not find PsiElement for descriptor " + memberDescriptor; DescriptorClassMember member;
members.add(new DescriptorClassMember(psiElement, memberDescriptor)); if (psiElements.isEmpty()) {
member = new DescriptorClassMember(null, memberDescriptor);
} else {
member = new DescriptorClassMember(psiElements.get(0), memberDescriptor);
}
members.add(member);
} }
return members; return members;
} }