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)); }
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)); }
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); }
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); }
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(); }
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); }