package jetbrains.mps.baseLanguage.javastub;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNodeId;
import jetbrains.mps.util.NameUtil;
import jetbrains.mps.baseLanguage.javastub.asm.ASMClass;
import jetbrains.mps.baseLanguage.javastub.asm.ASMField;
import jetbrains.mps.baseLanguage.javastub.asm.ASMMethod;
import jetbrains.mps.baseLanguage.javastub.asm.ASMType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMParameterizedType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMClassType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMArrayType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMVarArgType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMPrimitiveType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMTypeVariable;
import jetbrains.mps.baseLanguage.javastub.asm.ASMExtendsType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMSuperType;
import jetbrains.mps.baseLanguage.javastub.asm.ASMUnboundedType;
import java.util.List;
import java.util.Iterator;
public class ASMNodeId {
public ASMNodeId() {
}
public static SNodeId createId(String fqClassName) {
return new jetbrains.mps.smodel.SNodeId.Foreign(jetbrains.mps.smodel.SNodeId.Foreign.ID_PREFIX + NameUtil.shortNameFromLongName(fqClassName));
}
public static SNodeId createId(ASMClass cls, ASMField field) {
return new jetbrains.mps.smodel.SNodeId.Foreign(jetbrains.mps.smodel.SNodeId.Foreign.ID_PREFIX + ASMNodeId.shortNameFromSlashedLongName(cls.getName()) + "." + field.getName());
}
public static SNodeId createFieldId(String fqClassName, String fieldName) {
return new jetbrains.mps.smodel.SNodeId.Foreign(jetbrains.mps.smodel.SNodeId.Foreign.ID_PREFIX + NameUtil.shortNameFromLongName(fqClassName) + "." + fieldName);
}
public static SNodeId createId(ASMClass cls, ASMMethod method) {
StringBuilder sb = new StringBuilder();
sb.append(ASMNodeId.shortNameFromSlashedLongName(cls.getName()));
sb.append('.');
if (method.isConstructor()) {
sb.append("<init>");
} else {
sb.append(method.getName());
}
sb.append('(');
ASMNodeId.appendList(sb, method.getParameterTypes());
sb.append(')');
if (!(method.isConstructor())) {
sb.append(':');
sb.append(ASMNodeId.asString(method.getReturnType()));
}
return new jetbrains.mps.smodel.SNodeId.Foreign(jetbrains.mps.smodel.SNodeId.Foreign.ID_PREFIX + sb.toString());
}
public static SNodeId createAnnotationMethodId(String fqClassName, String methodName) {
StringBuilder sb = new StringBuilder();
sb.append(NameUtil.shortNameFromLongName(fqClassName));
sb.append('.');
sb.append(methodName);
sb.append("()");
return new jetbrains.mps.smodel.SNodeId.Foreign(jetbrains.mps.smodel.SNodeId.Foreign.ID_PREFIX + sb.toString());
}
private static String shortNameFromSlashedLongName(String slashedLongName) {
int offset = slashedLongName.lastIndexOf('/');
if (offset < 0) {
return slashedLongName;
}
return slashedLongName.substring(offset + 1);
}
private static String asString(ASMType type) {
if (type instanceof ASMParameterizedType) {
StringBuilder sb = new StringBuilder();
sb.append(ASMNodeId.asString(((ASMParameterizedType) type).getRawType()));
sb.append('<');
ASMNodeId.appendList(sb, ((ASMParameterizedType) type).getActualTypeArguments());
sb.append('>');
return sb.toString();
}
if (type instanceof ASMClassType) {
return ((ASMClassType) type).getName();
}
if (type instanceof ASMArrayType) {
return ASMNodeId.asString(((ASMArrayType) type).getElementType()) + "[]";
}
if (type instanceof ASMVarArgType) {
return ASMNodeId.asString(((ASMVarArgType) type).getElementType()) + "...";
}
if (type instanceof ASMPrimitiveType) {
return ((ASMPrimitiveType) type).getName();
}
if (type instanceof ASMTypeVariable) {
return ((ASMTypeVariable) type).getName();
}
if (type instanceof ASMExtendsType) {
return "? extends " + ASMNodeId.asString(((ASMExtendsType) type).getBound());
}
if (type instanceof ASMSuperType) {
return "? super " + ASMNodeId.asString(((ASMSuperType) type).getBound());
}
if (type instanceof ASMUnboundedType) {
return "?";
}
throw new RuntimeException("unexpected type: " + type);
}
private static void appendList(StringBuilder sb, List<ASMType> types) {
Iterator<ASMType> iterator = types.iterator();
while (iterator.hasNext()) {
sb.append(ASMNodeId.asString(iterator.next()));
if (iterator.hasNext()) {
sb.append(',');
}
}
}
}