Exemple #1
0
        protected IField GenerateBackingField(IProperty pe)
        {
            var field = GenerateFakeField(pe);

            field.Name = "_" + SkJs.GetEntityJsName(pe);
            return(field);
        }
        public TsFunction Visit(IMethod me)
        {
            if (me is FakeMethod)
            {
                return(null);
            }
            TsFunction me2 = new TsFunction
            {
                Name       = SkJs.GetEntityJsName(me),
                IsStatic   = me.IsStatic,
                Parameters = me.Parameters.Select(Visit).ToList()
            };

            if (me.SymbolKind == SymbolKind.Constructor)
            {
                me2.Name = SkJs.GetEntityJsName(me);// "constructor";
                //if (me2.Name.StartsWith("."))
                //me2.IsConstructor = true;
            }
            else
            {
                me2.Type           = Visit(me.ReturnType);
                me2.TypeParameters = me.TypeParameters.Select(Visit).ToList();
            }
            return(me2);
        }
        public override JsNode ExportMethod(IMethod me)
        {
            if (Sk.IsGlobalMethod(me))
            {
                return(CreateGlobalMemberConverter().ExportMethod(me));
            }
            var node = base.ExportMethod(me);

            if (node == null)
            {
                return(node);
            }
            if (!node.Is(JsNodeType.Function))
            {
                return(node);
            }

            var func = (JsFunction)node;

            func.Name = null;
            var ce     = me.GetDeclaringTypeDefinition();
            var member = ExportTypePrefix(ce, me.IsStatic);

            member = member.Member(SkJs.GetEntityJsName(me));
            if (LongFunctionNames)
            {
                func.Name = SkJs.GetLongFunctionName(me);
            }
            var st = member.Assign(func).Statement();

            return(st);
        }
        private JsClrAttribute ExportAttribute(IEntity parent, IAttribute att)
        {
            var attCtor = att.Constructor;
            var attType = att.AttributeType;
            var target  = GetAttributeTarget(parent, att);
            var jsAtt   = new JsClrAttribute
            {
                targetType       = target.Key,
                targetMemberName = target.Value,
                typeName         = SkJs.GetEntityJsName(attType),
                ctorName         = SkJs.GetEntityJsName(attCtor),
            };

            if (att.PositionalArguments.IsNotNullOrEmpty())
            {
                jsAtt.positionalArguments = new JsArray <object>();
                var args = att.PositionalArguments.Select(exp => ImportAttributeValue(exp)).ToList();
                jsAtt.positionalArguments.AddRange(args);
            }
            if (att.NamedArguments.IsNotNullOrEmpty())
            {
                jsAtt.namedArguments = new JsObject();
                foreach (var arg in att.NamedArguments)
                {
                    jsAtt.namedArguments[arg.Key.Name] = ImportAttributeValue(arg.Value);
                }
            }
            return(jsAtt);
        }
        protected virtual JsNode ExportPropertyInfo(IProperty pe)
        {
            var name  = SkJs.GetEntityJsName(pe) + "$$";
            var value = Js.String(pe.GetPropertyTypeRef().GetFullyQualifiedCLRName());

            //CurrentType.GetDefinition(pe.IsStatic)[name] = value;
            return(Js.JsonNameValue(name, value));
        }
Exemple #6
0
        protected IField GenerateBackingField(IProperty pe)
        {
            var field = GenerateFakeField(pe);

            // 这里容易冲突,因此前缀复杂一点好
            field.Name = AutoPropertyPrefix + SkJs.GetEntityJsName(pe);
            return(field);
        }
