package com.jetbrains.lang.dart.ide.generation;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.lang.dart.DartBundle;
import com.jetbrains.lang.dart.psi.DartClass;
import com.jetbrains.lang.dart.psi.DartComponent;
import com.jetbrains.lang.dart.psi.DartReturnType;
import com.jetbrains.lang.dart.psi.DartType;
import com.jetbrains.lang.dart.util.DartPresentableUtil;
import org.jetbrains.annotations.NotNull;
import java.util.List;
public class CreateGetterSetterFix extends BaseCreateMethodsFix<DartComponent> {
public enum Strategy {
GETTER(DartBundle.message("dart.fix.getter.none.found")) {
@Override
boolean accept(final String name, List<DartComponent> componentList) {
return name.startsWith("_") &&
ContainerUtil.find(componentList, component -> component.isGetter() &&
DartPresentableUtil.setterGetterName(name).equals(component.getName())) ==
null;
}
},
SETTER(DartBundle.message("dart.fix.setter.none.found")) {
@Override
boolean accept(final String name, List<DartComponent> componentList) {
return name.startsWith("_") &&
ContainerUtil.find(componentList, component -> component.isSetter() &&
DartPresentableUtil.setterGetterName(name).equals(component.getName())) ==
null;
}
},
GETTERSETTER(DartBundle.message("dart.fix.gettersetter.none.found")) {
@Override
boolean accept(final String name, List<DartComponent> componentList) {
return name.startsWith("_") &&
ContainerUtil.find(componentList, component -> (component.isGetter() || component.isSetter()) &&
DartPresentableUtil.setterGetterName(name).equals(component.getName())) ==
null;
}
};
private final String myNothingFoundMessage;
Strategy(final String nothingFoundMessage) {
myNothingFoundMessage = nothingFoundMessage;
}
abstract boolean accept(String name, List<DartComponent> componentList);
}
private final @NotNull Strategy myStrategy;
public CreateGetterSetterFix(@NotNull final DartClass dartClass, @NotNull Strategy strategy) {
super(dartClass);
myStrategy = strategy;
}
@Override
@NotNull
protected String getNothingFoundMessage() {
return myStrategy.myNothingFoundMessage;
}
@Override
protected Template buildFunctionsText(final TemplateManager templateManager, final DartComponent namedComponent) {
final DartReturnType returnType = PsiTreeUtil.getChildOfType(namedComponent, DartReturnType.class);
final DartType dartType = PsiTreeUtil.getChildOfType(namedComponent, DartType.class);
final String typeText = returnType == null
? DartPresentableUtil.buildTypeText(namedComponent, dartType, null)
: DartPresentableUtil.buildTypeText(namedComponent, returnType, null);
final Template template = templateManager.createTemplate(getClass().getName(), DART_TEMPLATE_GROUP);
template.setToReformat(true);
if (myStrategy == Strategy.GETTER || myStrategy == Strategy.GETTERSETTER) {
buildGetter(template, namedComponent.getName(), typeText, namedComponent.isStatic());
}
if (myStrategy == Strategy.SETTER || myStrategy == Strategy.GETTERSETTER) {
buildSetter(template, namedComponent.getName(), typeText, namedComponent.isStatic());
}
return template;
}
private static void buildGetter(final Template template, final String name, final String typeText, final boolean isStatic) {
build(template, name, typeText, isStatic, true);
}
private static void buildSetter(final Template template, final String name, final String typeText, final boolean isStatic) {
build(template, name, typeText, isStatic, false);
}
private static void build(final Template template,
final String name,
final String typeText,
final boolean isStatic,
final boolean isGetter) {
if (isStatic) {
template.addTextSegment("static");
template.addTextSegment(" ");
}
if (isGetter) {
template.addTextSegment(typeText);
template.addTextSegment(" ");
}
template.addTextSegment(isGetter ? "get" : "set");
template.addTextSegment(" ");
template.addEndVariable();
template.addTextSegment(DartPresentableUtil.setterGetterName(name));
if (!isGetter) {
template.addTextSegment("(");
template.addTextSegment(typeText);
template.addTextSegment(" value");
template.addTextSegment(")");
}
if (isGetter) {
template.addTextSegment(" => ");
template.addTextSegment(name);
template.addTextSegment("; "); // trailing space is removed when auto-reformatting, but it helps to enter line break if needed
}
else {
template.addTextSegment("{ ");
template.addTextSegment(name);
template.addTextSegment(" = value; "); // trailing space is removed when auto-reformatting, but it helps to enter line break if needed
template.addTextSegment(" } "); // trailing space is removed when auto-reformatting, but it helps to enter line break if needed
}
}
}