/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.completion.model;
import gw.lang.reflect.IBlockType;
import gw.lang.reflect.IFeatureInfo;
import gw.lang.reflect.IFunctionType;
import gw.lang.reflect.IMetaType;
import gw.lang.reflect.IMethodInfo;
import gw.lang.reflect.IParameterInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.TypeInfoUtil;
import gw.lang.reflect.TypeSystem;
import gw.lang.reflect.gs.IGosuClass;
import gw.lang.reflect.java.IJavaMethodInfo;
import gw.lang.reflect.java.JavaTypes;
import org.jetbrains.annotations.NotNull;
public class MethodNode extends BeanInfoNode {
private final IMethodInfo methodInfo;
public MethodNode(IMethodInfo methodInfo) {
super(TypeSystem.getOrCreateFunctionType(methodInfo));
this.methodInfo = methodInfo;
}
@NotNull
@Override
public String getDisplayName() {
return methodInfo.getDisplayName() + getParameterDisplay() + " : " + getTypeName(getReturnType()) + " - " + getOwnersTypeName();
}
private String getOwnersTypeName() {
IType ownersType = methodInfo.getOwnersType();
if (ownersType instanceof IMetaType) {
ownersType = ((IMetaType) ownersType).getType();
}
if (ownersType instanceof IGosuClass && ((IGosuClass) ownersType).isAnonymous()) {
IType supertype = ownersType.getSupertype();
if (supertype == null) {
supertype = ownersType.getInterfaces()[0];
}
return ownersType.getEnclosingType().getName() + ".new " + supertype.getRelativeName() + "(){...}";
} else {
return ownersType.getDisplayName();
}
}
public IType getReturnType() {
IType retType = ((IFunctionType) getType()).getReturnType();
if (retType != JavaTypes.pVOID() && methodInfo instanceof IJavaMethodInfo) {
retType = ((IJavaMethodInfo) methodInfo).getGenericReturnType();
}
return retType;
}
public String getReturnTypeName() {
return getTypeName(getReturnType());
}
@NotNull
@Override
public String getName() {
return methodInfo.getDisplayName() + getParameterDisplay();
}
@Override
public IFeatureInfo getFeatureInfo() {
return methodInfo;
}
@Override
protected int getTypePriority() {
return methodInfo.isStatic() ? 4 : 1;
}
public IMethodInfo getMethodDescriptor() {
return methodInfo;
}
public String getParameterDisplay() {
IParameterInfo[] pd = (methodInfo instanceof IJavaMethodInfo) ? ((IJavaMethodInfo) methodInfo).getGenericParameters() : methodInfo.getParameters();
if (pd == null || pd.length == 0) {
return TypeInfoUtil.getTypeVarList(methodInfo, true) + "()";
}
final StringBuilder sb = new StringBuilder();
sb.append(TypeInfoUtil.getTypeVarList(methodInfo, true)).append("(");
for (int i = 0; i < pd.length; i++) {
String strName = pd[i].getName();
sb.append(i == 0 ? "" : ", ").append(strName);
boolean bBlock = pd[i].getFeatureType() instanceof IBlockType;
String strType = bBlock ? ((IBlockType) pd[i].getFeatureType()).getRelativeNameSansBlock() : pd[i].getFeatureType().getRelativeName();
if (!strName.equalsIgnoreCase(strType)) {
if (bBlock) {
sb.append(strType);
} else {
sb.append(": ").append(strType);
}
}
}
sb.append(")");
return sb.toString();
}
}