package com.intellij.lang.javascript.generation;
import com.intellij.lang.javascript.formatter.JSCodeStyleSettings;
import com.intellij.lang.javascript.psi.JSPsiElementBase;
import com.intellij.lang.javascript.psi.JSVariable;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.psi.resolve.JSInheritanceUtil;
import com.intellij.lang.javascript.psi.resolve.JSOverrideHandler;
import com.intellij.lang.javascript.validation.fixes.BaseCreateMethodsFix;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.List;
import java.util.Set;
class JavaScriptGenerateToStringHandler extends BaseJSGenerateHandler {
protected String getTitleKey() {
return "generate.to.string.chooser.title";
}
protected BaseCreateMethodsFix createFix(final JSClass jsClass) {
return new BaseCreateMethodsFix<JSVariable>(jsClass) {
@Override
public void invoke(@NotNull final Project project, final Editor editor, final PsiFile file) throws IncorrectOperationException {
evalAnchor(editor, file);
final boolean[] needOverride = new boolean[1];
JSInheritanceUtil.processOverrides(jsClass, new JSOverrideHandler() {
public boolean process(@NotNull List<JSPsiElementBase> elements, final PsiElement scope, final String className) {
needOverride[0] = !"Object".equals(className);
return false;
}
}, "toString", null, myJsClass, true);
@NonNls String functionText = "public " +
(needOverride[0] ? "override " : "") +
"function toString():String {\nreturn " +
(needOverride[0] ? "super.toString()" : "\"" + jsClass.getName());
final String semicolon = JSCodeStyleSettings.getSemicolon(file);
boolean first = true;
final Set<JSVariable> jsVariables = getElementsToProcess();
if (!jsVariables.isEmpty()) {
functionText += needOverride[0] ? " + \"{" : "{";
for (JSVariable var : jsVariables) {
if (!first) {
functionText += " + \",";
}
first = false;
functionText += var.getName() + "=\" + String(" + var.getName() + ")";
}
functionText += "+\"}\"";
}
else {
if (!needOverride[0]) functionText += "\"";
}
functionText += semicolon + "\n}";
doAddOneMethod(project, functionText, anchor);
}
};
}
protected void collectCandidates(final JSClass clazz, final Collection<JSNamedElementNode> candidates) {
collectJSVariables(clazz, candidates, false, false, true, true);
}
protected boolean canHaveEmptySelectedElements() {
return true;
}
}