예제 #1
0
 private Class GenerateClass(object node)
 {
     var names = node.GetNames();
     var ce = new Class
     {
         FullName = node.Get<string>("name"),
         Tag = node,
     };
     ImportDocumentation(ce, node);
     Assembly.Classes.Add(ce);
     return ce;
 }
예제 #2
0
 string Class(Class ce, Class context=null)
 {
     if (context == null)
         context = ContextClass;
     string name = null;
     if (ce.GenericArguments.Count > 0)
         name = ce.Name.Substring(0, ce.Name.IndexOf("`")) + ce.GenericArguments.StringConcat(t=>Class(t), "<", ", ", ">");
     else
         name = ce.Name;
     if (ce.Namespace.IsNotNullOrEmpty())
     {
         if(context!=null && !context.Namespace.StartsWith(ce.Namespace))
             name = ce.Namespace + "." + name;
         else if (Assembly != null && Assembly.AllClasses.Where(t => t.Name == name).Count() > 1)
             name = ce.Namespace + "." + name;
     }
     return name;
 }
예제 #3
0
 public void Export(Class ce)
 {
     if (!SingleFile)
     {
         ExportHeader();
         BeginNamespace(ce.Namespace);
     }
     ContextClass = ce;
     ExportXmlDoc2(ce);
     ce.Attributes.ForEach(Export);
     Write("public {0}partial {1} {2}", ce.IsNew.If("new "), ce.IsInterface.If("interface", "class"), Identifier(ce.Name));
     var bases = new List<Class>();
     if (ce.BaseClass != null)
         bases.Add(ce.BaseClass);
     bases.AddRange(ce.Interfaces);
     if(bases.Count>0)
     {
         Write(" : ");
         bases.ForEachJoin(t => Write("{0}", Class(t)), WriteComma);
     }
     WriteLine();
     BeginBlock();
     ce.Members.ForEach(Export);
     EndBlock();
     ContextClass = null;
     if (!SingleFile)
         EndNamespace();
 }
예제 #4
0
 void ReplaceType(Class a, Class b)
 {
     foreach (var ce in Assembly.AllClasses)
     {
         ce.Members.Where(t => t.Type == a).ForEach(t => t.Type = b);
         foreach (var me in ce.Methods())
         {
             me.Parameters.Where(t => t.Type == a).ForEach(t => t.Type = b);
         }
     }
 }
예제 #5
0
 private static void AddOptionalOverloads(Class ce, Method me, List<Parameter> optionalParameters)
 {
     foreach (var prm in optionalParameters.ToArray())
     {
         var me2 = me.Clone();
         me2.Parameters.Remove(me2.Parameters.Where(t => t.Name == prm.Name).First());
         ce.Members.Add(me2);
         var op2 = optionalParameters.ToArray().ToList();
         op2.Remove(prm);
         AddOptionalOverloads(ce, me2, op2);
     }
 }
예제 #6
0
 static bool HasEmptyOrDefaultConstructor( Class ce )
 {
     var ctors = ce.Members.OfType<Method>().Where( t => t.IsConstructor ).ToList();
     return ctors.Count == 0 || ctors.Any( ctor => ctor.Parameters.Count == 0 || ctor.Parameters.All( t => t.IsOptional ) );
 }
예제 #7
0
 static bool IsDeclared( Class ce, ExtMember me2 )
 {
     return ce.Members.Any( m => m.Name.Replace( "@", "" ).Equals( me2.name.Replace( "@", "" ) ) );
 }
