package com.github.setial.intellijjavadocs.generator.impl;
import com.github.setial.intellijjavadocs.model.JavaDoc;
import com.github.setial.intellijjavadocs.model.settings.JavaDocSettings;
import com.github.setial.intellijjavadocs.model.settings.Level;
import com.github.setial.intellijjavadocs.utils.JavaDocUtils;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiJavaCodeReferenceElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiParameter;
import com.intellij.psi.PsiType;
import com.intellij.psi.PsiTypeElement;
import freemarker.template.Template;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.HashMap;
import java.util.Map;
/**
* The type Method java doc generator.
*
* @author Sergey Timofiychuk
*/
public class MethodJavaDocGenerator extends AbstractJavaDocGenerator<PsiMethod> {
/**
* Instantiates a new Method java doc generator.
*
* @param project the Project
*/
public MethodJavaDocGenerator(@NotNull Project project) {
super(project);
}
@Nullable
@Override
protected JavaDoc generateJavaDoc(@NotNull PsiMethod element) {
if (!shouldGenerate(element) || !shouldGenerate(element.getModifierList())) {
return null;
}
Template template = getDocTemplateManager().getMethodTemplate(element);
Map<String, String> paramNames = new HashMap<String, String>();
for (PsiParameter parameter : element.getParameterList().getParameters()) {
paramNames.put(parameter.getName(), getDocTemplateProcessor().buildDescription(parameter.getName(), false));
}
Map<String, String> exceptionNames = new HashMap<String, String>();
for (PsiJavaCodeReferenceElement exception : element.getThrowsList().getReferenceElements()) {
exceptionNames.put(exception.getReferenceName(),
getDocTemplateProcessor().buildDescription(exception.getReferenceName(), false));
}
String returnDescription = StringUtils.EMPTY;
PsiTypeElement returnElement = element.getReturnTypeElement();
if (returnElement != null) {
returnDescription = returnElement.getText();
}
Map<String, Object> params = getDefaultParameters(element);
if (returnElement != null) {
params.put("isNotVoid", !returnElement.getType().isAssignableFrom(PsiType.VOID));
params.put("return", getDocTemplateProcessor().buildDescription(returnDescription, false));
}
params.put("paramNames", paramNames);
params.put("exceptionNames", exceptionNames);
params.put("fieldName", getDocTemplateProcessor().buildFieldDescription(element.getName()));
String javaDocText = getDocTemplateProcessor().merge(template, params);
return JavaDocUtils.toJavaDoc(javaDocText, getPsiElementFactory());
}
private boolean shouldGenerate(@NotNull PsiMethod element) {
PsiMethod[] superMethods = element.findSuperMethods();
JavaDocSettings configuration = getSettings().getConfiguration();
boolean overriddenMethods = superMethods.length > 0 && configuration != null &&
!configuration.getGeneralSettings().isOverriddenMethods();
boolean level = configuration != null && configuration.getGeneralSettings().getLevels().contains(Level.METHOD);
return !level || !overriddenMethods;
}
}