[Java. Intention Actions] Make possible to return null from CreateFieldFromUsageHelper#setupTemplate

IDEA-361230

GitOrigin-RevId: f11e7c102aa849141dcb81c802fef87b7249fdcb
This commit is contained in:
Georgii Ustinov
2024-10-23 14:59:56 +00:00
committed by intellij-monorepo-bot
parent 7c29ccfa28
commit 26d8e8e45d
8 changed files with 31 additions and 16 deletions
@@ -103,7 +103,7 @@ public class CreateFieldFromUsageFix extends CreateVarFromUsageFix {
if (newEditor == null) return;
Template template =
CreateFieldFromUsageHelper.setupTemplate(field, expectedTypes, targetClass, newEditor, context, createConstantField);
if (template == null) return;
startTemplate(newEditor, template, project, new TemplateEditingAdapter() {
@Override
public void templateFinished(@NotNull Template template, boolean brokenOff) {
@@ -32,7 +32,7 @@ public abstract class CreateFieldFromUsageHelper {
private static final LanguageExtension<CreateFieldFromUsageHelper> EP_NAME =
new LanguageExtension<>("com.intellij.codeInsight.createFieldFromUsageHelper");
public static Template setupTemplate(PsiField field,
public static @Nullable Template setupTemplate(@NotNull PsiField field,
Object expectedTypes,
PsiClass targetClass,
Editor editor,
@@ -41,7 +41,7 @@ public abstract class CreateFieldFromUsageHelper {
return setupTemplate(field, expectedTypes, targetClass, editor, context, createConstantField, true);
}
public static Template setupTemplate(PsiField field,
public static @Nullable Template setupTemplate(@NotNull PsiField field,
Object expectedTypes,
PsiClass targetClass,
Editor editor,
@@ -62,7 +62,7 @@ public abstract class CreateFieldFromUsageHelper {
public abstract PsiField insertFieldImpl(@NotNull PsiClass targetClass, @NotNull PsiField field, @NotNull PsiElement place);
public abstract Template setupTemplateImpl(PsiField field,
public abstract @Nullable Template setupTemplateImpl(@NotNull PsiField field,
Object expectedTypes,
PsiClass targetClass,
Editor editor,
@@ -15,13 +15,15 @@ import com.intellij.util.CommonJavaRefactoringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Objects;
/**
* @author Max Medvedev
*/
public final class JavaCreateFieldFromUsageHelper extends CreateFieldFromUsageHelper {
@Override
public Template setupTemplateImpl(PsiField field,
public @Nullable Template setupTemplateImpl(@NotNull PsiField field,
Object expectedTypes,
PsiClass targetClass,
Editor editor,
@@ -33,23 +35,26 @@ public final class JavaCreateFieldFromUsageHelper extends CreateFieldFromUsageHe
PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
field = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(field);
if (field == null) return null;
TemplateBuilderImpl builder = new TemplateBuilderImpl(field);
builder.setScrollToTemplate(isScrollToTemplate);
if (!(expectedTypes instanceof ExpectedTypeInfo[])) {
expectedTypes = ExpectedTypeInfo.EMPTY_ARRAY;
}
new GuessTypeParameters(project, factory, builder, substitutor).setupTypeElement(
field.getTypeElement(), (ExpectedTypeInfo[])expectedTypes, context, targetClass
Objects.requireNonNull(field.getTypeElement()), (ExpectedTypeInfo[])expectedTypes, context, targetClass
);
if (createConstantField && !field.hasInitializer()) {
field.setInitializer(factory.createExpressionFromText("0", null));
builder.replaceElement(field.getInitializer(), new EmptyExpression());
builder.replaceElement(Objects.requireNonNull(field.getInitializer()), new EmptyExpression());
PsiIdentifier identifier = field.getNameIdentifier();
builder.setEndVariableAfter(identifier);
}
field = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(field);
if (field == null) return null;
editor.getCaretModel().moveToOffset(field.getTextRange().getStartOffset());
Template template = builder.buildInlineTemplate();
@@ -63,7 +63,7 @@ internal class JavaFieldRenderer(
var field = renderField()
field = insertField(field, javaUsage?.anchor)
if (request.fieldType.isEmpty() || request.fieldType.size > 1 || request.isStartTemplate) {
startTemplate(field)
tryStartTemplate(field)
}
}
@@ -101,11 +101,11 @@ internal class JavaFieldRenderer(
return helper.insertFieldImpl(targetClass, field, anchor)
}
internal fun startTemplate(field: PsiField) {
internal fun tryStartTemplate(field: PsiField) {
val targetFile = targetClass.containingFile ?: return
val newEditor = positionCursor(field.project, targetFile, field) ?: return
val substitutor = request.targetSubstitutor.toPsiSubstitutor(project)
val template = helper.setupTemplateImpl(field, expectedTypes, targetClass, newEditor, javaUsage?.reference, constantField, request.isStartTemplate, substitutor)
val template = helper.setupTemplateImpl(field, expectedTypes, targetClass, newEditor, javaUsage?.reference, constantField, request.isStartTemplate, substitutor) ?: return
val listener = MyTemplateListener(project, newEditor, targetFile)
startTemplate(newEditor, template, project, listener, null)
}
@@ -31,7 +31,7 @@ internal abstract class CreateFieldActionBase(
val javaFieldRenderer = JavaFieldRenderer(project, isConstant(), copyClass, request)
var field = javaFieldRenderer.renderField()
field = javaFieldRenderer.insertField(field, PsiTreeUtil.findSameElementInCopy((request as? CreateFieldFromJavaUsageRequest)?.anchor, file))
javaFieldRenderer.startTemplate(field)
javaFieldRenderer.tryStartTemplate(field)
return IntentionPreviewInfo.DIFF
}
@@ -38,8 +38,11 @@ public class CreateFieldFix {
if (field == null) return;
Editor newEditor = IntentionUtils.positionCursor(project, myTargetClass.getContainingFile(), field);
if (newEditor == null) return;
Template template = CreateFieldFromUsageHelper.setupTemplate(field, typeConstraints, myTargetClass, newEditor, context, false);
if (template == null) return;
TemplateManager manager = TemplateManager.getInstance(project);
manager.startTemplate(newEditor, template);
}
@@ -24,12 +24,14 @@ import org.jetbrains.plugins.groovy.lang.psi.expectedTypes.TypeConstraint;
import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass;
import org.jetbrains.plugins.groovy.template.expressions.ChooseTypeExpression;
import java.util.Objects;
/**
* @author Max Medvedev
*/
public final class GroovyCreateFieldFromUsageHelper extends CreateFieldFromUsageHelper {
@Override
public Template setupTemplateImpl(PsiField f,
public @Nullable Template setupTemplateImpl(@NotNull PsiField f,
Object expectedTypes,
PsiClass targetClass,
Editor editor,
@@ -40,7 +42,10 @@ public final class GroovyCreateFieldFromUsageHelper extends CreateFieldFromUsage
GrVariableDeclaration fieldDecl = (GrVariableDeclaration)f.getParent();
GrField field = (GrField)fieldDecl.getVariables()[0];
Project project = field.getProject();
fieldDecl = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(fieldDecl);
if (fieldDecl == null) return null;
TemplateBuilderImpl builder = new TemplateBuilderImpl(fieldDecl);
builder.setScrollToTemplate(isScrollToTemplate);
@@ -55,7 +60,7 @@ public final class GroovyCreateFieldFromUsageHelper extends CreateFieldFromUsage
}
else if (expectedTypes instanceof ExpectedTypeInfo[]) {
new GuessTypeParameters(project, factory, builder, substitutor)
.setupTypeElement(field.getTypeElement(), (ExpectedTypeInfo[])expectedTypes, context, targetClass);
.setupTypeElement(Objects.requireNonNull(field.getTypeElement()), (ExpectedTypeInfo[])expectedTypes, context, targetClass);
}
GrExpression initializer = field.getInitializerGroovy();
@@ -67,6 +72,8 @@ public final class GroovyCreateFieldFromUsageHelper extends CreateFieldFromUsage
}
fieldDecl = CodeInsightUtilCore.forcePsiPostprocessAndRestoreElement(fieldDecl);
if (fieldDecl == null) return null;
Template template = builder.buildTemplate();
TextRange range = fieldDecl.getTextRange();
@@ -90,7 +90,7 @@ private class GroovyFieldRenderer(
fun doRender() {
var field = renderField()
field = insertField(field)
startTemplate(field)
tryStartTemplate(field)
}
fun renderField(): GrField {
@@ -132,11 +132,11 @@ private class GroovyFieldRenderer(
}
private fun startTemplate(field: GrField) {
private fun tryStartTemplate(field: GrField) {
val targetFile = targetClass.containingFile ?: return
val newEditor = positionCursor(field.project, targetFile, field) ?: return
val substitutor = request.targetSubstitutor.toPsiSubstitutor(project)
val template = helper.setupTemplateImpl(field, typeConstraints, targetClass, newEditor, null, constantField, request.isStartTemplate, substitutor)
val template = helper.setupTemplateImpl(field, typeConstraints, targetClass, newEditor, null, constantField, request.isStartTemplate, substitutor) ?: return
val listener = MyTemplateListener(project, newEditor, targetFile)
startTemplate(newEditor, template, project, listener, null)
}