コード例 #1
0
        /// <summary>
        ///     Main code generator method. This method should write corresponding TypeScript code for element (1st argument) to
        ///     WriterWrapper (3rd argument) using TypeResolver if necessary
        /// </summary>
        /// <param name="element">Element code to be generated to output</param>
        /// <param name="resolver">Type resolver</param>
        /// <param name="sw">Output writer</param>
        public virtual void Generate(MemberInfo element, TypeResolver resolver, WriterWrapper sw)
        {
            if (element.IsIgnored())
            {
                return;
            }

            var    t        = GetType(element);
            string typeName = null;
            var    propName = element.Name;
            var    tp       = ConfigurationRepository.Instance.ForMember <TsPropertyAttribute>(element);

            if (tp != null)
            {
                if (tp.StrongType != null)
                {
                    typeName = resolver.ResolveTypeName(tp.StrongType);
                }
                else if (!string.IsNullOrEmpty(tp.Type))
                {
                    typeName = tp.Type;
                }

                if (!string.IsNullOrEmpty(tp.Name))
                {
                    propName = tp.Name;
                }
                if (tp.ForceNullable && element.DeclaringType.IsExportingAsInterface() && !Settings.SpecialCase)
                {
                    propName = propName + "?";
                }
            }
            if (string.IsNullOrEmpty(typeName))
            {
                typeName = resolver.ResolveTypeName(t);
            }
            if (!propName.EndsWith("?") && t.IsNullable() && element.DeclaringType.IsExportingAsInterface() &&
                !Settings.SpecialCase)
            {
                propName = propName + "?";
            }

            if (element is PropertyInfo)
            {
                propName = Settings.ConditionallyConvertPropertyNameToCamelCase(propName);
            }
            propName = element.CamelCaseFromAttribute(propName);

            sw.Tab();
            Settings.Documentation.WriteDocumentation(element, sw);
            sw.Indent();
            if (!element.DeclaringType.IsExportingAsInterface() || Settings.SpecialCase)
            {
                var modifier = Settings.SpecialCase ? AccessModifier.Public : element.GetModifier();
                sw.Write("{0} ", modifier.ToModifierText());
            }
            sw.Write("{0}: {1};", propName, typeName);
            sw.Br();
            sw.UnTab();
        }
コード例 #2
0
        /// <summary>
        ///     Exports entire class to specified writer
        /// </summary>
        /// <param name="declType">
        ///     Declaration type. Used in "export $gt;class&lt; ... " line. This parameter allows switch it to
        ///     "interface"
        /// </param>
        /// <param name="type">Exporting class type</param>
        /// <param name="resolver">Type resolver</param>
        /// <param name="sw">Output writer</param>
        /// <param name="swtch">Pass here type attribute inherited from IAutoexportSwitchAttribute</param>
        protected virtual void Export(string declType, Type type, TypeResolver resolver, WriterWrapper sw,
                                      IAutoexportSwitchAttribute swtch)
        {
            var name = type.GetName();

            Settings.Documentation.WriteDocumentation(type, sw);
            sw.Indent();


            sw.Write(Settings.GetDeclarationFormat(type), declType);
            sw.Write(name);

            var ifaces = type.GetInterfaces();
            var bs     = type.BaseType;
            var baseClassIsExportedAsInterface = false;

            if (bs != null && bs != typeof(object))
            {
                if (ConfigurationRepository.Instance.ForType <TsDeclarationAttributeBase>(bs) != null)
                {
                    if (bs.IsExportingAsInterface())
                    {
                        baseClassIsExportedAsInterface = true;
                    }
                    else
                    {
                        sw.Write(" extends {0} ", resolver.ResolveTypeName(bs));
                    }
                }
            }
            var ifacesStrings =
                ifaces.Where(c => ConfigurationRepository.Instance.ForType <TsInterfaceAttribute>(c) != null)
                .Select(resolver.ResolveTypeName).ToList();

            if (baseClassIsExportedAsInterface)
            {
                ifacesStrings.Add(resolver.ResolveTypeName(bs));
            }
            if (ifacesStrings.Any())
            {
                var implemets = string.Join(", ", ifacesStrings);
                if (type.IsExportingAsInterface())
                {
                    sw.Write(" extends {0}", implemets);
                }
                else
                {
                    sw.Write(" implements {0}", implemets);
                }
            }

            sw.Write(" {{");
            sw.WriteLine();
            ExportMembers(type, resolver, sw, swtch);
            sw.WriteLine("}");
        }
コード例 #3
0
 /// <summary>
 ///     Writes to ouput file namespace closing
 /// </summary>
 /// <param name="namespaceName">Namespace name</param>
 /// <param name="sw">Output writer</param>
 public virtual void WriteNamespaceEnd(string namespaceName, WriterWrapper sw)
 {
     if (string.IsNullOrEmpty(namespaceName))
     {
         return;
     }
     sw.UnTab();
     sw.Indent();
     sw.WriteLine("}");
     sw.Br();
 }