예제 #8
0
        private static void InitAssemlyContext()
        {
            Assembly = new Assembly
            {
                Usings = new List<string> 
                { 
                    "SharpKit.JavaScript",
             }
            };
            Context = new AssemblyContext
            {
                ClassMappings = new Dictionary<string, string>
                {
                    {"object", "object"},
                    {"Object", "object"},
                    {"Element", "Ext.dom.Element"},
                    {"Ext.Element", "Ext.dom.Element"},
                    {"Ext.core.Element", "Ext.dom.Element"},
                    {"Ext.dom.ElementLoader", "Ext.ElementLoader"},
                    {"Ext.ux.form.FileUploadField","Ext.form.field.File"},
                    {"HTMLElement", "Ext.dom.Element"},
                    {"Function", "System.Delegate"},
                    {"Array", "JsArray"},
                    {"String", "JsString"},
                    {"string", "JsString"},
                    {"Boolean", "bool"},
                    {"Boolan", "bool"},
                    {"boolean", "bool"},
                    {"Float", "JsNumber"},
                    {"integer", "JsNumber"},
                    {"Number", "JsNumber"},
                    {"number", "JsNumber"},
                    {"int", "JsNumber"},
                    {"Date", "JsDate"},
                    {"RegExp", "JsRegExp"},
                    {"Mixed", "JsObject"},
                    {"Ext.fx.target", "Ext.fx.target.Target"},
                    {"Ext", "Ext.ExtContext"},
                    {"Ext.Container", "Ext.container.Container"},
                    {"Container", "Ext.container.Container"},
                    {"Mixed component", "JsObject"},
                    {"Ext.TabBar", "Ext.tab.Bar"},
                    {"Component", "Ext.Component"},
                    {"Region", "Ext.util.Region"},
                    {"ResizeTracker", "Ext.resizer.ResizeTracker"},
                    {"Regexp", "JsRegExp"},
                    {"Menu", "Ext.menu.Menu"},
                    {"Store", "Ext.data.Store"},
                    {"CompositeElement", "Ext.dom.CompositeElement"},
                    {"Ext.CompositeElement", "Ext.dom.CompositeElement"},
                    {"Label", "Ext.form.Label"},
                    {"Model", "Ext.data.Model"},
                    {"Ext.grid.Grid", "Ext.grid.property.Grid"},
                    //{"*", "JsObject"},
                    {"ColorPicker", "Ext.menu.ColorPicker"},
                    {"MultiSlider", "Ext.slider.Multi"},
                    {"XMLElement", "JsObject"},
                    {"CSSStyleSheet", "JsObject"},
                    {"CSSStyleRule", "JsObject"},
                  }
            };
            Context.Assemblies.Add( Assembly );
            var asm = new Assembly
            {
                Classes = new List<Class>
                {
                    new Class{Name="void"},
                    new Class{Name="object"},
                    new Class{Name="object"},
                    new Class{Name="JsObject"},
                    new Class{Name="JsArray"},
                    new Class{Name="JsArray`1"},
                    new Class{Name="JsDate"},
                    new Class{Name="JsRegExp"},
                    new Class{Name="JsFunc`1`1"},
                    new Class{Name="JsFunc`1`2"},
                    new Class{Name="JsFunc`1`3"},
                    new Class{Name="JsFunc`1`4"},
                    new Class{Name="JsAction"},
                    new Class{Name="JsAction`1"},
                    new Class{Name="JsAction`2"},
                    new Class{Name="JsAction`3"},
                    new Class{Name="JsAction`4"},
                    new Class{Name="bool"},
                    new Class{Name="JsString"},
                    new Class{Name="JsNumber"},
                    new Class{Name="JsContext"},
                    new Class{Name="Delegate", FullName = "System.Delegate"},
               }
            };
            Context.Assemblies.Add( asm );
            ObjectClass = Context.GetClass( "object" );
            VoidClass = Context.GetClass( "void" );

        }
예제 #9
0
        static bool InterfaceMemberIsImplementedBySelfOrBaseClass( Element el, Class cls )
        {
            var baseCls = cls;
            while ( baseCls != null )
            {
                //Last check is because (ej) Ext.Base implements all "basic" members requied by interfaces but doesn't implement any interface so members are private there, that shouldn't happen...
                if ( !baseCls.IsInterface && baseCls.IsDeclared( el, true ) /*&& baseCls.Interfaces.Any( i => i.Members.Any( m => m == el ) )*/ )
                    return true;
                baseCls = baseCls.BaseClass;
            }

            return false;
        }
예제 #10
0
 static Class GetClass( string name, bool? autoCreate = null )
 {
     if ( name.IsNullOrEmpty() )
         return null;
     name = name.Trim( '[', ']', '.' );
     var ce = Context.GetClass( name );
     if ( ce == null )
     {
         if ( name.Contains( "/" ) || name.Contains( "|" ) )
             return ObjectClass;
     }
     name = Context.ClassMappings.TryGetValue( name ) ?? name;
     if ( ce == null && autoCreate.GetValueOrDefault( true ) )
     {
         if ( autoCreate == null )
         {
         }
         ce = new Class { FullName = name };
         Assembly.Classes.Add( ce );
     }
     return ce;
 }
