public JsExpression GetArgsScript(MethodCallExpression expression, DataContextStack dataContext)
        {
            var arguments = (expression.Object == null ? new Expression[0] : new[] { expression.Object })
                            .Concat(expression.Arguments).Select(a => JavascriptTranslator.CompileToJavascript(a, dataContext, vmMapper));

            return(new JsArrayExpression(arguments));
        }
        public static string GetArgsScript(MethodCallExpression expression, DataContextStack dataContext)
        {
            var target = expression.Object == null ? "null" : JavascriptTranslator.CompileToJavascript(expression.Object, dataContext);
            var arguments = new[] { target }.Concat(expression.Arguments.Select(a => JavascriptTranslator.CompileToJavascript(a, dataContext)));

            return("[" + String.Join(", ", arguments) + "]");
        }
Exemplo n.º 3
0
        public static string GetArgsScript(MethodCallExpression expression, DataContextStack dataContext, IViewModelSerializationMapper vmMapper)
        {
            var target    = expression.Object == null ? null : JavascriptTranslator.FormatKnockoutScript(JavascriptTranslator.CompileToJavascript(expression.Object, dataContext, vmMapper), allowDataGlobal: false);
            var arguments = (target == null ? new string[0] : new[] { target })
                            .Concat(expression.Arguments.Select(a => JavascriptTranslator.FormatKnockoutScript(JavascriptTranslator.CompileToJavascript(a, dataContext, vmMapper), allowDataGlobal: true)));

            return("[" + String.Join(", ", arguments) + "]");
        }
Exemplo n.º 4
0
 internal static void RegisterJavascriptTranslations()
 {
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingCollectionInfo), nameof(Index),
                                                      new GenericMethodCompiler(_ => new JsSymbolicParameter(JavascriptTranslator.CurrentIndexParameter)));
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingCollectionInfo), nameof(IsFirst),
                                                      new GenericMethodCompiler(_ => new JsBinaryExpression(new JsSymbolicParameter(JavascriptTranslator.CurrentIndexParameter), BinaryOperatorType.Equal, new JsLiteral(0))));
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingCollectionInfo), nameof(IsOdd),
                                                      new GenericMethodCompiler(_ => new JsBinaryExpression(new JsBinaryExpression(new JsSymbolicParameter(JavascriptTranslator.CurrentIndexParameter), BinaryOperatorType.Modulo, new JsLiteral(2)), BinaryOperatorType.Equal, new JsLiteral(1))));
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingCollectionInfo), nameof(IsEven),
                                                      new GenericMethodCompiler(_ => new JsBinaryExpression(new JsBinaryExpression(new JsSymbolicParameter(JavascriptTranslator.CurrentIndexParameter), BinaryOperatorType.Modulo, new JsLiteral(2)), BinaryOperatorType.Equal, new JsLiteral(0))));
 }
Exemplo n.º 5
0
        /// <summary>
        /// Builds a <see cref="ViewModelValidationError.PropertyPath"/> from a LINQ expression
        /// </summary>
        public static string BuildPath <TValidationTarget>(Expression <Func <TValidationTarget, object> > propertyAccessor, DotvvmConfiguration configuration)
        {
            var context = DataContextStack.Create(typeof(TValidationTarget));
            var js      = JavascriptTranslator.CompileToJavascript(propertyAccessor, context,
                                                                   configuration.ServiceLocator.GetService <IViewModelSerializationMapper>());

            js.AcceptVisitor(new KnockoutObservableHandlingVisitor(true));
            var propertyPathExtractingVisitor = new PropertyPathExtractingVisitor();

            js.AcceptVisitor(propertyPathExtractingVisitor);
            return(propertyPathExtractingVisitor.ExtractedPropertyPath);
        }
        public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression compiledExpression)
        {
            var expression = binding.GetExpression();

            var visitor      = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call);
            var rootCallback = visitor.Visit(expression);
            var js           = SouldCompileCallback(rootCallback) ? JavascriptTranslator.CompileToJavascript(rootCallback, binding.DataContextTypeStack) : null;

            foreach (var param in visitor.ParameterOrder)
            {
                var callback = js == null ? null : $"function({param.Name}){{{js}}}";
                var method   = visitor.Replaced[param] as MethodCallExpression;
                js = CompileMethodCall(method, binding.DataContextTypeStack, callback);
            }
            return("var $context = ko.contextFor(this);var sender = this;(function(i_pageArea){with($context){" + js + "}})");
        }
