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);
        }
Exemplo n.º 2
0
        protected IField GenerateBackingField(IProperty pe)
        {
            var field = GenerateFakeField(pe);

            field.Name = "_" + SkJs.GetEntityJsName(pe);
            return(field);
        }
Exemplo n.º 3
0
        public JsNode VisitConstantResolveResult(ConstantResolveResult res)
        {
            var nodes = res.GetNodes();

            if (res.Type is DefaultTypeParameter)
            {
                return(Js.Member("Default").Invoke(SkJs.EntityTypeRefToMember(res.Type)));
            }
            if (res.Type != null && res.Type.Kind == TypeKind.Enum)
            {
                var enumMembers = res.Type.GetFields();
                var me          = enumMembers.Where(t => (t.ConstantValue != null) && t.ConstantValue.Equals(res.ConstantValue)).FirstOrDefault();
                if (me != null)
                {
                    return(Visit(me.AccessSelf()));//.Access().Member(c.CreateTypeRef(en), defaultEnumMember);
                }
                //TODO:
                //return Visit(JsTypeImporter.GetValueTypeInitializer(res.Type, Project));
            }
            //var nodes = res.GetNodes();
            //if (nodes.IsNotNullOrEmpty())
            //{
            //    var node = nodes[0];
            //    if (node != null && node is PrimitiveExpression)
            //    {
            //        var node2 = Visit(node); //use literal value instead
            //        return node2;
            //    }
            //}
            return(Js.Value(res.ConstantValue));
        }
Exemplo n.º 4
0
        public JsNode VisitConstantResolveResult(ConstantResolveResult res)
        {
            if (res.Type is DefaultTypeParameter)
            {
                return(Js.Member("Default").Invoke(SkJs.EntityTypeRefToMember(res.Type)));
            }
            if (res.Type != null && res.Type.Kind == TypeKind.Enum)
            {
                var enumMembers = res.Type.GetFields();
                var me          = enumMembers.Where(t => (t.ConstantValue != null) && t.ConstantValue.Equals(res.ConstantValue)).FirstOrDefault();
                if (me != null)
                {
                    return(Visit(me.AccessSelf()));//.Access().Member(c.CreateTypeRef(en), defaultEnumMember);
                }
                //TODO:
                //return Visit(JsTypeImporter.GetValueTypeInitializer(res.Type, Project));
            }
            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));
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
        protected IField GenerateBackingField(IProperty pe)
        {
            var field = GenerateFakeField(pe);

            // 这里容易冲突,因此前缀复杂一点好
            field.Name = AutoPropertyPrefix + SkJs.GetEntityJsName(pe);
            return(field);
        }
Exemplo n.º 8
0
        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));
        }
Exemplo n.º 9
0
        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;
        }
Exemplo n.º 10
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);
        }
Exemplo n.º 11
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);
        }
Exemplo n.º 12
0
        public override JsNode _VisitClass(ITypeDefinition ce)
        {
            var unit = new JsUnit {
                Statements = new List <JsStatement>()
            };

            ExportTypeNamespace(unit, ce);
            var members = GetMembersToExport(ce);

            VisitToUnit(unit, members);
            var baseCe = ce.GetBaseTypeDefinition();

            if (baseCe != null && Sk.IsNativeType(baseCe) && !Sk.IsGlobalType(baseCe) && !Sk.OmitInheritance(ce))
            {
                unit.Statements.Add(Js.Member("$Inherit").Invoke(SkJs.EntityToMember(ce), SkJs.EntityToMember(baseCe)).Statement());
            }
            return(unit);
        }
Exemplo n.º 13
0
        public JsNode VisitArrayCreateResolveResult(ArrayCreateResolveResult res)
        {
            var jsArrayType = SkJs.GetJsArrayType((ArrayType)res.Type);

            JsExpression[] items = null;
            JsExpression   size  = null;

            if (res.InitializerElements.IsNotNullOrEmpty())
            {
                items = VisitExpressions(res.InitializerElements).ToArray();
            }
            else if (res.SizeArguments.IsNotNullOrEmpty())
            {
                size = VisitExpression(res.SizeArguments.Single());
            }

            return(Js.NewArray(jsArrayType, size, items));
        }
