Exemple #1
0
            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)
            });
        }
Exemple #5
0
        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(")");
        }
Exemple #6
0
 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);
 }
Exemple #7
0
 public virtual void Visit(JsInvocationExpression node)
 {
     DefaultVisit(node);
     node.Target.Accept(this);
     foreach (var item in node.Arguments)
     {
         item.Accept(this);
     }
 }
Exemple #8
0
 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);
                }
            }
        }
Exemple #10
0
 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));
 }
Exemple #12
0
 public virtual void VisitInvocationExpression(JsInvocationExpression node)
 {
 }
 public override JsExpression VisitInvocationExpression(JsInvocationExpression expression, object data)
 {
     _result = true;
     return(expression);
 }
Exemple #14
0
        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;
        }
Exemple #15
0
 public void Visit(JsInvocationExpression node)
 {
     BeforeVisit(node);
     DefaultVisit(node, VisitInvocationExpression);
     AfterVisit(node);
 }
Exemple #16
0
        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);
            }
        }
Exemple #17
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);
        }