Example #1
0
        public ParsedExpressionBindingProperty GetExpression(OriginalStringBindingProperty originalString, DataContextStack dataContext, BindingParserOptions options, ExpectedTypeBindingProperty expectedType = null)
        {
            var expr = bindingParser.ParseWithLambdaConversion(originalString.Code, dataContext, options, expectedType?.Type ?? typeof(object));

            if (expr is StaticClassIdentifierExpression)
            {
                throw new Exception($"'{originalString.Code}' is a static class reference, not a valid expression.");
            }
            else if (expr is UnknownStaticClassIdentifierExpression)
            {
                expr = expr.Reduce();
            }
            return(new ParsedExpressionBindingProperty(expr));
        }
Example #2
0
        public IdBindingProperty CreateBindingId(
            OriginalStringBindingProperty originalString = null,
            ParsedExpressionBindingProperty expression   = null,
            DataContextStack dataContext    = null,
            ResolvedBinding resolvedBinding = null,
            AssignedPropertyBindingProperty assignedProperty = null)
        {
            var sb = new StringBuilder();

            // don't append expression when original string is present, so it does not have to be always exactly same
            if (originalString != null)
            {
                sb.Append(originalString.Code);
            }
            else
            {
                sb.Append(expression.ToString());
            }

            sb.Append("|||");
            sb.Append(dataContext?.GetHashCode());
            sb.Append("|||");
            sb.Append(assignedProperty?.DotvvmProperty?.FullName);
            sb.Append(assignedProperty?.DotvvmProperty?.GetHashCode());

            if (resolvedBinding?.TreeRoot != null)
            {
                var bindingIndex = bindingCounts.GetOrCreateValue(resolvedBinding.TreeRoot).AddOrUpdate(dataContext, 0, (_, i) => i + 1);
                sb.Append("|||");
                sb.Append(bindingIndex);
            }

            using (var sha = System.Security.Cryptography.SHA256.Create())
            {
                var hash = sha.ComputeHash(Encoding.Unicode.GetBytes(sb.ToString()));
                // use just 12 bytes = 96 bits
                return(new IdBindingProperty(Convert.ToBase64String(hash, 0, 12)));
            }
        }
Example #3
0
        public IdBindingProperty CreateBindingId(
            OriginalStringBindingProperty originalString = null,
            ParsedExpressionBindingProperty expression   = null,
            DataContextStack dataContext             = null,
            ResolvedBinding resolvedBinding          = null,
            LocationInfoBindingProperty locationInfo = null)
        {
            var sb = new StringBuilder();

            if (resolvedBinding?.TreeRoot != null && dataContext != null)
            {
                var bindingIndex = bindingCounts.GetOrCreateValue(resolvedBinding.TreeRoot).AddOrUpdate(dataContext, 0, (_, i) => i + 1);
                sb.Append(bindingIndex);
                sb.Append(" || ");
            }

            // don't append expression when original string is present, so it does not have to be always exactly same
            if (originalString != null)
            {
                sb.Append(originalString.Code);
            }
            else
            {
                sb.Append(expression.Expression.ToString());
            }

            sb.Append(" || ");
            while (dataContext != null)
            {
                sb.Append(dataContext.DataContextType.FullName);
                sb.Append('(');
                foreach (var ns in dataContext.NamespaceImports)
                {
                    sb.Append(ns.Alias);
                    sb.Append('=');
                    sb.Append(ns.Namespace);
                }
                sb.Append(';');
                foreach (var ext in dataContext.ExtensionParameters)
                {
                    sb.Append(ext.Identifier);
                    if (ext.Inherit)
                    {
                        sb.Append('*');
                    }
                    sb.Append(':');
                    sb.Append(ext.ParameterType.FullName);
                    sb.Append(':');
                    sb.Append(ext.GetType().FullName);
                }
                sb.Append(") -- ");
                dataContext = dataContext.Parent;
            }
            sb.Append(" || ");
            sb.Append(locationInfo?.RelatedProperty?.FullName);

            using (var sha = System.Security.Cryptography.SHA256.Create())
            {
                var hash = sha.ComputeHash(Encoding.Unicode.GetBytes(sb.ToString()));
                // use just 12 bytes = 96 bits
                return(new IdBindingProperty(Convert.ToBase64String(hash, 0, 12)));
            }
        }
Example #4
0
        public ParsedExpressionBindingProperty GetExpression(OriginalStringBindingProperty originalString, DataContextStack dataContext, BindingParserOptions options)
        {
            var expr = bindingParser.Parse(originalString.Code, dataContext, options);

            return(new ParsedExpressionBindingProperty(expr.Reduce()));
        }