コード例 #1
0
        public override JsNode _VisitDelegate(ITypeDefinition ce)
        {
            var CurrentType = new JsClrType {
                Kind = JsClrTypeKind.Delegate
            };

            CurrentType.fullname = GetJsTypeName(ce);

            //Generate constructor
            var genericParams = new List <ITypeParameter>(ce.GetGenericArguments());
            var func          = new JsFunction();

            func.Parameters = genericParams.Select(t => t.Name).ToList();
            func.Parameters.Add("obj");
            func.Parameters.Add("func");
            func.Block = Js.Block();
            foreach (var ga in genericParams)
            {
                func.Block.Add(Js.This().Member(ga.Name).Assign(Js.Member(ga.Name)).Statement());
            }
            func.Block.Add(Js.Members("System.MulticastDelegate.ctor.call").Invoke(Js.This(), Js.Member("obj"), Js.Member("func")).Statement());
            CurrentType.GetDefinition(false)["ctor"] = func;
            return(OnAfterExportType(ce, CurrentType));
            //return func;

            //FullName',{ ShortName:function(T1,T2,T3,...,obj,func){this.T1=T1;....;this.construct(obj,func);},   })");
        }
コード例 #2
0
 private void ImportToType(JsClrType ce, List <EntityToJsNode> mappings)
 {
     foreach (var map in mappings)
     {
         if (map.JsNode == null)
         {
             continue;
         }
         var isStatic = map.Entity.IsStatic();
         var def      = ce.GetDefinition(isStatic);
         List <JsJsonNameValue> pairs;
         if (map.JsNode is JsNodeList)
         {
             pairs = ((JsNodeList)map.JsNode).Nodes.Cast <JsJsonNameValue>().ToList();
         }
         else
         {
             pairs = new List <JsJsonNameValue> {
                 (JsJsonNameValue)map.JsNode
             }
         };
         foreach (var pair in pairs)
         {
             if (pair == null)
             {
                 throw new CompilerException(map.Entity, "Export of entity is null");
             }
             var name = pair.Name.Name;
             //if (def[name] != pair.Value)
             //    throw new Exception();
             def[name] = pair.Value;
         }
     }
 }
コード例 #3
0
        protected virtual JsUnit OnAfterExportType(ITypeDefinition ce, JsClrType jsType)
        {
            //HACK: backward
            if (jsType.Kind == JsClrTypeKind.Interface && jsType.baseTypeName.IsNullOrEmpty())
            {
                jsType.baseTypeName = "System.Object";
            }
            var unit = new JsUnit {
                Statements = new List <JsStatement>()
            };

            unit.Statements.Add(VerifyJsTypesArrayStatement.Clone());

            var json      = (JsJsonObjectExpression)Serialize(jsType);
            var moveToEnd = json.NamesValues.Where(t => t.Name.Name.Contains("definition")).ToList();

            moveToEnd.ForEach(t => json.NamesValues.Remove(t));
            json.NamesValues.AddRange(moveToEnd);

            var ceVarName = GetJsTypeName(ce).Replace(".", "$");

            unit.Statements.Add(Js.Var(ceVarName, json).Statement());
            unit.Statements.Add(Js.Member("JsTypes").Member("push").Invoke(Js.Member(ceVarName)).Statement());
            return(unit);
        }
コード例 #4
0
        protected override JsUnit OnAfterExportType(ITypeDefinition ce, JsClrType jsType)
        {
            var extJsType = new ExtJsType
            {
                extend  = jsType.baseTypeName,
                statics = jsType.staticDefinition,
            };
            //if (extJsType.extend == "System.Object")
            //    extJsType.extend = null;
            var json = (JsJsonObjectExpression)Serialize(extJsType);

            //var ctor = json.NamesValues.Where(t => t.Name.Name == "ctor").FirstOrDefault();
            if (jsType.definition == null)
            {
                jsType.definition = new JsObject();
            }
            var ctor = jsType.definition.TryGetValue("ctor");

            if (ctor != null)
            {
                jsType.definition.Remove("ctor");
                jsType.definition.Add("constructor", ctor);
                //ctor.Name.Name = "constructor";
                //var func = ctor.Value as JsFunction;
                //if (func != null)
                //{
                //    func.Block.Statements.Insert(0, Js.This().Member("callSuper").Invoke(Js.Member("arguments")).Statement());
                //}
            }
            foreach (var me in jsType.definition)
            {
                var name  = me.Key;
                var value = (JsExpression)me.Value;
                if (json.NamesValues == null)
                {
                    json.NamesValues = new List <JsJsonNameValue>();
                }
                json.NamesValues.Add(new JsJsonNameValue {
                    Name = new JsJsonMember {
                        Name = name
                    }, Value = value
                });
            }

            var define = Js.Members("Ext.define").Invoke(Js.String(jsType.fullname), json).Statement();
            var unit   = new JsUnit {
                Statements = new List <JsStatement> {
                    define
                }
            };

            return(unit);// base.OnAfterExportType(ce, jsType);
        }