예제 #11
0
 private static Class GenerateClass(Dictionary<string, object> obj)
 {
     var ce = new Class();
     Assembly.Classes.Add(ce);
     foreach (var pair in obj)
     {
         var name = pair.Key;
         var value = pair.Value;
         var pe = new Property { Name = pair.Key };
         pe.Type = GenerateClass(value);
         ce.Members.Add(pe);
         if (pe.Type == null)
         {
         }
     }
     ce.Members = ce.Members.OrderBy(t => t.Name).ToList();
     return ce;
 }
예제 #12
0
 public Class MakeGenericClass( Class ce, List<Class> genericArgs )
 {
     return new Class { Name = ce.Name, Namespace = ce.Namespace, GenericArguments = genericArgs };
 }
        private void GenerateMember(Class ce, object node)
        {
            var signatures = node.GetValues("signatures");
            if (signatures.IsNullOrEmpty())
            {
                GenerateMember(ce, node, null);
            }
            else
            {
                foreach (var signature in signatures)
                {
                    GenerateMember(ce, node, signature);

                }
            }
        }
        private void GenerateMember(Class ce, object node, object signature)
        {
            var names = node.GetNames();
            var itemType = node.Get<string>("type");
            var name = node.Get<string>("name");
            var access = node.Get<string>("access");
            if (name.IsNullOrEmpty())
            {
                Console.WriteLine("Warning: empty name " + name);
                return;
            }
            var className = node.Get<string>("class");
            var type = "object";// node.Get<string>("type");
            //var ce = FindClass(className);
            if (ce == null)
            {
                Console.WriteLine("Warning: Can't find class: " + className);
                return;
            }
            Element me2 = null;
            if (itemType == "attribute" || itemType == "property")
            {
                var isReadOnly = node.Get<string>("readonly") != null;
                if (type.IsNullOrEmpty())
                {
                    type = "object";
                    Console.WriteLine("Warning: type is null: " + className + "." + name + " assuming object");
                    //return;
                }
                var pe = new Property
                {
                    Name = name,
                    Type = FindClass(type),
                };
                pe.IsReadOnly = isReadOnly;
                if (Char.IsDigit(pe.Name[0]))
                {
                    Console.WriteLine("Warning: Invalid name " + pe.Name);
                    return;
                }
                if (pe.Type == null)
                {
                    Console.WriteLine("Warning: type is null");
                    return;
                }

                ce.Members.Add(pe);
                if (itemType == "attribute")
                {
                    var ctor = ce.GetEmptyConstructor();
                    if (ctor == null)
                    {
                        ctor = new Method
                        {
                            IsConstructor = true,
                            Name=".ctor",
                        };
                        ce.Members.Add(ctor);
                    }
                    var att = ctor.Attributes.Where(t => t.Name == "JsMethod").FirstOrDefault();
                    if (att == null)
                    {
                        att = new SharpKit.ExtJs4.Generator.Attribute
                        {
                            Name = "JsMethod",
                            NamedParamters = new Dictionary<string, string> { { "JsonInitializers", "true" } },
                        };
                        ctor.Attributes.Add(att);
                    }
                }
                me2 = pe;
            }
            else if (itemType == "method")
            {
                var prms = signature.GetValues("params");
                var returnType = "object";// node.GetValues("return");
                var me = new Method
                {
                    Name = name,
                    //Type = FindClass(node.Get<string>("desc"))
                    //Type = FindClass(type),
                };
                if (me.Name == ce.Name)
                {
                    me.IsConstructor = true;
                    returnType = null;
                }
                if (prms != null)
                    me.Parameters = prms.Select(GenerateParameter).ToList();
                if (me.Parameters.Contains(null))
                {
                    Console.WriteLine("Warning: prms contains nulls:" + className + "." + name);
                    return;
                }
               
                if (returnType != null)
                {
                    //var returnType = returns.LastOrDefault() as string;
                    //returnType = returnType.Split('|').FirstOrDefault().Trim();
                    me.Type = FindClass(returnType);
                    if (me.Type == null)
                    {
                        Console.WriteLine("Cannot resolve method return type: " + className + "." + name);
                        me.Type = ObjectClass;
                    }
                }

                ce.Members.Add(me);
                me2 = me;
            }
            if (me2 != null)
            {
                if (access.IsNullOrEmpty())
                {
                }
                else if (access == "protected")
                    me2.IsProtected = true;
                else if (access == "private")
                    me2.IsPrivate = true;
                else if (access == "public")
                {
                }
                else
                {
                }
                ImportDocumentation(me2, node);

            }
        }