Exemple #7
0
        public JsNode VisitMemberResolveResult(MemberResolveResult res)
        {
            var    me = res.Member;
            JsNode node2;
            bool   enumValuesAsNames;

            if (me == null) //TODO: dynamics
            {
                throw new NotImplementedException();
                //var node3 = Js.Member(node.MemberName);
                //if (node.Target != null)
                //    node3.PreviousMember = VisitExpression(node.Target);
                //return node3;
            }
            else if (Sk.IsEntityFunctionProperty(res.Member, res))//(Entity)node.entity))
            {
                var pe  = (IProperty)me;
                var xxx = new CSharpInvocationResolveResult(res.TargetResult, pe.Getter, null);
                node2 = Visit(xxx);
                return(node2);
            }
            else if (me.IsEnumMember() && Sk.UseJsonEnums(me, out enumValuesAsNames))
            {
                var me2 = (IField)me;
                if (enumValuesAsNames)
                {
                    return(Js.String(SkJs.GetEntityJsName(me2)));
                }
                else
                {
                    return(Js.Value(me2.ConstantValue));
                }
            }
            //TODO: Support a way to override this (JsField.ConstantInlining=false)
            else if (res.IsCompileTimeConstant && !me.IsEnumMember())
            {
                return(Js.Value(res.ConstantValue));
            }
            else
            {
                var node3 = SkJs.EntityToMember(me);
                node2 = node3;
                if (res.TargetResult != null && !me.IsStatic())
                {
                    var instanceContext = VisitExpression(res.TargetResult);
                    if (node3.Name.IsNullOrEmpty()) //support Name=""
                    {
                        node2 = instanceContext;
                    }
                    else
                    {
                        node3.PreviousMember = instanceContext;
                    }
                }
            }
            return(node2);
        }
        public override JsNode ExportConstructor(IMethod ctor)
        {
            var ctorName = SkJs.GetEntityJsName(ctor);
            var func     = base.ExportConstructor(ctor);

            //CurrentType.definition[ctorName] = func;
            return(Js.JsonNameValue(ctorName, (JsExpression)func));
            //return func;
        }
Exemple #9
0
        public virtual JsNode ExportConstructor(IMethod ctor)
        {
            var ctorName = SkJs.GetEntityJsName(ctor);
            var func     = new JsFunction {
                Parameters = new List <string>()
            };

            func.Block = ExportConstructorBody(ctor);
            ExportConstructorParameters(ctor, func);
            return(func);
        }
Exemple #10
0
        public virtual JsNode ExportMethod(IMethod me)
        {
            var jma = Sk.GetJsMethodAttribute(me);

            if (jma != null && jma.GlobalCode)
            {
                var block = ExportMethodBody(me);
                return(new JsUnit {
                    Statements = block.Statements
                });
            }
            var func = new JsFunction();

            func.Parameters = ExportMethodParameters(me);
            func.Name       = SkJs.GetEntityJsName(me);
            func.Block      = ExportMethodBody(me);
            func            = ApplyYield(func);
            return(func);
        }
 private KeyValuePair <string, string> GetAttributeTarget(IEntity parent, IAttribute att)
 {
     if (parent is ITypeDefinition)
     {
         return(new KeyValuePair <string, string>("type", null));
     }
     else if (parent.SymbolKind == SymbolKind.Property)
     {
         return(new KeyValuePair <string, string>("property", SkJs.GetEntityJsName(parent)));
     }
     else if (parent.SymbolKind == SymbolKind.Method)
     {
         var method = (IMethod)parent;
         if (method.IsConstructor)
         {
             return(new KeyValuePair <string, string>("constructor", SkJs.GetEntityJsName(method)));
         }
         else
         {
             return(new KeyValuePair <string, string>("method", SkJs.GetEntityJsName(method)));
         }
     }
     throw new NotImplementedException("GetAttributeTarget no implemented for member: " + parent);
 }
        public TsType Visit(ITypeDefinition ce)
        {
            var name = SkJs.GetEntityJsName(ce);
            var ce2  = new TsType
            {
                Name           = name, Kind = (ce.IsInterface() || ce.IsDelegate()) ? TsTypeKind.Interface :  TsTypeKind.Class,
                TypeParameters = ce.TypeParameters.Select(Visit).ToList()
            };

            if (name.Contains("."))
            {
                var pair = name.SplitAt(name.LastIndexOf("."), true);
                ce2.Name           = pair[1];
                ce2.ModuleName     = pair[0];
                ce2.IsModuleExport = true;
            }
            if (ce.IsDelegate())
            {
                var func = Visit(ce.GetDelegateInvokeMethod());
                //func.IsCallSignature = true;
                func.Name = null;
                ce2.Members.Add(func);
            }
            else
            {
                var members  = TypeConverter.ClrConverter.GetMembersToExport(ce);
                var members2 = members.Select(Visit).Where(t => t != null).ToList();
                ce2.Members.AddRange(members2);
                if (ce2.Kind == TsTypeKind.Class)
                {
                    ce2.Members.OfType <TsFunction>().Where(t => !t.IsConstructor || !t.Type.IsNullOrVoid()).ForEach(t => t.Body = "return null;");
                    ce2.Members.OfType <TsFunction>().Where(t => t.IsConstructor).ForEach(t => t.Body = "");
                }
            }
            return(ce2);
        }
