public static string GetParentNames(IEmitter emitter, IType type) { List <string> names = new List <string>(); while (type.DeclaringType != null) { var name = H5Types.ConvertName(H5Types.ToJsName(type.DeclaringType, emitter, true, true)); if (type.DeclaringType.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } names.Add(name); type = type.DeclaringType; } names.Reverse(); return(names.Join(".")); }
protected virtual string GetOverloadName(IMember definition, bool skipInterfaceName = false, string prefix = null, bool withoutTypeParams = false, bool isObjectLiteral = false, bool excludeTypeOnly = false) { IMember interfaceMember = null; if (definition.IsExplicitInterfaceImplementation) { interfaceMember = definition.ImplementedInterfaceMembers.First(); } else if (definition.DeclaringTypeDefinition != null && definition.DeclaringTypeDefinition.Kind == TypeKind.Interface) { interfaceMember = definition; } if (interfaceMember != null && !skipInterfaceName && !this.Emitter.Validator.IsObjectLiteral(interfaceMember.DeclaringTypeDefinition)) { return(OverloadsCollection.GetInterfaceMemberName(this.Emitter, interfaceMember, null, prefix, withoutTypeParams, this.IsSetter, excludeTypeOnly)); } string name = isObjectLiteral ? this.Emitter.GetLiteralEntityName(definition) : this.Emitter.GetEntityName(definition); if (name.StartsWith("." + JS.Funcs.CONSTRUCTOR)) { name = JS.Funcs.CONSTRUCTOR; } var attr = Helpers.GetInheritedAttribute(definition, "H5.NameAttribute"); var iProperty = definition as IProperty; if (attr == null && iProperty != null && !IsField) { var acceessor = this.IsSetter ? iProperty.Setter : iProperty.Getter; if (acceessor != null) { attr = Helpers.GetInheritedAttribute(acceessor, "H5.NameAttribute"); if (attr != null) { name = this.Emitter.GetEntityName(acceessor); } } } if (attr != null) { if (!(iProperty != null || definition is IEvent)) { prefix = null; } } if (attr != null && definition.ImplementedInterfaceMembers.Count > 0) { if (this.Members.Where(member => member.ImplementedInterfaceMembers.Count > 0) .Any(member => definition.ImplementedInterfaceMembers.Any(implementedInterfaceMember => member.ImplementedInterfaceMembers.Any(m => m.DeclaringTypeDefinition == implementedInterfaceMember.DeclaringTypeDefinition)))) { attr = null; } } bool skipSuffix = false; if (definition.DeclaringTypeDefinition != null && this.Emitter.Validator.IsExternalType(definition.DeclaringTypeDefinition)) { if (definition.DeclaringTypeDefinition.Kind == TypeKind.Interface) { skipSuffix = definition.DeclaringTypeDefinition.ParentAssembly.AssemblyName != CS.NS.H5; } else { skipSuffix = true; } } if (attr != null || skipSuffix) { return(prefix != null ? prefix + name : name); } var isCtor = definition is IMethod iDefinition && iDefinition.IsConstructor; if (isCtor) { name = JS.Funcs.CONSTRUCTOR; } var index = this.GetIndex(definition); if (index > 0) { if (isCtor) { name = JS.Vars.D + name + index; } else { name += Helpers.PrefixDollar(index); name = Helpers.ReplaceFirstDollar(name); } } return(prefix != null ? prefix + name : name); }
public static string ToJavascriptName(IType type, IEmitter emitter) { if (type.Kind == TypeKind.Delegate) { var delegateName = H5Types.ConvertName(type.FullName); if (!emitter.JsDoc.Callbacks.Contains(delegateName)) { var method = type.GetDelegateInvokeMethod(); JsDocComment comment = new JsDocComment(); var parameters = method.Parameters; if (parameters != null && parameters.Count > 0) { foreach (var param in parameters) { var jsParam = new JsDocParam(); jsParam.Name = param.Name; jsParam.Type = XmlToJsDoc.ToJavascriptName(param.Type, emitter); comment.Parameters.Add(jsParam); } } comment.Returns.Add(new JsDocParam { Type = XmlToJsDoc.ToJavascriptName(method.ReturnType, emitter) }); comment.Callback = delegateName; comment.MemberOf = type.Namespace; if (!emitter.JsDoc.Namespaces.Contains(type.Namespace)) { emitter.JsDoc.Namespaces.Add(type.Namespace); comment.Namespace = type.Namespace; } emitter.JsDoc.Callbacks.Add(delegateName); emitter.WriteIndented(comment.ToString() + newLine + newLine, 0); } return(delegateName); } if (type.IsKnownType(KnownTypeCode.String)) { return("string"); } if (type.IsKnownType(KnownTypeCode.Boolean)) { return("boolean"); } if (type.IsKnownType(KnownTypeCode.Void)) { return("void"); } if (type.IsKnownType(KnownTypeCode.Byte) || type.IsKnownType(KnownTypeCode.Char) || type.IsKnownType(KnownTypeCode.Double) || type.IsKnownType(KnownTypeCode.Int16) || type.IsKnownType(KnownTypeCode.Int32) || type.IsKnownType(KnownTypeCode.SByte) || type.IsKnownType(KnownTypeCode.Single) || type.IsKnownType(KnownTypeCode.UInt16) || type.IsKnownType(KnownTypeCode.UInt32)) { return("number"); } if (type.Kind == TypeKind.Array) { ICSharpCode.NRefactory.TypeSystem.ArrayType arrayType = (ICSharpCode.NRefactory.TypeSystem.ArrayType)type; return(JS.Types.ARRAY + ".<" + XmlToJsDoc.ToJavascriptName(arrayType.ElementType, emitter) + ">"); } if (type.Kind == TypeKind.Dynamic) { return("object"); } if (type.Kind == TypeKind.Enum && type.DeclaringType != null) { return("number"); } if (NullableType.IsNullable(type)) { return("?" + XmlToJsDoc.ToJavascriptName(NullableType.GetUnderlyingType(type), emitter)); } H5Type h5Type = emitter.H5Types.Get(type, true); //string name = H5Types.ConvertName(type.FullName); var name = type.Namespace; var hasTypeDef = h5Type != null && h5Type.TypeDefinition != null; bool isNested = false; if (hasTypeDef) { var typeDef = h5Type.TypeDefinition; if (typeDef.IsNested) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + H5Types.GetParentNames(emitter, typeDef); isNested = true; } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + H5Types.ConvertName(typeDef.Name); } else { if (type.DeclaringType != null) { name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + H5Types.GetParentNames(emitter, type); if (type.DeclaringType.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } isNested = true; } name = (string.IsNullOrEmpty(name) ? "" : (name + ".")) + H5Types.ConvertName(type.Name); } bool isCustomName = false; if (h5Type != null) { name = H5Types.AddModule(name, h5Type, false, isNested, out isCustomName); } if (!hasTypeDef && !isCustomName && type.TypeArguments.Count > 0) { name += Helpers.PrefixDollar(type.TypeArguments.Count); } return(name); }