Exemplo n.º 14
0
 void ProcessGenericMethodArgs()
 {
     GenericArgs = new List <GenericArg>();
     if (Method != null && Method is SpecializedMethod && !Sk.IgnoreGenericMethodArguments(Method))
     {
         if (Method.IsConstructor)
         {
             var ce = Method.DeclaringType as ParameterizedType;
             if (ce != null)
             {
                 GenericArgs.AddRange(ce.TypeArguments.Select(t => new GenericArg {
                     JsExpression = SkJs.EntityTypeRefToMember(t, true), Arg = t
                 }).ToList());
             }
         }
         else
         {
             var sme = (SpecializedMethod)Method;
             var genericMethodArgs = sme.TypeArguments.Select(t => new GenericArg {
                 JsExpression = SkJs.EntityTypeRefToMember(t, true), Arg = t
             }).ToList();
             var i = 0;
             foreach (var z in Method.TypeParameters)
             {
                 if (i >= genericMethodArgs.Count)
                 {
                     continue;
                 }
                 genericMethodArgs[i].TypeParam = z;
                 i++;
             }
             GenericArgs.AddRange(genericMethodArgs);
         }
         var jsArgs = GenericArgs.Select(t => t.JsExpression).ToList();
         if (Node2.Arguments == null)
         {
             Node2.Arguments = new List <JsExpression>(jsArgs);
         }
         else
         {
             Node2.Arguments.InsertRange(0, jsArgs);
         }
     }
 }
Exemplo n.º 15
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);
        }
Exemplo n.º 16
0
 private void ProcessEnum()
 {
     if (Method.DeclaringType.FullName == "System.Enum")
     {
         // Enum.GetName
         if (Method.Name == "ToString")
         {
             // 插对象
             if (MethodAtt == null || !MethodAtt.InstanceImplementedAsExtension)
             {
                 var ext = (JsMemberExpression)Node2.Member;
                 Node2.Arguments.Insert(0, ext.PreviousMember);
                 ext.PreviousMember = null;
             }
             // 插类型
             var ctor = SkJs.EntityTypeRefToMember(Res.TargetResult.Type, false);
             Node2.Arguments.Insert(0, Js.Invoke(new JsMemberExpression {
                 Name = "Typeof"
             }, ctor as JsMemberExpression));
         }
     }
 }
Exemplo n.º 17
0
        public override JsNode ExportMethod(IMethod me)
        {
            var node = base.ExportMethod(me);

            if (node == null)
            {
                return(node);
            }
            if (!node.Is(JsNodeType.Function))
            {
                return(node);
            }
            var func     = (JsFunction)node;
            var funcName = func.Name;

            func.Name = null;
            if (LongFunctionNames)
            {
                func.Name = SkJs.GetLongFunctionName(me);
            }
            return(Js.JsonNameValue(funcName, func));
        }
Exemplo n.º 18
0
 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);
 }
Exemplo n.º 19
0
 public JsNode VisitTypeIsResolveResult(TypeIsResolveResult res)
 {
     if (Sk.OmitCasts(res.TargetType))
     {
         return(Js.True());
         //var node2 = Visit(res.Input);
         //return node2;
     }
     else if (Sk.NativeCasts(res.TargetType))
     {
         var typeFieldName = Sk.GetJsonTypeFieldName(res.TargetType.GetDefinitionOrArrayType());
         if (typeFieldName != null && Sk.IsJsonMode(res.TargetType.GetDefinitionOrArrayType()))
         {
             return(Js.Parentheses(VisitExpression(res.Input).Or(Js.Json())).Member(typeFieldName).Equal(SkJs.EntityTypeRefToMember(res.TargetType)));
         }
         var node2 = VisitExpression(res.Input).InstanceOf(SkJs.EntityTypeRefToMember(res.TargetType));
         return(node2);
     }
     else
     {
         var node2 = Js.Member("Is").Invoke(VisitExpression(res.Input), SkJs.EntityTypeRefToMember(res.TargetType));
         return(node2);
     }
 }
Exemplo n.º 20
0
        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);
        }
Exemplo n.º 21
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);
     }
 }
Exemplo n.º 22
0
 public JsNode VisitTypeOfResolveResult(TypeOfResolveResult res)
 {
     return(Js.Member("Typeof").Invoke(SkJs.EntityTypeRefToMember(res.ReferencedType)));
 }
