Example #1
0
        public virtual ExpressionSyntax EmitCreateBinding(DefaultViewCompilerCodeEmitter emitter, ResolvedBinding binding, string id, Type expectedType)
        {
            var compilerAttribute = GetCompilationAttribute(binding.BindingType);
            var requirements      = compilerAttribute.GetRequirements(binding.BindingType);

            var expression = new Lazy <Expression>(() => compilerAttribute.GetExpression(binding));
            var compiled   = new CompiledBindingExpression();

            compiled.Delegate       = TryExecute(binding.BindingNode, "Error while compiling binding to delegate.", requirements.Delegate, () => CompileExpression(compilerAttribute.CompileToDelegate(binding.GetExpression(), binding.DataContextTypeStack, expectedType), binding.DebugInfo));
            compiled.UpdateDelegate = TryExecute(binding.BindingNode, "Error while compiling update delegate.", requirements.UpdateDelegate, () => compilerAttribute.CompileToUpdateDelegate(binding.GetExpression(), binding.DataContextTypeStack).Compile());
            compiled.OriginalString = TryExecute(binding.BindingNode, "hey, no, that should not happen. Really.", requirements.OriginalString, () => binding.Value);
            compiled.Expression     = TryExecute(binding.BindingNode, "Could not get binding expression.", requirements.Expression, () => binding.GetExpression());
            compiled.Id             = id;
            compiled.ActionFilters  = TryExecute(binding.BindingNode, "", requirements.ActionFilters, () => compilerAttribute.GetActionFilters(binding.GetExpression()).ToArray());

            compiled.Javascript = TryExecute(binding.BindingNode, "Could not compile binding to Javascript.", requirements.Javascript, () => compilerAttribute.CompileToJavascript(binding, compiled));

            var index = Interlocked.Increment(ref globalBindingIndex);

            if (!GlobalBindingList.TryAdd(index, compiled))
            {
                throw new Exception("internal bug");
            }
            return(EmitGetCompiledBinding(index));
        }
Example #2
0
 public ValueBindingExpression(CompiledBindingExpression.BindingDelegate func, string javascript = null, CompiledBindingExpression.BindingUpdateDelegate updateFunc = null)
     : base(new CompiledBindingExpression()
     {
         Delegate = func,
         Javascript = javascript,
         UpdateDelegate = updateFunc
     })
 {
 }
Example #3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="BindingExpression"/> class.
 /// </summary>
 public BindingExpression(CompiledBindingExpression compiledBinding) : this()
 {
     OriginalString = compiledBinding.OriginalString;
     Javascript = compiledBinding.Javascript;
     ExpressionTree = compiledBinding.Expression;
     Delegate = compiledBinding.Delegate;
     UpdateDelegate = compiledBinding.UpdateDelegate;
     BindingId = compiledBinding.Id;
     ActionFilters = compiledBinding.ActionFilters;
 }
Example #4
0
 public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression compiledExpression)
 {
     var methodExpression = binding.GetExpression() as MethodCallExpression;
     if (methodExpression == null)
     {
         throw new NotSupportedException("static command binding must be method call");
     }
     var argsScript = GetArgsScript(methodExpression, binding.DataContextTypeStack);
     return $"dotvvm.staticCommandPostbackScript('{GetMethodName(methodExpression)}', [{ argsScript }])";
 }
        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 + "}})");
        }
Example #6
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 + "}})");
        }
Example #7
0
        public virtual string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression)
        {
            var javascript = JavascriptTranslator.CompileToJavascript(binding.GetExpression(), binding.DataContextTypeStack);

            if (javascript == "$data")
            {
                javascript = "$rawData";
            }
            else if (javascript.StartsWith("$data.", StringComparison.Ordinal))
            {
                javascript = javascript.Substring("$data.".Length);
            }

            // do not produce try/eval on single properties
            if (javascript.Contains(".") || javascript.Contains("("))
            {
                return("dotvvm.evaluator.tryEval(function(){return " + javascript + "})");
            }
            else
            {
                return(javascript);
            }
        }
 public virtual string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression)
 {
     return "dotvvm.tryEval(function(){return " + JavascriptTranslator.CompileToJavascript(binding.GetExpression(), binding.DataContextTypeStack) + "})";
 }
 public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression)
 {
     return $"dotvvm.postbackScript('{ expression.Id }')";
 }
 public CommandBindingExpression(CompiledBindingExpression.BindingDelegate command, string id)
     : base(new CompiledBindingExpression() { Delegate = command, Id = id, Javascript = $"dotvvm.postbackScript('{ id }')" })
 {
 }
 public ControlPropertyBindingExpression(CompiledBindingExpression expression)
     : base(expression)
 {
 }
 public StaticCommandBindingExpression(CompiledBindingExpression expression)
     : base(expression)
 { } 
 /// <summary>
 /// Initializes a new instance of the <see cref="ResourceBindingExpression"/> class.
 /// </summary>
 public ResourceBindingExpression(CompiledBindingExpression expression) : base(expression)
 {
 }
Example #14
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ValueBindingExpression"/> class.
 /// </summary>
 public ValueBindingExpression(CompiledBindingExpression expression)
     : base(expression)
 {
 }
Example #15
0
 public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression)
 {
     return($"dotvvm.postbackScript('{ expression.Id }')");
 }
Example #16
0
 public override string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression)
 {
     return($"dotvvm.postbackScript({ JsonConvert.SerializeObject(expression.Id) })");
 }
 public ControlCommandBindingExpression(CompiledBindingExpression expression)
     : base(expression)
 {
 }
 public string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression, DotvvmConfiguration config)
 {
     return(new JsIdentifierExpression("dotvvm").Member("postbackScript").Invoke(new JsLiteral(expression.Id)).FormatScript());
 }