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)); }
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 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))); } }
public ParsedExpressionBindingProperty GetExpression(OriginalStringBindingProperty originalString, DataContextStack dataContext, BindingParserOptions options) { var expr = bindingParser.Parse(originalString.Code, dataContext, options); return(new ParsedExpressionBindingProperty(expr.Reduce())); }