Exemplo n.º 23
0
        public JsNode VisitInvocationResolveResultAsCtor(CSharpInvocationResolveResult res)
        {
            if (res.Type.Kind == TypeKind.Delegate)
            {
                return(Visit(res.Arguments.Single()));
            }
            var me    = (IMethod)res.Member;
            var meAtt = Sk.GetJsMethodAttribute(me);
            var ce    = me.GetDeclaringTypeDefinition();
            var att   = ce == null ? null : ce.GetJsTypeAttribute();

            if (att != null && att.Mode == JsMode.Json && (meAtt == null || meAtt.Name == null))
            {
                var jtfn  = ce == null ? null : Sk.GetJsonTypeFieldName(ce);
                var node2 = VisitInvocationResolveResult(res);
                var json  = Importer.InitializersToJson(res.InitializerStatements, res.Type);
                if (jtfn != null)
                {
                    var x = json as JsJsonObjectExpression;
                    if (x != null)
                    {
                        x.Add(jtfn, SkJs.EntityTypeRefToMember(res.Type));
                    }
                }
                return(json);
            }
            else
            {
                var invokeExp = (JsInvocationExpression)VisitInvocationResolveResult(res);
                var newExp    = new JsNewObjectExpression {
                    Invocation = invokeExp
                };
                JsExpression finalExp;
                if (meAtt != null && meAtt.OmitNewOperator)
                {
                    finalExp = invokeExp;
                }
                else
                {
                    finalExp = newExp;
                }

                if (meAtt != null && meAtt.JsonInitializers)
                {
                    var json = Importer.InitializersToJson(res.InitializerStatements, res.Type);
                    invokeExp.Arguments.Add(json);
                }
                else if (res.InitializerStatements.IsNotNullOrEmpty())
                {
                    var func = Js.Function();

                    var inits2 = res.InitializerStatements.Select(t => Visit(t)).ToList();
                    //var init1 = res.InitializerStatements[0];

                    var target  = AstNodeConverter.FindInitializedObjectResolveResult(res);// ((init1 as OperatorResolveResult).Operands[0] as MemberResolveResult).TargetResult as InitializedObjectResolveResult;
                    var varName = Importer.Initializers[target];
                    func.Add(Js.Var(varName, finalExp).Statement());

                    foreach (var init in inits2)
                    {
                        var exp = ((JsExpression)init);
                        func.Add(exp.Statement());
                    }
                    func.Add(Js.Return(Js.Member(varName)));
                    finalExp = Importer.WrapFunctionAndInvoke(res, func);
                }

                return(finalExp);
            }
        }
Exemplo n.º 24
0
        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);
        }
Exemplo n.º 25
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);
        }
