Пример #1
0
        public ExpectedTypeBindingProperty GetExpectedType(AssignedPropertyBindingProperty property = null)
        {
            var prop = property?.DotvvmProperty;

            if (prop == null)
            {
                return(new ExpectedTypeBindingProperty(typeof(object)));
            }

            return(new ExpectedTypeBindingProperty(prop.IsBindingProperty ? (prop.PropertyType.GenericTypeArguments.SingleOrDefault() ?? typeof(object)) : prop.PropertyType));
        }
Пример #2
0
        public ExpectedTypeBindingProperty GetExpectedType(AssignedPropertyBindingProperty property = null)
        {
            var prop = property?.DotvvmProperty;

            if (prop == null)
            {
                return(new ExpectedTypeBindingProperty(typeof(object)));
            }

            return(new ExpectedTypeBindingProperty(prop.IsBindingProperty ? typeof(object) : prop.PropertyType));
        }
Пример #3
0
        public BindingResolverCollection GetAdditionalResolversFromProperty(AssignedPropertyBindingProperty property = null, DataContextStack stack = null)
        {
            var prop = property?.DotvvmProperty;

            if (prop == null)
            {
                return(new BindingResolverCollection(Enumerable.Empty <Delegate>()));
            }

            return(new BindingResolverCollection(
                       (prop.PropertyInfo?.GetCustomAttributes <BindingCompilationOptionsAttribute>() ?? Enumerable.Empty <BindingCompilationOptionsAttribute>())
                       .SelectMany(o => o.GetResolvers())
                       .Concat(stack.EnumerableItems().Reverse().SelectMany(s => s.BindingPropertyResolvers))
                       .ToImmutableArray()));
        }
Пример #4
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)));
            }
        }
Пример #5
0
 public LocationInfoBindingProperty GetLocationInfo(ResolvedBinding resolvedBinding, AssignedPropertyBindingProperty assignedProperty = null)
 {
     return(new LocationInfoBindingProperty(
                resolvedBinding.TreeRoot?.FileName,
                resolvedBinding.DothtmlNode?.Tokens?.Select(t => (t.StartPosition, t.EndPosition)).ToArray(),
                resolvedBinding.DothtmlNode?.Tokens?.FirstOrDefault()?.LineNumber ?? -1,
                resolvedBinding.GetAncestors().OfType <ResolvedControl>().FirstOrDefault()?.Metadata?.Type,
                assignedProperty?.DotvvmProperty
                ));
 }
Пример #6
0
        public BindingCompilationRequirementsAttribute GetAdditionalResolversFromProperty(AssignedPropertyBindingProperty property)
        {
            var prop = property?.DotvvmProperty;

            if (prop == null)
            {
                return(new BindingCompilationRequirementsAttribute());
            }

            return
                (new [] { new BindingCompilationRequirementsAttribute() }
                 .Concat(prop.PropertyInfo?.GetCustomAttributes <BindingCompilationRequirementsAttribute>() ?? Enumerable.Empty <BindingCompilationRequirementsAttribute>())
                 .Aggregate((a, b) => a.ApplySecond(b)));
        }
        public IdBindingProperty CreateBindingId(
            OriginalStringBindingProperty originalString = null,
            ParsedExpressionBindingProperty expression   = null,
            DataContextStack dataContext    = null,
            ResolvedBinding resolvedBinding = null,
            AssignedPropertyBindingProperty assignedProperty = 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(assignedProperty?.DotvvmProperty?.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)));
            }
        }