예제 #1
0
        public JsNode VisitConversionResolveResult(ConversionResolveResult res)
        {
            var input          = res.Input;
            var conversion     = res.Conversion;
            var conversionType = res.Type;

            var info = res.GetInfo();

            if (info == null)
            {
                info = new ResolveResultInfo {
                    Conversion = conversion, ResolveResult = res, ConversionTargetType = res.Type
                };
                res.SetInfo(info);
            }
            var info2 = input.GetInfo();

            if (info2 == null)
            {
                input.SetInfo(new ResolveResultInfo {
                    Nodes = info.Nodes.ToList(), Conversion = conversion, ConversionTargetType = res.Type, ResolveResult = input
                });
            }
            if (conversion.IsUserDefined && res.Type.FullName == "SharpKit.JavaScript.JsCode" && input is ConstantResolveResult)
            {
                var value = ((ConstantResolveResult)input).ConstantValue;
                var node3 = Js.CodeExpression(value == null ? "null" : value.ToString());
                return(node3);
            }
            return(VisitConversion(input, conversion, conversionType));
        }
예제 #2
0
        public JsNode VisitConversionResolveResult(ConversionResolveResult res)
        {
            var input          = res.Input;
            var conversion     = res.Conversion;
            var conversionType = res.Type;

            var info = res.GetInfo();

            if (info == null)
            {
                info = new ResolveResultInfo {
                    Conversion = conversion, ResolveResult = res, ConversionTargetType = res.Type
                };
                res.SetInfo(info);
            }
            var info2 = input.GetInfo();

            if (info2 == null)
            {
                input.SetInfo(new ResolveResultInfo {
                    Nodes = info.Nodes.ToList(), Conversion = conversion, ConversionTargetType = res.Type, ResolveResult = input
                });
            }
            if (conversion.IsUserDefined && res.Type.FullName == "SharpKit.JavaScript.JsCode" && input is ConstantResolveResult)
            {
                var value = ((ConstantResolveResult)input).ConstantValue;
                var node3 = Js.CodeExpression(value == null ? "null" : value.ToString());
                return(node3);
            }

            #region 修复c#方法重载导致转js后绑定错误
            var tInfo = input.Tag as ResolveResultInfo;
            if (tInfo != null && tInfo.Conversion != null && tInfo.Conversion.Method != null &&
                conversion != null && conversion.Method != null)
            {
                if (tInfo.Conversion.Method.ToString() != conversion.Method.ToString())
                {
                    //var tMessage = string.Format("方法绑定异常:绑定了错误的方法:{0}\n正确的绑定应该是:{1}", tInfo.Conversion.Method.ToString(), conversion.Method.ToString());
                    //Log.Error(tMessage);

                    //处理方法绑定异常
                    var tNewTag = res.Tag as ResolveResultInfo;
                    var tTag    = input.Tag as ResolveResultInfo;
                    tTag.Conversion           = tNewTag.Conversion;
                    tTag.ConversionTargetType = tNewTag.ConversionTargetType;
                    tTag.ResolveResult        = tNewTag.ResolveResult;
                }
            }
            #endregion

            return(VisitConversion(input, conversion, conversionType));
        }
예제 #3
0
        public static JsExpression EntityTypeRefToMember(IType typeRef, bool isGenericArgument)
        {
            if (typeRef == null)
            {
                return(null);
            }
            if (typeRef.Kind == TypeKind.Anonymous)
            {
                return(Js.Null());
            }
            if (isGenericArgument)
            {
                var code = Sk.GetGenericArugmentJsCode(typeRef.GetEntityType());
                if (code != null)
                {
                    return(Js.CodeExpression(code));
                }
            }
            var name = GetEntityJsName(typeRef);

            if (Sk.IsJsonMode(typeRef.GetEntityType()))
            {
                return(Js.String(name));
            }
            var member = Js.Members(name);

            if (typeRef.IsGenericTypeParameter())
            {
                if (member.PreviousMember == null)
                {
                    member.PreviousMember = Js.This();
                }
                else
                {
                    throw new Exception();
                }
            }
            var def = typeRef.GetDefinitionOrArrayType();

            if (def != null && Sk.IsClrType(def))
            {
                member = member.Member("ctor");
            }
            return(member);
        }
