static string OutermostValue(ExpressionToCodeConfiguration config, StringifiedExpression node) { if (node.OptionalValue != null) { return(ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue, 10)); } foreach (var kid in node.Children) { if (!kid.IsConceptualChild) { var value = OutermostValue(config, kid); if (value != null) { return(value); } } } foreach (var kid in node.Children) { if (kid.IsConceptualChild) { var value = OutermostValue(config, kid); if (value != null) { return(value); } } } return(null); }
static void AppendTo( ExpressionToCodeConfiguration config, StringBuilder sb, List <SubExpressionInfo> nodeInfos, StringifiedExpression node, ref bool ignoreInitialSpace, bool showTopExpressionValue) { if (node.Text != null) { var trimmedText = ignoreInitialSpace ? node.Text.TrimStart() : node.Text; var pos0 = sb.Length; sb.Append(trimmedText); ignoreInitialSpace = node.Text.Any() && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]); if (showTopExpressionValue) { var valueString = node.OptionalValue == null ? null : ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue, 0); if (valueString != null) { nodeInfos.Add(new SubExpressionInfo { Location = pos0 + trimmedText.Length / 2, Value = valueString }); } } } foreach (var kid in node.Children) { AppendTo(config, sb, nodeInfos, kid, ref ignoreInitialSpace, showTopExpressionValue || kid.IsConceptualChild); } }
StringifiedExpression(string text, StringifiedExpression[] children, Expression optionalValue, bool isConceptualChild) { Text = text; this.children = children; OptionalValue = optionalValue; IsConceptualChild = isConceptualChild; }
static void AppendTo(StringBuilder sb, ref bool ignoreInitialSpace, StringifiedExpression node) { if (node.Text != null) { sb.Append(ignoreInitialSpace ? node.Text.TrimStart() : node.Text); ignoreInitialSpace = node.Text.Any() && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]); } else { foreach (var kid in node.Children) { AppendTo(sb, ref ignoreInitialSpace, kid); } } }
static void AppendNodeToStringBuilder(StringBuilder sb, StringifiedExpression node, ref bool ignoreInitialSpace) { if (node.Text != null) { var trimmedText = ignoreInitialSpace ? node.Text.TrimStart() : node.Text; sb.Append(trimmedText); ignoreInitialSpace = node.Text != "" && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]); } else { foreach (var kid in node.Children) { AppendNodeToStringBuilder(sb, kid, ref ignoreInitialSpace); } } }
static void AppendNodeWithLimitedDepth(StringBuilder sb, StringifiedExpression node, ref bool ignoreInitialSpace, int unfoldToDepth) { if (node.Text != null) { var trimmedText = ignoreInitialSpace ? node.Text.TrimStart() : node.Text; sb.Append(trimmedText); ignoreInitialSpace = node.Text != "" && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]); } else { foreach (var kid in node.Children) { if (kid.IsConceptualChild && unfoldToDepth == 0) { sb.Append("..."); ignoreInitialSpace = false; } else { AppendNodeWithLimitedDepth(sb, kid, ref ignoreInitialSpace, unfoldToDepth - (kid.IsConceptualChild ? 1 : 0)); } } } }
static void AppendTo(ExpressionToCodeConfiguration config, StringBuilder sb, List<SubExpressionInfo> nodeInfos, StringifiedExpression node, ref bool ignoreInitialSpace, bool showTopExpressionValue) { if (node.Text != null) { var trimmedText = ignoreInitialSpace ? node.Text.TrimStart() : node.Text; var pos0 = sb.Length; sb.Append(trimmedText); ignoreInitialSpace = node.Text.Any() && ExpressionToCode.ShouldIgnoreSpaceAfter(node.Text[node.Text.Length - 1]); if (showTopExpressionValue) { string valueString = node.OptionalValue == null ? null : ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue); if (valueString != null) { nodeInfos.Add(new SubExpressionInfo { Location = pos0 + trimmedText.Length / 2, Value = valueString }); } } } foreach (var kid in node.Children) { AppendTo(config, sb, nodeInfos, kid, ref ignoreInitialSpace, showTopExpressionValue || kid.IsConceptualChild); } }
static void FindSubExpressionValues( ExpressionToCodeConfiguration config, StringifiedExpression node, StringifiedExpression subExprNode, List <SubExpressionValue> subExpressionValues, bool outerValueIsAssertionFailure) { if (!outerValueIsAssertionFailure && node.OptionalValue != null) { var sb = new StringBuilder(); var ignoreInitialSpace = true; var valueString = ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue, 10); AppendNodeToStringBuilder(sb, subExprNode, ref ignoreInitialSpace); var maxSize = Math.Max(40, config.Value.MaximumValueLength ?? 200); var subExprString = sb.Length <= maxSize ? sb.ToString() : sb.ToString(0, maxSize / 2 - 1) + " … " + sb.ToString(sb.Length - (maxSize / 2 - 1), maxSize / 2 - 1); // ReSharper disable once ReplaceWithStringIsNullOrEmpty - for nullability analysis if (valueString != null && valueString != "") { subExpressionValues.Add(new SubExpressionValue { SubExpression = subExprString, ValueAsString = valueString }); } } foreach (var kid in node.Children) { if (!kid.IsConceptualChild) { FindSubExpressionValues(config, kid, subExprNode, subExpressionValues, outerValueIsAssertionFailure); } } foreach (var kid in node.Children) { if (kid.IsConceptualChild) { FindSubExpressionValues(config, kid, kid, subExpressionValues, false); } } }
static void FindSubExpressionValues( ExpressionToCodeConfiguration config, StringifiedExpression node, StringifiedExpression subExprNode, List <SubExpressionValue> subExpressionValues, bool hideOutermostValue) { if (!hideOutermostValue && node.OptionalValue != null) { var sb = new StringBuilder(); var ignoreInitialSpace = true; var valueString = ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue, 10); AppendNodeToStringBuilder(sb, subExprNode, ref ignoreInitialSpace); var maxSize = 80; var subExprString = sb.Length <= maxSize ? sb.ToString() : sb.ToString(0, maxSize / 2 - 1) + " … " + sb.ToString(sb.Length - (maxSize / 2 - 1), maxSize / 2 - 1); if (!string.IsNullOrEmpty(valueString)) { subExpressionValues.Add(new SubExpressionValue { SubExpression = subExprString, ValueAsString = valueString }); } } foreach (var kid in node.Children) { if (kid.IsConceptualChild) { FindSubExpressionValues(config, kid, kid, subExpressionValues, false); } } foreach (var kid in node.Children) { if (!kid.IsConceptualChild) { FindSubExpressionValues(config, kid, subExprNode, subExpressionValues, hideOutermostValue); } } }
static void FindSubExpressionValues( ExpressionToCodeConfiguration config, StringifiedExpression node, StringifiedExpression subExprNode, List<SubExpressionValue> subExpressionValues, bool hideOutermostValue) { if (!hideOutermostValue && node.OptionalValue != null) { var sb = new StringBuilder(); var ignoreInitialSpace = true; AppendNodeWithLimitedDepth(sb, subExprNode, ref ignoreInitialSpace, 2); var subExprString = sb.ToString(); string valueString = ObjectToCodeImpl.ExpressionValueAsCode(config, node.OptionalValue); subExpressionValues.Add(new SubExpressionValue { SubExpression = subExprString, ValueAsString = valueString }); } foreach (var kid in node.Children) { if (kid.IsConceptualChild) { FindSubExpressionValues(config, kid, kid, subExpressionValues, false); } else { FindSubExpressionValues(config, kid, subExprNode, subExpressionValues, hideOutermostValue); } } }
public static StringifiedExpression WithChildren(StringifiedExpression[] children) => new StringifiedExpression(null, children, null, false);