Exemplo n.º 26
0
        private JsNode VisitConversion(ResolveResult input, Conversion conversion, IType conversionType)
        {
            ////TODO: HACK: https://github.com/icsharpcode/NRefactory/issues/183
            //var isImplicit = res.Conversion.IsImplicit;
            //if (!isImplicit && res.Conversion.IsExplicit && res.Conversion.Method != null && res.Conversion.Method.Name != null && res.Conversion.Method.Name.Contains("Implicit"))
            //    isImplicit = true;
            if (conversion.IsMethodGroupConversion)
            {
            }
            else if (conversion.IsUserDefined)
            {
                ITypeDefinition typeDef;
                if (conversion.Method != null && conversion.Method.DeclaringType != null)
                {
                    typeDef = conversion.Method.DeclaringType.GetDefinitionOrArrayType();
                }
                else
                {
                    typeDef = conversionType.GetDefinitionOrArrayType();
                }
                var nativeOverloads = Sk.UseNativeOperatorOverloads(typeDef);
                if (nativeOverloads)
                {
                    return(Visit(input));
                }
                ////TODO: Check if OmitCalls is found on conversion method, if so - return Visit(input);
                //if (Sk.IsOmitCalls(conversion.Method))
                //{
                //}
                var fake  = conversion.Method.InvokeMethod(null, input);
                var node2 = Visit(fake);
                return(node2);
            }
            else if (conversion.IsTryCast || conversion.IsExplicit)
            {
                if (ForceIntegers && conversion.IsNumericConversion && IsInteger(conversionType))
                {
                    return(ForceInteger(Visit(input)));
                }

                //Skip enum casts
                if ((conversionType.Kind == TypeKind.Enum && IsInteger(input.Type)) || (input.Type.Kind == TypeKind.Enum && IsInteger(conversionType)))
                {
                    return(Visit(input));
                }

                var omitCasts = Sk.OmitCasts(conversionType);
                if (omitCasts)
                {
                    return(Visit(input));
                }
                if (Sk.NativeCasts(conversionType))
                {
                    var exp2  = VisitExpression(input);
                    var type2 = SkJs.EntityTypeRefToMember(conversionType);
                    if (conversion.IsTryCast)
                    {
                        var node2 = exp2.InstanceOf(type2).Conditional(exp2, Js.Null());
                        return(node2);
                    }
                    else
                    {
                        var node2 = Js.Conditional(exp2.InstanceOf(type2).Or(exp2.Equal(Js.Null())), exp2,
                                                   Js.Parentheses(Js.Function().Add(Js.ThrowNewError("InvalidCastException")).Invoke()));
                        //var node2 = Js.Parentheses(Js.Function().AddStatements(
                        //Js.If(exp2.InstanceOf(type2).Or(exp2.Equal(Js.Null())), Js.Return(exp2)),
                        //Js.ThrowNewError("InvalidCastException"))).Member("call").Invoke(Js.This());
                        return(node2);
                    }
                }
                else
                {
                    var cast  = conversion.IsTryCast ? "As" : "Cast";
                    var node2 = Js.Member(cast).Invoke(VisitExpression(input), SkJs.EntityTypeRefToMember(conversionType));
                    return(node2);
                }
            }
            return(Visit(input));
        }
Exemplo n.º 27
0
 public JsNode VisitTypeResolveResult(TypeResolveResult res)
 {
     return(SkJs.EntityTypeRefToMember(res.Type));
     //throw new NotImplementedException();
 }
Exemplo n.º 28
0
        public JsNode VisitMethodGroupResolveResult(MethodGroupResolveResult res)
        {
            var     info = res.GetInfo();
            IMethod me;

            if (info != null && info.Conversion != null && info.Conversion.Method != null)
            {
                me = info.Conversion.Method;
            }
            else //happens when invoking a method with overloads, and a parameter is dynamic
            {
                var list = res.Methods.ToList();
                if (list.Count == 0)
                {
                    throw new Exception("Method group not resolved to any method");
                }
                else if (list.Count == 1)
                {
                    me = list[0];
                }
                else
                {
                    me = list[0];
                }
                //TODO: verify all methods has the same js name
            }
            var          isExtensionMethodStyle = me.IsExtensionMethod && !(res.TargetResult is TypeResolveResult) && info != null && info.Conversion != null && info.Conversion.DelegateCapturesFirstArgument;//TODO: IsExtensionMethodStyle(new CsInvocationExpression { entity = me, expression = node });
            JsExpression firstPrm = null;

            if (isExtensionMethodStyle)
            {
                firstPrm = (JsExpression)Visit(res.TargetResult);
            }
            var          node2 = SkJs.EntityToMember(me);
            JsExpression node3;
            JsExpression instanceContext = null;

            if (me.IsStatic || res.TargetResult == null) //getting ThisResolveResult even on static methods, getting TargetResult=null when MethodGroupResolveResult when using delegates
            {
                node3 = node2;
            }
            else
            {
                instanceContext = VisitExpression(res.TargetResult);
                node3           = instanceContext.Member(node2);
            }
            if (info != null && (instanceContext != null || firstPrm != null))
            {
                var conv = info.Conversion;
                if (info.ConversionTargetType != null && !UseNativeFunctions(info.ConversionTargetType))//delegate type
                {
                    var parentMethod = info.Nodes.FirstOrDefault().GetCurrentMethod();
                    if (parentMethod == null || !Sk.ForceDelegatesAsNativeFunctions(parentMethod))
                    {
                        if (parentMethod == null)
                        {
                            Log.Warn(info.Nodes.FirstOrDefault(), "GetParentMethod() returned null");
                        }
                        var func = (JsExpression)node2;
                        if (instanceContext != null)
                        {
                            node3 = CreateJsDelegate(instanceContext, func);
                        }
                        else if (firstPrm != null)
                        {
                            node3 = CreateJsExtensionDelegate(firstPrm, func);
                        }
                    }
                }
            }
            return(node3);
        }