Exemplo n.º 7
0
        public string CompileBinding(string expression, Type[] contexts, Type expectedType)
        {
            var context = DataContextStack.Create(contexts.FirstOrDefault() ?? typeof(object), extensionParameters: new BindingExtensionParameter[] {
                new BindingPageInfoExtensionParameter(),
            }.Concat(configuration.Markup.DefaultExtensionParameters).ToArray());

            for (int i = 1; i < contexts.Length; i++)
            {
                context = DataContextStack.Create(contexts[i], context);
            }
            var parser         = new BindingExpressionBuilder();
            var expressionTree = TypeConversion.ImplicitConversion(parser.Parse(expression, context, BindingParserOptions.Create <ValueBindingExpression>()), expectedType, true, true);
            var jsExpression   = new JsParenthesizedExpression(configuration.ServiceProvider.GetRequiredService <JavascriptTranslator>().CompileToJavascript(expressionTree, context));

            jsExpression.AcceptVisitor(new KnockoutObservableHandlingVisitor(true));
            JsTemporaryVariableResolver.ResolveVariables(jsExpression);
            return(JavascriptTranslator.FormatKnockoutScript(jsExpression.Expression));
        }
Exemplo n.º 8
0
        private static JsExpression TransformOptionValueToExpression(DotvvmBindableObject handler, object optionValue)
        {
            switch (optionValue)
            {
            case IValueBinding binding:
                return(new JsIdentifierExpression(
                           JavascriptTranslator.FormatKnockoutScript(binding.GetParametrizedKnockoutExpression(handler, unwrapped: true),
                                                                     new ParametrizedCode("c"), new ParametrizedCode("d"))));

            case IStaticValueBinding staticValueBinding:
                return(new JsLiteral(staticValueBinding.Evaluate(handler)));

            case JsExpression expression:
                return(expression.Clone());

            case IBinding _:
                throw new ArgumentException("Option value can contains only IValueBinding or IStaticValueBinding. Other bindings are not supported.");

            default:
                return(new JsLiteral(optionValue));
            }
        }
Exemplo n.º 9
0
 public KnockoutJsExpressionBindingProperty CompileToJavascript(ParsedExpressionBindingProperty expression,
                                                                DataContextStack dataContext)
 {
     return(new KnockoutJsExpressionBindingProperty(
                JavascriptTranslator.CompileToJavascript(expression.Expression, dataContext, vmMapper).ApplyAction(a => a.Freeze())));
 }
Exemplo n.º 10
0
 public StaticCommandBindingCompiler(JavascriptTranslator javascriptTranslator, IViewModelProtector protector)
 {
     this.protector            = protector;
     this.javascriptTranslator = javascriptTranslator;
 }
Exemplo n.º 11
0
        public new string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression compiledExpression, DotvvmConfiguration config)
        {
            var vmMapper   = config.ServiceLocator.GetService <IViewModelSerializationMapper>();
            var expression = binding.GetExpression();

            var visitor      = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call);
            var rootCallback = visitor.Visit(expression);
            var js           = SouldCompileCallback(rootCallback) ? "resultPromise.resolve(" + JavascriptTranslator.FormatKnockoutScript(JavascriptTranslator.CompileToJavascript(rootCallback, binding.DataContextTypeStack, vmMapper), allowDataGlobal: false) + ")" : null;

            foreach (var param in visitor.ParameterOrder.Reverse <ParameterExpression>())
            {
                if (js == null)
                {
                    js = $"resultPromise.resolve({param.Name})";
                }
                var callback = $"function({param.Name}){{{js}}}";
                var method   = visitor.Replaced[param] as MethodCallExpression;
                js = CompileMethodCall(method, binding.DataContextTypeStack, vmMapper, callback);
            }
            return("var $context = ko.contextFor(this);var sender = this;var resultPromise = new DotvvmPromise();(function(i_pageArea){with($context){" + js + "}})");
        }
