make GenerationInfo.getPsiMember nullable (IDEA-CR-34000, EA-107687)

This commit is contained in:
peter
2018-06-25 14:23:40 +02:00
parent 9232b39bff
commit 7d8eccfc02
8 changed files with 24 additions and 33 deletions

View File

@@ -177,7 +177,7 @@ public class JavaGenerateMemberCompletionContributor {
final List<PsiElement> elements = new ArrayList<>();
for (GenerationInfo member : newInfos) {
if (!(member instanceof TemplateGenerationInfo)) {
elements.add(member.getPsiMember());
ContainerUtil.addIfNotNull(elements, member.getPsiMember());
}
}

View File

@@ -44,6 +44,7 @@ import org.jetbrains.java.generate.exception.GenerateCodeException;
import javax.swing.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public abstract class GenerateMembersHandlerBase implements CodeInsightActionHandler, ContextAwareActionHandler {
private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.generation.GenerateMembersHandlerBase");
@@ -140,8 +141,8 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan
else {
final List<PsiElement> elements = new ArrayList<>();
for (GenerationInfo member : newMembers) {
if (!(member instanceof TemplateGenerationInfo) && member.isMemberValid()) {
elements.add(member.getPsiMember());
if (!(member instanceof TemplateGenerationInfo)) {
ContainerUtil.addIfNotNull(elements, member.getPsiMember());
}
}
@@ -171,7 +172,7 @@ public abstract class GenerateMembersHandlerBase implements CodeInsightActionHan
TemplateGenerationInfo info = templates.get(index);
final Template template = info.getTemplate();
final PsiElement element = info.getPsiMember();
PsiElement element = Objects.requireNonNull(info.getPsiMember());
final TextRange range = element.getTextRange();
WriteAction.run(() -> editor.getDocument().deleteString(range.getStartOffset(), range.getEndOffset()));
int offset = range.getStartOffset();

View File

@@ -33,7 +33,6 @@ public abstract class GenerationInfoBase implements GenerationInfo {
@Override
public abstract void insert(@NotNull PsiClass aClass, PsiElement anchor, boolean before) throws IncorrectOperationException;
@NotNull
@Override
public abstract PsiMember getPsiMember();
@@ -62,8 +61,9 @@ public abstract class GenerationInfoBase implements GenerationInfo {
@Override
public void positionCaret(@NotNull Editor editor, boolean toEditMethodBody) {
if (isMemberValid()) {
GenerateMembersUtil.positionCaret(editor, getPsiMember(), toEditMethodBody);
PsiMember member = getPsiMember();
if (member != null) {
GenerateMembersUtil.positionCaret(editor, member, toEditMethodBody);
}
}
}

View File

@@ -19,10 +19,11 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
/**
* @author peter
*/
@@ -44,20 +45,14 @@ public class PsiGenerationInfo<T extends PsiMember> extends GenerationInfoBase i
myMember = SmartPointerManager.getInstance(member.getProject()).createSmartPsiElementPointer(member);
}
@NotNull
@Override
public final T getPsiMember() {
return ObjectUtils.assertNotNull(myMember.getElement());
}
@Override
public boolean isMemberValid() {
return myMember.getElement() != null;
return myMember.getElement();
}
@Override
public void insert(@NotNull final PsiClass aClass, @Nullable PsiElement anchor, boolean before) throws IncorrectOperationException {
T member = getPsiMember();
T member = Objects.requireNonNull(getPsiMember());
final PsiMember existingMember;
if (member instanceof PsiField) {
existingMember = aClass.findFieldByName(member.getName(), false);

View File

@@ -20,9 +20,10 @@ import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateBuilderImpl;
import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public abstract class TemplateGenerationInfo extends GenerationInfoBase implements GenerationInfo {
private final Expression myExpression;
private SmartPsiElementPointer<PsiMethod> myElement;
@@ -38,24 +39,19 @@ public abstract class TemplateGenerationInfo extends GenerationInfoBase implemen
protected abstract PsiElement getTemplateElement(PsiMethod method);
@NotNull
@Override
public PsiMethod getPsiMember() {
return ObjectUtils.assertNotNull(myElement.getElement());
}
@Override
public boolean isMemberValid() {
return myElement.getElement() != null;
return myElement.getElement();
}
@Override
public void insert(@NotNull PsiClass aClass, PsiElement anchor, boolean before) throws IncorrectOperationException {
setElement((PsiMethod)GenerateMembersUtil.insert(aClass, getPsiMember(), anchor, before));
PsiMethod member = Objects.requireNonNull(getPsiMember());
setElement((PsiMethod)GenerateMembersUtil.insert(aClass, member, anchor, before));
}
public Template getTemplate() {
PsiMethod element = getPsiMember();
PsiMethod element = Objects.requireNonNull(getPsiMember());
TemplateBuilderImpl builder = new TemplateBuilderImpl(element);
builder.replaceElement(getTemplateElement(element), myExpression);
return builder.buildTemplate();

View File

@@ -31,13 +31,12 @@ public interface GenerationInfo {
void insert(@NotNull PsiClass aClass, @Nullable PsiElement anchor, boolean before) throws IncorrectOperationException;
@NotNull
/**
* @return the associated PSI member or null if it has become invalid
*/
@Nullable
PsiMember getPsiMember();
default boolean isMemberValid() {
return true;
}
/**
* @param leaf leaf element. Is guaranteed to be a tree descendant of aClass.
* @return the value that will be passed to the {@link #insert(PsiClass, PsiElement, boolean)} method later.

View File

@@ -138,7 +138,7 @@ public class GroovyGenerationInfo<T extends PsiMember> extends PsiGenerationInfo
@Override
public void positionCaret(@NotNull Editor editor, boolean toEditMethodBody) {
final T firstMember = getPsiMember();
LOG.assertTrue(firstMember.isValid());
LOG.assertTrue(firstMember != null);
if (toEditMethodBody) {
GrMethod method = (GrMethod)firstMember;

View File

@@ -46,7 +46,7 @@ object LambdaToAnonymousTransformer : PsiElementTransformer.Base() {
LOG.assertTrue(anonymousClass != null)
val infos = overrideOrImplement(anonymousClass!!, method)
if (infos.size == 1) {
val member = infos[0].psiMember
val member = infos[0].psiMember!!
val parameters = member.parameterList.parameters
if (parameters.size == paramListCopy.size) {
for (i in parameters.indices) {