Exemple #13
0
 internal JsExpression InitializersToJson(IList <ResolveResult> initializerStatements, IType type)
 {
     //if (Sk.IsNativeArrayEnumerator(type.GetDefinition()))
     //FIX for issue 325:
     if (Sk.IsNativeArrayEnumerator(type.GetDefinition()) && (initializerStatements.IsEmpty() || initializerStatements[0] is CSharpInvocationResolveResult))
     {
         var items  = initializerStatements.Cast <CSharpInvocationResolveResult>().Select(t => t.Arguments[0]).ToList();
         var items2 = VisitExpressions(items);
         var arr    = Js.NewJsonArray(items2.ToArray());
         return(arr);
     }
     else
     {
         var json = Js.Json();
         foreach (var st in initializerStatements)
         {
             if (st is OperatorResolveResult)
             {
                 var op    = (OperatorResolveResult)st;
                 var mrr   = (MemberResolveResult)op.Operands[0];
                 var name  = SkJs.GetEntityJsName(mrr.Member);
                 var value = VisitExpression(op.Operands[1]);
                 var pair  = Js.JsonNameValue(name, value);
                 if (mrr.TargetResult is MemberResolveResult)   //happens when using object initializers to set inner properties, e.g. new Parent { Child = { Name="ggg" } }
                 {
                     var targetMrr = (MemberResolveResult)mrr.TargetResult;
                     var name2     = SkJs.GetEntityJsName(targetMrr.Member);
                     var innerJson = Js.Json();
                     innerJson.Add(pair);
                     pair = Js.JsonNameValue(name2, innerJson);
                 }
                 json.Add(pair);
             }
             else if (st is InvocationResolveResult)
             {
                 var irr       = (InvocationResolveResult)st;
                 var targetMrr = irr.TargetResult as MemberResolveResult;
                 if (targetMrr == null)
                 {
                     throw new CompilerException(st.GetFirstNode(), "Expected MemberResolveResult");
                 }
                 var name = SkJs.GetEntityJsName(targetMrr.Member);
                 if (irr.Arguments.Count != 1)
                 {
                     throw new CompilerException(st.GetFirstNode(), "Expected one argument, not " + name + " " + irr.Arguments.Count);
                 }
                 var value      = VisitExpression(irr.Arguments[0]);
                 var jsonMember = json.NamesValues.NotNull().FirstOrDefault(t => t.Name.Name == name);
                 if (jsonMember == null)
                 {
                     json.Add(name, Js.NewJsonArray(value));
                 }
                 else
                 {
                     var array = jsonMember.Value as JsJsonArrayExpression;
                     if (array == null)
                     {
                         throw new CompilerException(st.GetFirstNode(), "json member value array not found " + name);
                     }
                     array.Items.Add(value);
                 }
             }
             else
             {
                 throw new NotImplementedException();
             }
         }
         //var inits2 = initializerStatements.Select(t => Visit(t)).ToList();
         //var namesValues = inits2.Cast<JsBinaryExpression>().Select(t => Js.JsonNameValue(((JsMemberExpression)t.Left).Name, t.Right)).ToList();
         //var json = Js.Json();
         //json.NamesValues = namesValues;
         return(json);
     }
 }
