public static string GetTypeNameFor(TypeNode type, bool suppressTemplateParameters, bool fullName){ if (type == null || type.Name == Looker.NotFound) return ""; switch(type.TypeCode){ case TypeCode.Boolean: return "bool"; case TypeCode.Byte: return "byte"; case TypeCode.Char: return "char"; case TypeCode.Decimal: return "decimal"; case TypeCode.Double: return "double"; case TypeCode.Int16: return "short"; case TypeCode.Int32: return "int"; case TypeCode.Int64: return "long"; case TypeCode.SByte: return "sbyte"; case TypeCode.Single: return "float"; case TypeCode.String: return "string"; case TypeCode.UInt16: return "ushort"; case TypeCode.UInt32: return "uint"; case TypeCode.UInt64: return "ulong"; } if (type == SystemTypes.Object) return "object"; if (type == SystemTypes.Void) return "void"; if (type.Template == SystemTypes.GenericNullable){ if (type.TemplateArguments != null && type.TemplateArguments.Count > 0) return ErrorHandler.GetTypeNameFor(type.TemplateArguments[0]) + "?"; } switch (type.NodeType){ case NodeType.ArrayType: ArrayType aType = (ArrayType)type; StringBuilder sb = new StringBuilder(ErrorHandler.GetTypeNameFor(aType.ElementType)); sb.Append('['); for (int i = 0, n = aType.Rank; i < n; i++){ if (i == 0 && n > 1) sb.Append('*'); if (i < n-1){ sb.Append(','); if (n > 1) sb.Append('*'); } } sb.Append(']'); return sb.ToString(); case NodeType.Class: FunctionType fType = type as FunctionType; if (fType != null){ ErrorHandler eh = new ErrorHandler(new ErrorNodeList(0)); return "delegate " + eh.GetTypeName(fType.ReturnType)+" "+eh.GetSignatureString("", fType.Parameters, "(", ")", ", "); } ClosureClass cClass = type as ClosureClass; if (cClass != null){ MemberList mems = cClass.Members; for (int i = 0, n = mems == null ? 0 : mems.Count; i < n; i++){ Method meth = mems[i] as Method; if (meth == null || meth is InstanceInitializer || (meth.Parameters != null && meth.Parameters.Count != 0)) continue; return ErrorHandler.GetTypeNameFor(meth.ReturnType); } } if (type.Template != null && type.TemplateArguments != null && type.TemplateArguments.Count > 0){ sb = new StringBuilder(ErrorHandler.GetTypeNameFor(type.Template, true, fullName)); for (int i = 0, n = type.TemplateArguments == null ? 0 : type.TemplateArguments.Count; i < n; i++){ if (i == 0) sb.Append('<'); sb.Append(ErrorHandler.GetTypeNameFor(type.TemplateArguments[i])); if (i < n - 1) sb.Append(','); else sb.Append('>'); } return sb.ToString(); } if (type.DeclaringType != null) sb = new StringBuilder(ErrorHandler.GetTypeNameFor(type.DeclaringType)+"."+type.GetUnmangledNameWithoutTypeParameters()); else sb = new StringBuilder(type.GetFullUnmangledNameWithoutTypeParameters()); if (!suppressTemplateParameters && type.TemplateParameters != null){ for (int i = 0, n = type.TemplateParameters == null ? 0 : type.TemplateParameters.Count; i < n; i++){ if (i == 0) sb.Append('<'); sb.Append(ErrorHandler.GetTypeNameFor(type.TemplateParameters[i], false, fullName)); if (i < n - 1) sb.Append(','); else sb.Append('>'); } return sb.ToString(); } return sb.ToString(); case NodeType.ConstrainedType: case NodeType.DelegateNode: case NodeType.EnumNode: case NodeType.Interface: case NodeType.TypeAlias: goto case NodeType.Class; case NodeType.OptionalModifier: if (((OptionalModifier)type).Modifier == SystemTypes.NonNullType) return ErrorHandler.GetTypeNameFor(((OptionalModifier)type).ModifiedType)+"!"; if (((OptionalModifier)type).Modifier == SystemTypes.NullableType) return ErrorHandler.GetTypeNameFor(((OptionalModifier)type).ModifiedType) + "?"; goto case NodeType.RequiredModifier; case NodeType.RequiredModifier: return ErrorHandler.GetTypeNameFor(((TypeModifier)type).ModifiedType); case NodeType.Pointer: return ErrorHandler.GetTypeNameFor(((Pointer)type).ElementType)+"*"; case NodeType.Reference: return "ref "+ErrorHandler.GetTypeNameFor(((Reference)type).ElementType); case NodeType.Refanytype: case NodeType.Struct: goto case NodeType.Class; case NodeType.ClassParameter: case NodeType.TypeParameter: return type.Name.ToString(); case NodeType.ClassExpression : case NodeType.InterfaceExpression : case NodeType.TypeExpression : case NodeType.ArrayTypeExpression: case NodeType.FlexArrayTypeExpression: case NodeType.FunctionTypeExpression: case NodeType.PointerTypeExpression: case NodeType.ReferenceTypeExpression: case NodeType.StreamTypeExpression: case NodeType.NonEmptyStreamTypeExpression: case NodeType.NonNullTypeExpression: case NodeType.NonNullableTypeExpression: case NodeType.BoxedTypeExpression: case NodeType.NullableTypeExpression: case NodeType.InvariantTypeExpression: case NodeType.TupleTypeExpression: case NodeType.TypeIntersectionExpression: case NodeType.TypeUnionExpression: return type.SourceContext.SourceText; } if (fullName) return type.FullName; if (type.Name == null) return ""; return type.Name.ToString(); }