/*******************************************************************************
* This file is part of the PDT Extensions eclipse plugin.
*
* (c) Robert Gruendler <r.gruendler@gmail.com>
*
* Modified by Marek Maksimczyk <marek.maksimczyk@mandos.net.pl>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
******************************************************************************/
package org.pdtextensions.core.ui.codemanipulation;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.dltk.core.IMethod;
import org.eclipse.dltk.core.IParameter;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.IType;
import org.eclipse.dltk.core.ITypeHierarchy;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.internal.core.util.MethodOverrideTester;
import org.eclipse.php.core.compiler.PHPFlags;
import org.eclipse.php.internal.ui.corext.util.SuperTypeHierarchyCache;
import org.eclipse.php.ui.CodeGeneration;
import org.pdtextensions.core.util.PDTModelUtils;
@SuppressWarnings("restriction")
public class MethodStub {
private String lineDelimiter = "\n";
private String code = "";
private IScriptProject scriptProject = null;
private IMethod method;
private boolean generateComments;
public MethodStub(IScriptProject scriptProject, IMethod method, boolean generateComments) {
this.scriptProject = scriptProject;
this.method = method;
this.generateComments = generateComments;
}
private void generateCode() throws CoreException {
StringBuilder buffer = new StringBuilder();
buffer.append(lineDelimiter);
buffer.append(generateComments());
buffer.append(lineDelimiter);
buffer.append(generateAccess());
buffer.append(" function " + method.getElementName());
buffer.append("(" + generateParamsWithTypes() + ")");
buffer.append(generateBody());
code = buffer.toString();
}
private String generateParamsWithoutTypes() {
return generateParams(false);
}
private String generateParamsWithTypes() {
return generateParams(true);
}
private String generateParams(boolean withTypes) {
String code = "";
try {
for (IParameter parameter : method.getParameters()) {
if (withTypes == true && parameter.getType() != null) {
code += parameter.getType();
}
code += " ";
code += parameter.getName();
if (parameter.getDefaultValue() != null) {
code += "=" + parameter.getDefaultValue();
}
code += ",";
}
// Remove last ",", but only when we have some parameters.
if (code.length() > 0) {
code = code.substring(0, code.length() - 1);
}
} catch (ModelException e) {
e.printStackTrace();
}
return code;
}
private String generateBody() {
String body = "";
body = "{ " + lineDelimiter + "// TODO Auto-generated method stub " + lineDelimiter;
try {
if (method.isConstructor()) {
body += "parent::__construct(" + generateParamsWithoutTypes() + ");" + lineDelimiter;
}
} catch (ModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
body += "}" + lineDelimiter;
return body;
}
private String generateAccess() {
String access = new String();
try {
if (PHPFlags.isPublic(method.getFlags())) {
access = "public";
} else if (PHPFlags.isProtected(method.getFlags())) {
access = "protected";
}
} catch (ModelException e) {
e.printStackTrace();
}
return access;
}
private String generateComments() {
String comment = "";
if (generateComments == true) {
try {
comment = CodeGeneration.getMethodComment(scriptProject,
null,
method.getElementName(),
null,
null,
null,
method,
lineDelimiter,
null);
} catch (CoreException e) {
e.printStackTrace();
}
}
return comment;
}
public String toString() {
try {
generateCode();
} catch (ModelException e) {
e.printStackTrace();
} catch (CoreException e) {
e.printStackTrace();
}
return code;
}
/**
* Retrieve the code stub for a given {@link IMethod}
*/
public static String getMethodStub(String parent, IMethod method, IMethod overridden, String indent, String lineDelim, boolean comments)
throws ModelException {
StringBuilder buffer = new StringBuilder();
String comment = null;
if (comments) {
try {
comment = org.eclipse.php.ui.CodeGeneration.getMethodComment(method, overridden, lineDelim);
comment = indentPattern(lineDelim + comment, indent, lineDelim);
} catch (CoreException e) {
e.printStackTrace();
}
}
if (comments && comment != null) {
buffer.append(comment);
}
String modifier = "public";
try {
if (PHPFlags.isPrivate(method.getFlags())) {
modifier = "private";
} else if (PHPFlags.isProtected(method.getFlags())) {
modifier = "protected";
}
} catch (ModelException e) {
e.printStackTrace();
}
String signatureIndent = comments ? "" : indent;
buffer.append(signatureIndent + modifier + " function ");
String methodName = method.isConstructor() ? parent : method.getElementName();
buffer.append(methodName);
buffer.append("(");
int i = 0;
int size = method.getParameters().length;
for (IParameter param : method.getParameters()) {
if (PDTModelUtils.isValidType(param.getType(), method.getScriptProject())) {
buffer.append(param.getType() + " ");
}
buffer.append(param.getName());
if (param.getDefaultValue() != null) {
if ("array".equals(param.getType()) && param.getDefaultValue().trim().length() == 0) {
buffer.append(" = array()");
} else {
buffer.append(" = " + param.getDefaultValue());
}
}
if (i++ < size - 1) {
buffer.append(", ");
}
}
buffer.append(") {");
buffer.append(lineDelim);
buffer.append(indent + indent + "// TODO: Auto-generated method stub");
buffer.append(lineDelim);
buffer.append(lineDelim);
buffer.append(indent + "}");
buffer.append(lineDelim);
return buffer.toString();
}
private static String indentPattern(String originalPattern, String indentation, String lineDelim) {
String delimPlusIndent = lineDelim + indentation;
String indentedPattern = originalPattern.replaceAll(lineDelim, delimPlusIndent) + delimPlusIndent;
return indentedPattern;
}
}