Exemplo n.º 29
0
 private JsInvocationExpression ExportDefault(IType type)
 {
     return(Js.Member("Default").Invoke(SkJs.EntityTypeRefToMember(type)));
 }
Exemplo n.º 30
0
        public JsNode VisitMethodGroupResolveResult(MethodGroupResolveResult res)
        {
            var     info = res.GetInfo();
            IMethod me;

            if (info != null && info.Conversion != null && info.Conversion.Method != null)
            {
                me = info.Conversion.Method;
            }
            else //happens when invoking a method with overloads, and a parameter is dynamic
            {
                var list = res.Methods.ToList();
                if (list.Count == 0)
                {
                    throw new Exception("Method group not resolved to any method");
                }
                else if (list.Count == 1)
                {
                    me = list[0];
                }
                else
                {
                    me = list[0];
                }
                //TODO: verify all methods has the same js name
            }
            var          isExtensionMethodStyle = me.IsExtensionMethod && !(res.TargetResult is TypeResolveResult) && info != null && info.Conversion != null && info.Conversion.DelegateCapturesFirstArgument;//TODO: IsExtensionMethodStyle(new CsInvocationExpression { entity = me, expression = node });
            JsExpression firstPrm = null;

            if (isExtensionMethodStyle)
            {
                firstPrm = (JsExpression)Visit(res.TargetResult);
            }
            var          node2 = SkJs.EntityToMember(me);
            JsExpression node3;
            JsExpression instanceContext = null;

            if (me.IsStatic || res.TargetResult == null) //getting ThisResolveResult even on static methods, getting TargetResult=null when MethodGroupResolveResult when using delegates
            {
                node3 = node2;
            }
            else
            {
                instanceContext = VisitExpression(res.TargetResult);
                node3           = instanceContext.Member(node2);
            }

            if (info != null && (instanceContext != null || firstPrm != null))
            {
                if (info.ConversionTargetType != null && !UseNativeFunctions(info.ConversionTargetType))//delegate type
                {
                    var parentMethod = info.Nodes.FirstOrDefault().GetCurrentMethod();
                    if (parentMethod == null || !Sk.ForceDelegatesAsNativeFunctions(parentMethod))
                    {
                        if (parentMethod == null)
                        {
                            Log.Warn(info.Nodes.FirstOrDefault(), "GetParentMethod() returned null");
                        }
                        var func = (JsExpression)node2;
                        if (instanceContext != null)
                        {
                            node3 = CreateJsDelegate(instanceContext, func);
                        }
                        else if (firstPrm != null)
                        {
                            node3 = CreateJsExtensionDelegate(firstPrm, func);
                        }
                    }
                }
            }

            // 其实以下的处理,也可以改代码,改成 Lambda 写法即可
            // 这样子引用的并不是同一个函数,可能会造成内存泄露
            if (res.TypeArguments.Count > 0 && info.Conversion.IsImplicit && me is SpecializedMethod)
            {
                var delegateFunc = node3 as JsInvocationExpression;

                var sme  = (SpecializedMethod)me;
                var pars = sme.TypeArguments.Select(type => SkJs.EntityTypeRefToMember(type, false)).ToList();
                pars.AddRange(sme.Parameters.Select(t => new JsCodeExpression
                {
                    Code = JsIdentifier(t.Name),
                }));
                var body = delegateFunc == null?node3.Invoke(pars.ToArray()) : delegateFunc.Arguments[1].Invoke(pars.ToArray());

                var func = new JsFunction()
                {
                    Parameters = sme.Parameters.Select(t => JsIdentifier(t.Name)).ToList(),
                };
                JsStatement st;
                if (sme.ReturnType.IsVoid())
                {
                    st = new JsExpressionStatement {
                        Expression = body
                    };
                }
                else
                {
                    st = new JsReturnStatement {
                        Expression = body
                    };
                }
                func.Block = new JsBlock {
                    Statements = new List <JsStatement> {
                        st
                    }
                };

                if (delegateFunc == null)
                {
                    node3 = func;
                }
                else
                {
                    delegateFunc.Arguments[1] = func;
                }
            }

            return(node3);
        }