public override JsExpression VisitInvocationExpression(JsInvocationExpression expression, object data) { if (expression.Arguments.Count != 2) { return(base.VisitInvocationExpression(expression, data)); } var access = expression.Method as JsMemberAccessExpression; if (access != null && access.MemberName == "makeGenericType") { var target = access.Target as JsTypeReferenceExpression; if (target != null && target.Type.FullName == "System.Script") { var genericType = expression.Arguments[0] as JsTypeReferenceExpression; if (genericType != null && genericType.Type.Equals(_genericType)) { var arr = expression.Arguments[1] as JsArrayLiteralExpression; if (arr != null && arr.Elements.Count == _typeParameterNames.Count && arr.Elements.All(e => e is JsIdentifierExpression)) { if (arr.Elements.Select(e => ((JsIdentifierExpression)e).Name).SequenceEqual(_typeParameterNames)) { return(_replaceWith); } } } } } return(base.VisitInvocationExpression(expression, data)); }
public virtual JsExpression VisitInvocationExpression(JsInvocationExpression expression, TData data) { var method = VisitExpression(expression.Method, data); var arguments = VisitExpressions(expression.Arguments, data); return(ReferenceEquals(method, expression.Method) && ReferenceEquals(arguments, expression.Arguments) ? expression : JsExpression.Invocation(method, arguments)); }
public override JsExpression VisitInvocationExpression(JsInvocationExpression expression, object data) { var m = VisitExpression(expression.Method, data); var a = VisitWithParamExpansion(expression.Arguments); return(ReferenceEquals(m, expression.Method) && ReferenceEquals(a, expression.Arguments) ? expression : JsExpression.Invocation(m, a)); }
public JsNode VisitVariableInitializer(VariableInitializer node) { var tLocal = node.Annotation <LocalResolveResult>(); if (tLocal != null && tLocal.Type != null && tLocal.Type.Kind == TypeKind.Struct && node.ToString() == node.NameToken.ToString() && node.NextSibling.ToString() == ";") { var tType = Type.GetType(tLocal.Type.FullName); //对于基本数据类型,不用new if (tType == null || !tType.IsPrimitive) { var tTypeMember = new JsMemberExpression { Name = tLocal.Type.FullName }; var tCtorMember = new JsMemberExpression { Name = "ctor", PreviousMember = tTypeMember }; var tInvocation = new JsInvocationExpression { Member = tCtorMember }; var tNewObject = new JsNewObjectExpression { Invocation = tInvocation }; return(new JsVariableDeclarator { Name = node.Name, Initializer = tNewObject, }); } } return(new JsVariableDeclarator { Name = node.Name, Initializer = VisitExpression(node.Initializer) }); }
public override void VisitInvocationExpression(JsInvocationExpression node) { node.Target.Accept(this); output.Append("("); var pastThreshold = node.Arguments.Count > 3; if (pastThreshold) { output.AppendLine(); output.CurrentIndentLevel++; } for (var i = 0; i < node.Arguments.Count; i++) { var argument = node.Arguments[i]; argument.Accept(this); if (i < node.Arguments.Count - 1) { output.Append(", "); } if (pastThreshold) { output.AppendLine(); } } if (pastThreshold) { output.CurrentIndentLevel--; } output.Append(")"); }
public object VisitInvocationExpression(JsInvocationExpression expression, bool parenthesized) { VisitExpression(expression.Method, GetPrecedence(expression.Method.NodeType) > GetPrecedence(expression.NodeType) || (expression.Method is JsNewExpression)); // Ugly code to make sure that we put parentheses around "new", eg. "(new X())(1)" rather than "new X()(1)" _cb.Append("("); VisitExpressionList(expression.Arguments); _cb.Append(")"); return(null); }
public virtual void Visit(JsInvocationExpression node) { DefaultVisit(node); node.Target.Accept(this); foreach (var item in node.Arguments) { item.Accept(this); } }
public virtual JsNode Visit(JsInvocationExpression node) { return(DefaultVisit(node, x => { node.Target = (JsExpression)node.Target.Accept(this); for (var i = 0; i < node.Arguments.Count; i++) { node.Arguments[i] = (JsExpression)node.Arguments[i].Accept(this); } return x; })); }
public override void VisitAssignmentExpression(JsAssignmentExpression assignmentExpression) { base.VisitAssignmentExpression(assignmentExpression); // change assignment to observable property to observable invocation // only do for RestultIsObservable, not ResultMayBeObservable if (assignmentExpression.Left.HasAnnotation <ResultIsObservableAnnotation>()) { var value = assignmentExpression.Right.Detach(); var assignee = assignmentExpression.Left.Detach(); assignee.RemoveAnnotations <ResultIsObservableAnnotation>(); if (value.IsComplexType()) { assignmentExpression.ReplaceWith(_ => new JsIdentifierExpression("dotvvm").Member("serialization").Member("deserialize").Invoke(value, assignee)); } else { // A = B -> A(B) assignee.RemoveAnnotations <MayBeNullAnnotation>(); JsExpression newExpression = new JsInvocationExpression(assignee, value) .WithAnnotation(ObservableSetterInvocationAnnotation.Instance); if (assignmentExpression.Parent is JsExpression resultConsumer) { // assignment's result if (assignee is JsMemberAccessExpression memberAccess) { // x.A(B) -> x.A(B).A newExpression = AddAnnotations(newExpression.Member(memberAccess.MemberName).Invoke().WithAnnotation(ObservableUnwrapInvocationAnnotation.Instance), value); } else { // f() = CC -> f()(_a = CC), _a var tmp = new JsTemporaryVariableParameter(); value.ReplaceWith(_ => new JsAssignmentExpression(new JsSymbolicParameter(tmp), value)); newExpression = AddAnnotations(new JsBinaryExpression(newExpression, BinaryOperatorType.Sequence, new JsSymbolicParameter(tmp)), value); } } assignmentExpression.ReplaceWith(newExpression); } } }
public override void VisitInvocationExpression(JsInvocationExpression invocationExpression) { base.VisitInvocationExpression(invocationExpression); ProcessTargetedExpression(invocationExpression, invocationExpression.Arguments.Count == 0 ? new JsIdentifierExpression("eval") : null); }
public override JsExpression VisitInvocationExpression(JsInvocationExpression expression, object data) { Result.UsesExternalState = true; // Invoking anything counts as external state. return(base.VisitInvocationExpression(expression, data)); }
public virtual void VisitInvocationExpression(JsInvocationExpression node) { }
public override JsExpression VisitInvocationExpression(JsInvocationExpression expression, object data) { _result = true; return(expression); }
public bool TryApplyRefAndOutParametersAfterInvocation(IMethodSymbol method, JsInvocationExpression invocation, out JsExpression result, List<JsStatement> prependers, List<JsStatement> appenders) { // Finishing special handling of ref/out parameters -- doing the actual function wrapping here now that we // have the invocation. if (method.Parameters.Any(x => x.RefKind != RefKind.None)) { // It's a ref or out parameter, we need somewhere to store the value. var invocationStage = new JsBlockStatement(); foreach (var statement in prependers) invocationStage.Add(statement); invocationStage.Local("$result$", invocation); foreach (var statement in appenders) invocationStage.Add(statement); invocationStage.Return(Js.Reference("$result$")); result = Wrap(invocationStage); return true; } result = null; return false; }
public void Visit(JsInvocationExpression node) { BeforeVisit(node); DefaultVisit(node, VisitInvocationExpression); AfterVisit(node); }
void TransformIntoBaseMethodCallIfNeeded(CSharpInvocationResolveResult res, JsInvocationExpression node2) { var target = res.TargetResult as ThisResolveResult; if (target != null && target.CausesNonVirtualInvocation) //base. { //var info = res.GetInfo(); //var node = info.Nodes.FirstOrDefault(); var ce = target.Type;// node.FindThisEntity(); if (ce != null && Sk.IsExtJsType(ce.GetDefinitionOrArrayType())) { node2.Member = Js.This().Member("callParent"); if (node2.Arguments.IsNotNullOrEmpty()) { node2.Arguments = new List <JsExpression> { Js.NewJsonArray(node2.Arguments.ToArray()) } } ; //var me2 = (node2.Member as JsMemberExpression); //me2.Name = "callParent"; return; } IMethod me2; var me = res.Member; if (me is IProperty) { me2 = ((IProperty)me).Getter; } else if (me is IMethod) { me2 = (IMethod)res.Member; } else { throw new Exception("Can't resolve method from member: " + res.Member); } var member = SkJs.EntityMethodToJsFunctionRef(me2); member = member.Member("call"); node2.Member = member; if (node2.Arguments == null) { node2.Arguments = new List <JsExpression>(); } node2.Arguments.Insert(0, Js.This()); } } void ProcessByRefs1() { ByRefs = new List <ByReferenceResolveResult>(); ByRefIndexes = new List <int>(); RefToRefs = new List <int>(); var c = 0; foreach (var bin in PrmBindings) { var binding = bin.Binding; var byRef = binding.CallResult as ByReferenceResolveResult; if (byRef == null) { c++; continue; } var x = byRef.ElementResult as LocalResolveResult; if (x != null && x.Variable != null && x.Variable.Type.Kind == TypeKind.ByReference) { if (binding.Parameter.IsRef || binding.Parameter.IsOut) { RefToRefs.Add(c); } c++; continue; } ByRefs.Add(byRef); ByRefIndexes.Add(c); c++; } } void ProcessByRefs2() { var c = 0; for (var i = 0; i < Node2.Arguments.Count; i++) { if (Node2.Arguments[i] is JsMemberExpression) { JsMemberExpression jsmex = Node2.Arguments[i] as JsMemberExpression; if (RefToRefs.Contains(i)) { Node2.Arguments[i] = jsmex.PreviousMember; //remove the .Value ref wrapper } else if (ByRefIndexes.Contains(i)) { Node2.Arguments[i] = Js.Member(RefIndexToName(c)); c++; } } else if (Node2.Arguments[i] is JsIndexerAccessExpression) { if (ByRefIndexes.Contains(i)) { Node2.Arguments[i] = Js.Member(RefIndexToName(c)); c++; } } } } void ProcessByRefs3() { if (ByRefs.IsNotNullOrEmpty()) { var func = Js.Function(); //It must assigned to a temporary variable, because typed arrays do not acceppt json. //调整原来使用临时对象.Value的赋值方式,修改为Object.defineProperty定义get|set方法的实现 //临时对象统一调用jsclr里的$Ref方法进行创建 for (var i = 0; i < ByRefs.Count; i++) { var byRef = ByRefs[i]; var expr = VisitExpression(byRef); if (expr is JsMemberExpression) { var memberExpr = expr as JsMemberExpression; if (memberExpr.PreviousMember != null) { var refFuncInvoke = new JsInvocationExpression { Member = new JsMemberExpression { Name = "$Ref" }, Arguments = new List <JsExpression> { memberExpr.PreviousMember, Js.String(memberExpr.Name) } }; func.Add(Js.Var(RefIndexToName(i), refFuncInvoke).Statement()); } else { //如果是局部变量的话使用旧实现方式 var refFuncInvoke = new JsInvocationExpression { Member = new JsMemberExpression { Name = "$Ref" }, Arguments = new List <JsExpression> { Js.Member("null"), memberExpr } }; func.Add(Js.Var(RefIndexToName(i), refFuncInvoke).Statement()); } } else if (expr is JsIndexerAccessExpression) { var indexerExpr = expr as JsIndexerAccessExpression; var indexArg = indexerExpr.Arguments[0]; var refFuncInvoke = new JsInvocationExpression { Member = new JsMemberExpression { Name = "$Ref" }, Arguments = new List <JsExpression> { indexerExpr.Member, indexArg } }; func.Add(Js.Var(RefIndexToName(i), refFuncInvoke).Statement()); } } func.Add(Js.Var("$res", Node2).Statement()); for (var i = 0; i < ByRefs.Count; i++) { var byRef = ByRefs[i]; var memberExpr = VisitExpression(byRef) as JsMemberExpression; if (memberExpr != null && memberExpr.PreviousMember == null) { func.Add(memberExpr.Assign(Js.Member(RefIndexToName(i)).Member("Value")).Statement()); } } func.Add(Js.Return(Js.Member("$res"))); Node2 = Importer.WrapFunctionAndInvoke(Res, func); } }
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); }