Exemple #14
0
        public JsNode VisitMemberResolveResult(MemberResolveResult res)
        {
            var    me = res.Member;
            JsNode node2;
            bool   enumValuesAsNames;

            if (me == null) //TODO: dynamics
            {
                throw new NotImplementedException();
                //var node3 = Js.Member(node.MemberName);
                //if (node.Target != null)
                //    node3.PreviousMember = VisitExpression(node.Target);
                //return node3;
            }
            else if (Sk.IsEntityFunctionProperty(res.Member, res))//(Entity)node.entity))
            {
                var pe  = (IProperty)me;
                var xxx = new CSharpInvocationResolveResult(res.TargetResult, pe.Getter, null);
                var fn  = res.GetFirstNode();
                qiucw.InvokeRR2Location.Add(xxx, new qiucw.InvocationLocation {
                    FileName = fn.GetFileName(), Line = fn.StartLocation.Line
                });
                {
                    node2 = Visit(xxx);
                }
                qiucw.InvokeRR2Location.Remove(xxx);
                return(node2);
            }
            else if (me.IsEnumMember() && Sk.UseJsonEnums(me, out enumValuesAsNames))
            {
                var me2 = (IField)me;
                if (enumValuesAsNames)
                {
                    return(Js.String(SkJs.GetEntityJsName(me2)));
                }
                else
                {
                    return(Js.Value(me2.ConstantValue));
                }
            }
            //TODO: Support a way to override this (JsField.ConstantInlining=false)
            else if (res.IsCompileTimeConstant && !me.IsEnumMember())
            {
                var nodes = res.GetNodes();
                if (nodes.IsNotNullOrEmpty())
                {
                    if (nodes[0] != null)
                    {
                        bool isPrimitiveExpr = nodes[0] is PrimitiveExpression;
                        if (!isPrimitiveExpr)
                        {
                            return(Js.Value(res.ConstantValue, string.Format(" /* {0} */", nodes[0].ToString())));
                        }
                    }
                }
                return(Js.Value(res.ConstantValue));
            }
            else
            {
                var node3 = SkJs.EntityToMember(me);
                qiucw.CheckAddInvocation(res, node3.Name);
                node2 = node3;
                if (res.TargetResult != null && !me.IsStatic())
                {
                    var instanceContext = VisitExpression(res.TargetResult);
                    if (node3.Name.IsNullOrEmpty()) //support Name=""
                    {
                        node2 = instanceContext;
                    }
                    else
                    {
                        node3.PreviousMember = instanceContext;
                    }
                }
            }
            return(node2);
        }
        private TsTypeRef Visit(IType type)
        {
            if (type == null)
            {
                return new TsTypeRef {
                           Name = "void"
                }
            }
            ;
            var typeDef = type.GetDefinition();

            if (typeDef != null)
            {
                var ktc = typeDef.KnownTypeCode;

                if (ktc != KnownTypeCode.None)
                {
                    if (ktc == KnownTypeCode.Void)
                    {
                        return new TsTypeRef {
                                   Name = "void"
                        }
                    }
                    ;
                    else if (ktc == KnownTypeCode.Object)
                    {
                        return new TsTypeRef {
                                   Name = "any"
                        }
                    }
                    ;
                    else if (ktc == KnownTypeCode.String)
                    {
                        return new TsTypeRef {
                                   Name = "string"
                        }
                    }
                    ;
                    else if (ktc == KnownTypeCode.Boolean)
                    {
                        return new TsTypeRef {
                                   Name = "boolean"
                        }
                    }
                    ;
                    else if (ktc == KnownTypeCode.Int32 ||
                             ktc == KnownTypeCode.Int32 ||
                             ktc == KnownTypeCode.Int16 ||
                             ktc == KnownTypeCode.Int64 ||
                             ktc == KnownTypeCode.Double ||
                             ktc == KnownTypeCode.Single ||
                             ktc == KnownTypeCode.SByte ||
                             ktc == KnownTypeCode.Byte ||
                             ktc == KnownTypeCode.UInt16 ||
                             ktc == KnownTypeCode.UInt32 ||
                             ktc == KnownTypeCode.UInt64 ||
                             ktc == KnownTypeCode.Decimal
                             )
                    {
                        return new TsTypeRef {
                                   Name = "number"
                        }
                    }
                    ;
                }
                if (Sk.IsJsonMode(typeDef))
                {
                    return new TsTypeRef {
                               Name = "Object"
                    }
                }
                ;
                if (type.Kind == TypeKind.Delegate && !Sk.IsJsExported(type.GetDefinition()))
                {
                    var func = Visit(type.GetDelegateInvokeMethod());

                    func.Name            = null;
                    func.IsCallSignature = true;
                    return(new TsTypeRef {
                        AnonymousCallSignature = func
                    });
                }
            }
            var tr2 = new TsTypeRef {
                Name = SkJs.GetEntityJsName(type)
            };

            tr2.GenericArguments = type.TypeArguments.Select(Visit).ToList();
            if (tr2.Name == "Array" && tr2.GenericArguments.Count == 0)
            {
                tr2.GenericArguments.Add(new TsTypeRef {
                    Name = "any"
                });
            }
            return(tr2);
        }
