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)); }
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)); }
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())); }
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))); } }
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 )); }
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))); } }