コード例 #5
0
        private void ExportImplementedInterfaces(ITypeDefinition ce, JsClrType jsType)
        {
            var list = ce.DirectBaseTypes.Where(t => t.Kind == TypeKind.Interface).ToList();

            if (list.Count == 0)
            {
                return;
            }
            if (jsType.interfaceNames == null)
            {
                jsType.interfaceNames = new JsArray <string>();
            }
            jsType.interfaceNames.AddRange(list.Select(GetJsTypeName));
        }
コード例 #6
0
        public override JsNode _VisitEnum(ITypeDefinition ce)
        {
            var CurrentType = new JsClrType {
                Kind = JsClrTypeKind.Enum
            };

            CurrentType.fullname = GetJsTypeName(ce);
            var json = VisitEnumToJson(ce);

            foreach (var item in json.NamesValues)
            {
                ////TODO: baseType (long, byte, etc...)
                //foreach (var pe in ce.GetConstants())
                //{
                //var name = pe.Name;
                CurrentType.GetDefinition(true)[item.Name.Name] = item.Value;
                //  }
            }
            return(OnAfterExportType(ce, CurrentType));
        }
コード例 #7
0
        private JsNode ExportClassStructInterface(ITypeDefinition ce)
        {
            var jsType = new JsClrType();

            jsType.Kind     = GetJsTypeKind(ce);
            jsType.fullname = GetJsTypeName(ce);
            var baseClass = GetBaseClassIfValid(ce, true);

            if (baseClass != null)
            {
                var baseClassName = GetJsTypeName(baseClass);
                if (baseClassName != jsType.fullname)   //avoid object:object inheritance recursion
                {
                    jsType.baseTypeName = baseClassName;
                }
            }
            var globalCode = new List <JsUnit>();

            if (!ce.IsInterface() || Sk.NewInterfaceImplementation)
            {
                var members      = GetMembersToExport(ce);
                var inlineFields = Sk.InlineFields(ce);
                var cctor        = ce.GetConstructors(false, true).FirstOrDefault();
                if (cctor == null && !inlineFields && ce.GetFields().Where(t => t.IsStatic).FirstOrDefault() != null)
                {
                    cctor = CreateStaticCtor(ce);
                    if (ShouldExportConstructor(cctor))
                    {
                        members.Insert(0, cctor);
                    }
                }

                var mappings = members.Select(t => new EntityToJsNode {
                    JsNode = Visit(t), Entity = t
                }).ToList();

                //Remove GlobalCode=True members from mappings
                for (var i = mappings.Count - 1; i >= 0; i--)
                {
                    if (mappings[i].JsNode is JsUnit)
                    { //Maybe more clean: Another way could be to check the IEntity for GlobalCode=True
                        globalCode.Add((JsUnit)mappings[i].JsNode);
                        mappings.RemoveAt(i);
                    }
                }

                ImportToType(jsType, mappings);
            }
            ExportImplementedInterfaces(ce, jsType);
            jsType.assemblyName = AssemblyName;
            var atts = ExportCustomAttributes(ce);

            if (atts.IsNotNullOrEmpty())
            {
                if (jsType.customAttributes == null)
                {
                    jsType.customAttributes = new JsArray <JsClrAttribute>();
                }
                jsType.customAttributes.AddRange(atts);
            }
            var unit = OnAfterExportType(ce, jsType);

            globalCode.ForEach(t => unit.Statements.AddRange(t.Statements));
            return(unit);
        }