Exemple #16
0
        public static ResolveResult GetValueTypeInitializer(IType ce, NProject Project)
        {
            var fullName = SkJs.GetEntityJsName(ce);

            if (ce.FullName == "System.Nullable")
            {
                return(Cs.Null());
            }
            if (ce is ITypeDefinition)
            {
                var def = (ITypeDefinition)ce;
                if (def.KnownTypeCode != KnownTypeCode.None)
                {
                    if (def.KnownTypeCode == KnownTypeCode.Boolean)
                    {
                        return(Cs.Value(false, Project));
                    }
                    else if (def.KnownTypeCode == KnownTypeCode.Char)
                    {
                        return(Cs.Value('\0', Project));
                    }
                    else if (def.KnownTypeCode == KnownTypeCode.SByte ||
                             def.KnownTypeCode == KnownTypeCode.Int16 ||
                             def.KnownTypeCode == KnownTypeCode.Int32 ||
                             def.KnownTypeCode == KnownTypeCode.Int64 ||
                             def.KnownTypeCode == KnownTypeCode.UInt16 ||
                             def.KnownTypeCode == KnownTypeCode.UInt32 ||
                             def.KnownTypeCode == KnownTypeCode.UInt64 ||
                             def.KnownTypeCode == KnownTypeCode.Byte ||
                             def.KnownTypeCode == KnownTypeCode.Decimal ||
                             def.KnownTypeCode == KnownTypeCode.Double ||
                             def.KnownTypeCode == KnownTypeCode.Single
                             )
                    {
                        return(Cs.Value(0, Project));
                    }
                }
            }
            if (ce.Kind == TypeKind.Enum)
            {
                var en                = ce;
                var enumMembers       = en.GetFields();
                var defaultEnumMember = enumMembers.Where(t => (t.ConstantValue is int) && (int)t.ConstantValue == 0).FirstOrDefault() ?? enumMembers.FirstOrDefault();
                if (defaultEnumMember != null)
                {
                    return(defaultEnumMember.AccessSelf());//.Access().Member(c.CreateTypeRef(en), defaultEnumMember);
                }
                else
                {
                    return(null);
                }
            }
            else if (ce.GetEntityType().FullName == "System.DateTime")
            {
                var minDateFe = ce.GetFields(t => t.Name == "MinValue").First();
                return(minDateFe.AccessSelf());// c.Member(c.Class(c.DateTimeType), minDateFe);
            }
            else
            {
                return(Cs.New(ce));
            }
        }
Exemple #17
0
        protected JsBlock ExportMethodBody(IMethod me)
        {
            if (CompilerConfiguration.Current.EnableLogging)
            {
                Log.Debug("JsTypeImporter: Visit Method: " + me.ToString());
            }
            var nativeCode = Sk.GetNativeCode(me);

            if (nativeCode != null)
            {
                var block = Js.Block().Add(Js.CodeStatement(nativeCode)); //TODO: double semicolon?
                return(block);
            }
            var def = me.GetDefinition();

            if (def == null || def.IsNull)
            {
                if (me.IsAutomaticEventAccessor())
                {
                    if (me.IsEventAddAccessor())
                    {
                        var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), false);
                        return(node.Block);
                    }
                    else if (me.IsEventRemoveAccessor())
                    {
                        var node = GenerateAutomaticEventAccessor((IEvent)me.GetOwner(), true);
                        return(node.Block);
                    }
                }
                else if (me.IsAutomaticPropertyAccessor())
                {
                    var bf = Js.Member(AutoPropertyPrefix + SkJs.GetEntityJsName(me.AccessorOwner));
                    if (!me.IsStatic)
                    {
                        bf.PreviousMember = Js.This();
                    }
                    else if (!Sk.IsGlobalMethod(me))
                    {
                        bf.PreviousMember = SkJs.EntityToMember(me.DeclaringTypeDefinition);
                    }
                    if (me.IsGetter())
                    {
                        return(Js.Block().Add(Js.Return(bf)));
                    }
                    else
                    {
                        return(Js.Block().Add(bf.Assign(Js.Member("value")).Statement()));
                    }
                }
                return(null);
            }
            var block2 = (JsBlock)AstNodeConverter.Visit(def);

            block2.ContainsYield = false;
            if (def.Descendants.OfType <YieldReturnStatement>().FirstOrDefault() != null)
            {
                block2.ContainsYield = true;
                if (!AstNodeConverter.SupportClrYield)
                {
                    if (block2.Statements == null)
                    {
                        block2.Statements = new List <JsStatement>();
                    }
                    //block2.Statements.Insert(0, Js.Var("$yield", Js.NewJsonArray()).Statement());
                    //block2.Statements.Add(AstNodeConverter.GenerateYieldReturnStatement(me));
                }
            }
            return(block2);
        }
Exemple #18
0
 protected string GetJsTypeName(IType etr)
 {
     return(SkJs.GetEntityJsName(etr));//.FixClassName(etr, true);
 }