package com.jetbrains.lang.dart.ide.generation;
import com.intellij.codeInsight.template.Template;
import com.intellij.codeInsight.template.TemplateManager;
import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.lang.dart.DartBundle;
import com.jetbrains.lang.dart.psi.*;
import com.jetbrains.lang.dart.util.DartPresentableUtil;
import org.jetbrains.annotations.NotNull;
public class OverrideImplementMethodFix extends BaseCreateMethodsFix<DartComponent> {
final boolean myImplementNotOverride;
public OverrideImplementMethodFix(@NotNull final DartClass dartClass, final boolean implementNotOverride) {
super(dartClass);
myImplementNotOverride = implementNotOverride;
}
@Override
@NotNull
protected String getNothingFoundMessage() {
return DartBundle.message(myImplementNotOverride ? "dart.fix.implement.none.found" : "dart.fix.override.none.found");
}
@Override
protected Template buildFunctionsText(TemplateManager templateManager, DartComponent element) {
final Template template = templateManager.createTemplate(getClass().getName(), DART_TEMPLATE_GROUP);
template.setToReformat(true);
if (CodeStyleSettingsManager.getSettings(element.getProject()).INSERT_OVERRIDE_ANNOTATION) {
template.addTextSegment("@override\n");
}
final boolean isField = element instanceof DartVarAccessDeclaration || element instanceof DartVarDeclarationListPart;
if (isField && element.isFinal()) {
template.addTextSegment("final");
template.addTextSegment(" ");
}
final DartReturnType returnType = PsiTreeUtil.getChildOfType(element, DartReturnType.class);
final DartType dartType = PsiTreeUtil.getChildOfType(element, DartType.class);
if (returnType != null) {
template.addTextSegment(DartPresentableUtil.buildTypeText(element, returnType, specializations));
template.addTextSegment(" ");
}
else if (dartType != null) {
template.addTextSegment(DartPresentableUtil.buildTypeText(element, dartType, specializations));
template.addTextSegment(" ");
}
if (isField) {
if (returnType == null && dartType == null) {
template.addTextSegment("var");
template.addTextSegment(" ");
}
//noinspection ConstantConditions
template.addTextSegment(element.getName());
if (element.isFinal()) {
template.addTextSegment(" ");
template.addTextSegment("=");
template.addTextSegment(" ");
template.addTextSegment("null");
}
template.addTextSegment("; "); // trailing space is removed when auto-reformatting, but it helps to enter line break if needed
return template;
}
if (element.isOperator()) {
template.addTextSegment("operator ");
}
if (element.isGetter() || element.isSetter()) {
template.addTextSegment(element.isGetter() ? "get " : "set ");
}
//noinspection ConstantConditions
template.addTextSegment(element.getName());
if (!element.isGetter()) {
template.addTextSegment("(");
template.addTextSegment(DartPresentableUtil.getPresentableParameterList(element, specializations, false, true, true));
template.addTextSegment(")");
}
template.addTextSegment("{\n");
template.addEndVariable();
template.addTextSegment("\n} "); // trailing space is removed when auto-reformatting, but it helps to enter line break if needed
return template;
}
}