public PropertyMember(string name, string[] comments, Dictionary <string, HashSet <string> > @params, Class cls, jsduck.Member jsMember, Dictionary <string, jsduck.Class> jsClassMap) : base(name, comments, @params, cls, jsMember, jsClassMap) { JsDoc.CommentParamArg commentParamArgs; if (!this.Params.ContainsKey(this.Type)) { commentParamArgs = null; } else { if (this.Params[this.Type].Count != 1) { Console.WriteLine($@"Warning: multiple JsDoc properties for: {this.Class.Name}.{this.Name}"); } commentParamArgs = JsDoc.ExtractCommentParamArgs(this.Params[this.Type].FirstOrDefault(), jsClassMap); } if (commentParamArgs != null) { this.IsRest = false; this.dataType = commentParamArgs.Type; this.IsOptional = commentParamArgs.IsOptional; this.DefaultValue = commentParamArgs.DefaultValue == null ? String.Empty : commentParamArgs.DefaultValue; } else { this.IsRest = false; this.IsOptional = false; this.dataType = !this.Params.ContainsKey("type") || this.Params["type"].Count <= 0 || String.IsNullOrEmpty(this.Params["type"].FirstOrDefault()) ? null : JsDoc.ExtTypeToTS(this.Params["type"].FirstOrDefault(), ref this.IsOptional, ref this.IsRest, jsClassMap); this.DefaultValue = String.Empty; } }
public MethodMember(string name, string[] comments, Dictionary <string, HashSet <string> > @params, Class cls, jsduck.Member jsMember, Dictionary <string, jsduck.Class> jsClassMap) : base(name, comments, @params, cls, jsMember, jsClassMap) { if (!this.Params.ContainsKey("return")) { this.returnType = null; } else { if (this.Params["return"].Count != 1) { Console.WriteLine($@"Warning: multiple JsDoc return for: {this.Class.Name}.{this.Name}"); } var returnParamArgs = JsDoc.ExtractCommentParamArgs(this.Params["return"].FirstOrDefault(), jsClassMap); this.returnType = returnParamArgs == null ? null : returnParamArgs.Type; this.returnTypeOptional = returnParamArgs == null ? false : returnParamArgs.IsOptional; } if (this.Params.ContainsKey("param")) { this.ParamArgs = this.Params["param"].Select(p => JsDoc.ExtractCommentParamArgs(p, jsClassMap)).Where(p => p != null).ToArray(); var isOptional = false; for (var i = 0; i < this.ParamArgs.Length; i++) { if (!isOptional) { if (this.ParamArgs[i].IsOptional) { isOptional = true; } } else { if (!this.ParamArgs[i].IsOptional) { this.ParamArgs[i].IsOptional = true; } } } var restIndex = this.ParamArgs.Length - 1; for (; restIndex >= 0 && !this.ParamArgs[restIndex].IsRest; restIndex--) { ; } for (; restIndex >= 0; restIndex--) { if (this.ParamArgs[restIndex].IsRest) { this.ParamArgs[restIndex].IsRest = false; } } } }
/// <summary> /// Create new tsClass into tsModule with members from jsClass meta information /// </summary> private Class BuildClass(Module tsModule, jsduck.Class jsClass) { Dictionary <string, HashSet <string> > jsHtmlParams; string[] jsHtmlComments; // Extract class document jsHtmlComments = JsDoc.ExtractComments(jsClass.Href, null, jsClass.docs, out jsHtmlParams); // Create class var tsClass = tsModule.Add(new Class(jsClass.name, jsHtmlComments, jsHtmlParams, jsClass.singleton ?? false, jsClass, this.JsClassMap, jsClass.extends)); Console.WriteLine($@"[{jsClass.OwnMembers.Length}]"); foreach (var jsMember in jsClass.OwnMembers) { // Extract member document jsHtmlComments = JsDoc.ExtractComments(jsClass.Href + '-' + jsMember.id, jsMember.id, jsClass.docs, out jsHtmlParams); // Create specific member Member member; switch (jsMember.tagname) { case PropertyMember.TAG: member = new PropertyMember(jsMember.name, jsHtmlComments, jsHtmlParams, tsClass, jsMember, this.JsClassMap); break; case MethodMember.TAG: member = new MethodMember(jsMember.name, jsHtmlComments, jsHtmlParams, tsClass, jsMember, this.JsClassMap); break; case ConfigMember.TAG: member = new ConfigMember(jsMember.name, jsHtmlComments, jsHtmlParams, tsClass, jsMember, this.JsClassMap); tsClass.MemberConfigs.Add(member.Name, member); break; case EventMember.TAG: member = new EventMember(jsMember.name, jsHtmlComments, jsHtmlParams, tsClass, jsMember, this.JsClassMap); break; default: throw new NotImplementedException(jsMember.tagname); } if (!tsClass.Members.ContainsKey(member.Name)) { tsClass.Members.Add(member.Name, member); } else { switch (jsMember.tagname) { case PropertyMember.TAG: case MethodMember.TAG: if (!tsClass.MemberExs.ContainsKey(member.Name)) { tsClass.MemberExs.Add(member.Name, new HashSet <Member>() { tsClass.Members[member.Name] }); } else { tsClass.MemberExs[member.Name].Add(tsClass.Members[member.Name]); } tsClass.Members[member.Name] = member; break; case ConfigMember.TAG: case EventMember.TAG: if (!tsClass.MemberExs.ContainsKey(member.Name)) { tsClass.MemberExs.Add(member.Name, new HashSet <Member>() { member }); } else { tsClass.MemberExs[member.Name].Add(member); } break; default: throw new NotImplementedException(jsMember.tagname); } } } return(tsClass); }