예제 #4
0
        JsCodeExpression ProcessInlineCodeExpression()
        {
            if (MethodAtt != null && MethodAtt.InlineCodeExpression != null)
            {
                var inliner = new JsCodeInliner
                {
                    InlineCodeExpression = MethodAtt.InlineCodeExpression,
                };
                if (JsTarget != null)
                {
                    inliner.ThisCode = JsTarget.ToJs();
                }

                foreach (var arg in GenericArgs)
                {
                    if (arg.TypeParam == null)
                    {
                        continue;
                    }
                    var prm = new CodeInlinerParameter {
                        Name = arg.TypeParam.Name, Code = arg.JsExpression.ToJs()
                    };
                    inliner.Params.Add(prm);
                }

                foreach (var b in PrmBindings)
                {
                    var exp = b.JsCallResult;
                    var prm = new CodeInlinerParameter {
                        Name = b.Binding.Parameter.Name, Code = exp.ToJs()
                    };
                    inliner.Params.Add(prm);
                }
                var inlinedCode = inliner.Process();
                return(Js.CodeExpression(inlinedCode));
            }
            return(null);
        }
예제 #5
0
 public JsNode VisitResolveResult(ResolveResult res)
 {
     if (res.Type == SpecialType.NullType)
     {
         return(Js.Null());
     }
     else if (res.Type.IsVoid())
     {
         Log.Warn("void");
         return(Js.CodeExpression("void"));
     }
     else if (res.Type.Kind == TypeKind.Dynamic)
     {
         var info = res.GetInfo();
         if (info == null || info.Nodes.Count != 1)
         {
             throw new NotImplementedException("Dynamics");
         }
         var node2 = Visit(info.Nodes[0]);
         return(node2);
     }
     throw new NotImplementedException();
 }
예제 #6
0
        public JsNode VisitInvocationResolveResult(CSharpInvocationResolveResult res)
        {
            Res = res;

            ProcessMember();

            if (MethodAtt != null && MethodAtt.InlineCode != null)
            {
                return(Js.CodeExpression(MethodAtt.InlineCode));
            }

            var conditional = ProcessConditional();

            if (conditional)
            {
                return(null);
            }

            bool omittedCalls;
            var  omittedCallsNode = ProcessOmitCalls(out omittedCalls);

            if (omittedCalls)
            {
                return(omittedCallsNode);
            }

            JsMember = SkJs.EntityToMember(Member);

            qiucw.CheckAddInvocation(res, JsMember.Name);

            ProcessTarget();

            ProcessPrmBindings();

            ProcessNativeParams();

            ProcessByRefs1();

            PrmBindings.ForEach(t => t.JsCallResult = VisitExpression(t.Binding.CallResult));
            Node2 = new JsInvocationExpression
            {
                Member    = JsMember,
                Arguments = PrmBindings.Select(t => t.JsCallResult).ToList(),
            };

            ProcessByRefs2();

            ProcessExtensionImplementedInInstance();

            TransformIntoBaseMethodCallIfNeeded(Res, Node2);

            ProcessArgsCustomization();

            ProcessGenericMethodArgs();

            var inlineCodeExpression = ProcessInlineCodeExpression();

            if (inlineCodeExpression != null)
            {
                return(inlineCodeExpression);
            }



            var omittedDotOperator = ProcessOmitDotOperator();

            if (omittedDotOperator != null)
            {
                return(omittedDotOperator);
            }

            ProcessRemoveEmptyPreviousMemberName();

            var indexerAccess = ProcessIndexer();

            if (indexerAccess != null)
            {
                return(indexerAccess);
            }

            ProcessByRefs3();

            return(Node2);
        }