예제 #1
0
        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;
            }
        }
예제 #2
0
        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;
                    }
                }
            }
        }
예제 #3
0
        /// <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);
        }