Exemplo n.º 12
0
        private static string GenerateHandlerOptions(DotvvmBindableObject handler, Dictionary <string, object> options)
        {
            JsExpression optionsExpr = new JsObjectExpression(
                options.Where(o => o.Value != null).Select(o => new JsObjectProperty(o.Key,
                                                                                     o.Value is IValueBinding b ?
                                                                                     (JsExpression) new JsIdentifierExpression(
                                                                                         JavascriptTranslator.FormatKnockoutScript(b.GetParametrizedKnockoutExpression(handler, unwrapped: true), new ParametrizedCode("c"), new ParametrizedCode("d"))) :
                                                                                     new JsLiteral(o.Value is IBinding ? ((IStaticValueBinding)o.Value).Evaluate(handler) : o.Value)))
                );

            if (options.Any(o => o.Value is IValueBinding))
            {
                optionsExpr = new JsFunctionExpression(
                    new[] { new JsIdentifier("c"), new JsIdentifier("d") },
                    new JsBlockStatement(new JsReturnStatement(optionsExpr))
                    );
            }

            optionsExpr.FixParenthesis();
            var script = new JsFormattingVisitor().ApplyAction(optionsExpr.AcceptVisitor).GetParameterlessResult();

            return(script);
        }
        public JsExpression CompileToJavascript(DataContextStack dataContext, Expression expression)
        {
            var currentContextVariable = new JsTemporaryVariableParameter(new JsIdentifierExpression("ko").Member("contextFor").Invoke(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter)));
            var resultPromiseVariable  = new JsTemporaryVariableParameter(new JsNewExpression("DotvvmPromise"));
            var senderVariable         = new JsTemporaryVariableParameter(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter));
            var visitor      = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call);
            var rootCallback = visitor.Visit(expression);
            var js           = SouldCompileCallback(rootCallback) ? new JsSymbolicParameter(resultPromiseVariable).Member("resolve").Invoke(JavascriptTranslator.CompileToJavascript(rootCallback, dataContext, vmMapper)) : null;

            foreach (var param in visitor.ParameterOrder.Reverse <ParameterExpression>())
            {
                js = js ?? new JsSymbolicParameter(resultPromiseVariable).Member("resolve").Invoke(new JsIdentifierExpression(param.Name));
                var callback = new JsFunctionExpression(new[] { new JsIdentifier(param.Name) }, new JsBlockStatement(new JsExpressionStatement(js)));
                var method   = visitor.Replaced[param] as MethodCallExpression;
                js = CompileMethodCall(method, dataContext, callback);
            }
            foreach (var sp in js.Descendants.OfType <JsSymbolicParameter>())
            {
                if (sp.Symbol == JavascriptTranslator.KnockoutContextParameter)
                {
                    sp.Symbol = currentContextVariable;
                }
                else if (sp.Symbol == JavascriptTranslator.KnockoutViewModelParameter)
                {
                    sp.ReplaceWith(new JsSymbolicParameter(currentContextVariable).Member("$data"));
                }
                else if (sp.Symbol == CommandBindingExpression.SenderElementParameter)
                {
                    sp.Symbol = senderVariable;
                }
            }
            return(new JsBinaryExpression(js, BinaryOperatorType.Sequence, new JsSymbolicParameter(resultPromiseVariable)));
        }
Exemplo n.º 14
0
 internal static void RegisterJavascriptTranslations()
 {
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingPageInfo), nameof(EvaluatingOnServer), new StringJsMethodCompiler("false"));
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingPageInfo), nameof(EvaluatingOnClient), new StringJsMethodCompiler("true"));
     JavascriptTranslator.AddPropertyGetterTranslator(typeof(BindingPageInfo), nameof(IsPostbackRunning), new StringJsMethodCompiler("dotvvm.isPostbackRunning()"));
 }
Exemplo n.º 15
0
 private static void RegisterJsCompilables()
 {
     JavascriptTranslator.AddMethodTranslator(typeof(MyProfile), nameof(MyProfile.GetClassForId), new StringJsMethodCompiler("(({0}.ActiveTabId() == {1}) ? \"active\" : \"\")"));
 }