コード例 #4
0
        /// <summary>
        ///     Main code generator method. This method should write corresponding TypeScript code for element (1st argument) to
        ///     WriterWrapper (3rd argument) using TypeResolver if necessary
        /// </summary>
        /// <param name="element">Element code to be generated to output</param>
        /// <param name="resolver">Type resolver</param>
        /// <param name="sw">Output writer</param>
        public virtual void Generate(Type element, TypeResolver resolver, WriterWrapper sw)
        {
            var values = Enum.GetValues(element);
            var name   = element.GetName();
            var fmt    = Settings.GetDeclarationFormat(element);
            var fields = element.GetFields().Where(c => !c.IsSpecialName).ToDictionary(c => c.Name, c => c);


            Settings.Documentation.WriteDocumentation(element, sw);
            sw.Indent();
            sw.Write(string.Format(fmt, "enum {0} {{ "), name);
            sw.Br();
            sw.Tab();
            for (var index = 0; index < values.Length; index++)
            {
                var v = values.GetValue(index);
                var n = Enum.GetName(element, v);
                if (fields.ContainsKey(n))
                {
                    var fieldItself = fields[n];
                    Settings.Documentation.WriteDocumentation(fieldItself, sw);

                    var attr = ConfigurationRepository.Instance.ForEnumValue(fieldItself);
                    if (attr != null)
                    {
                        n = attr.Name;
                    }

                    sw.Indent();
                    sw.Write("{0} = {1}", n, Convert.ToInt64(v));
                    if (index < values.Length - 1)
                    {
                        sw.Write(",");
                    }
                    sw.Br();
                }
            }
            sw.UnTab();
            sw.WriteLine("}");
        }
コード例 #5
0
        /// <summary>
        ///     Writes output comment with automatic multiline division
        /// </summary>
        /// <param name="sw">Output writer</param>
        /// <param name="comment">Comment (multiline allowed)</param>
        public void WriteComment(WriterWrapper sw, string comment)
        {
            sw.Br();
            sw.Indent();
            var lines = comment.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);

            if (lines.Length == 1)
            {
                sw.WriteLine("// {0} ", lines[0]);
            }
            else
            {
                Begin(sw);
                foreach (var line in lines)
                {
                    Line(sw, line);
                }
                End(sw);
                sw.Br();
            }
        }
コード例 #6
0
        /// <summary>
        ///     Main code generator method. This method should write corresponding TypeScript code for element (1st argument) to
        ///     WriterWrapper (3rd argument) using TypeResolver if necessary
        /// </summary>
        /// <param name="element">Element code to be generated to output</param>
        /// <param name="resolver">Type resolver</param>
        /// <param name="sw">Output writer</param>
        public virtual void Generate(ConstructorInfo element, TypeResolver resolver, WriterWrapper sw)
        {
            if (element.IsIgnored())
            {
                return;
            }
            var isInterfaceMethod = element.DeclaringType.IsExportingAsInterface();

            if (element.GetParameters().Length == 0)
            {
                return;
            }
            sw.Tab();
            Settings.Documentation.WriteDocumentation(element, sw);
            sw.Indent();
            WriteFunctionName(false, element.GetModifier(), "constructor", sw, isInterfaceMethod);
            WriteMethodParameters(element, resolver, sw);
            WriteRestOfDeclaration(string.Empty, sw);
            WriteConstructorBody(element, resolver, sw);
            sw.UnTab();
        }
コード例 #7
0
        /// <summary>
        ///     Main code generator method. This method should write corresponding TypeScript code for element (1st argument) to
        ///     WriterWrapper (3rd argument) using TypeResolver if necessary
        /// </summary>
        /// <param name="element">Element code to be generated to output</param>
        /// <param name="resolver">Type resolver</param>
        /// <param name="sw">Output writer</param>
        public virtual void Generate(MethodInfo element, TypeResolver resolver, WriterWrapper sw)
        {
            if (element.IsIgnored())
            {
                return;
            }

            var    isInterfaceMethod = element.DeclaringType.IsExportingAsInterface() && !Settings.SpecialCase;
            string name, type;

            GetFunctionNameAndReturnType(element, resolver, out name, out type);

            sw.Tab();
            Settings.Documentation.WriteDocumentation(element, sw);
            sw.Indent();
            var modifier = element.GetModifier();

            if (Settings.SpecialCase)
            {
                modifier = AccessModifier.Public;
            }

            WriteFunctionName(element.IsStatic, modifier, name, sw, isInterfaceMethod);
            WriteMethodParameters(element, resolver, sw);
            WriteRestOfDeclaration(type, sw);

            if (isInterfaceMethod)
            {
                sw.Write(";");
                sw.Br();
            }
            else
            {
                GenerateBody(type, resolver, sw);
            }
            sw.UnTab();
        }
コード例 #8
0
 /// <summary>
 ///     Writes output comment with automatic multiline division
 /// </summary>
 /// <param name="sw">Output writer</param>
 /// <param name="comment">Comment (multiline allowed)</param>
 public void WriteComment(WriterWrapper sw, string comment)
 {
     sw.Br();
     sw.Indent();
     var lines = comment.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries);
     if (lines.Length == 1)
     {
         sw.WriteLine("// {0} ", lines[0]);
     }
     else
     {
         Begin(sw);
         foreach (var line in lines)
         {
             Line(sw, line);
         }
         End(sw);
         sw.Br();
     }
 }