Skip to content

Commit

Permalink
Ensuring auto-generated LINQ expression parameter names are valid / R…
Browse files Browse the repository at this point in the history
…emoving redundant anonymous type member specifications in member to value assignments re: #97
  • Loading branch information
SteveWilkes committed Nov 14, 2021
1 parent 92f847c commit 7d35aa8
Show file tree
Hide file tree
Showing 4 changed files with 59 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Common;
using ReadableExpressions.Extensions;
#if !NET35
Expand Down Expand Up @@ -135,7 +137,7 @@ public void ShouldNameGenericGenericTypeArguments()

// See https://github.com/agileobjects/ReadableExpressions/issues/94
[Fact]
public void ShouldNamePartClosedGenericTypeArguments()
public void ShouldNamePartClosedGenericTypeArrays()
{
var name = typeof(GenericTestHelper<>)
.GetField("Keys").FieldType
Expand All @@ -144,6 +146,29 @@ public void ShouldNamePartClosedGenericTypeArguments()
name.ShouldBe("KeyValuePair<T, int>[]");
}

// See https://github.com/agileobjects/ReadableExpressions/issues/97
[Fact]
public void ShouldNameLinqExpressionVariables()
{
Expression<Func<IEnumerable<int>>> linqQuery = () =>
from s in new[] { "1", "2", "3", "4", "5" }
let n = int.Parse(s)
where n > 3
group s by s into result
select result.Count();

const string EXPECTED = @"
() => new[] { ""1"", ""2"", ""3"", ""4"", ""5"" }
.Select(s => new { s, n = int.Parse(s) })
.Where(_ => _.n > 3)
.GroupBy(_ => _.s, _ => _.s)
.Select(result => result.Count())";

var translated = linqQuery.ToReadableString();

translated.ShouldBe(EXPECTED.TrimStart());
}

#region Helper Classes

// ReSharper disable once UnusedTypeParameter
Expand Down
18 changes: 15 additions & 3 deletions ReadableExpressions/Translations/AnonymousTypeNewingTranslation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -97,9 +97,17 @@ public AnonymousTypeInitializerTranslation(
ParameterInfo member,
ITranslation value)
{
_memberName = member.Name;
_value = value;

if (value is IParameterTranslation parameter &&
parameter.Name == member.Name)
{
_memberName = string.Empty;
TranslationSize = value.TranslationSize;
return;
}

_memberName = member.Name;
TranslationSize = _memberName.Length + 3 + value.TranslationSize;
}

Expand All @@ -117,8 +125,12 @@ public AnonymousTypeInitializerTranslation(

public void WriteTo(TranslationWriter writer)
{
writer.WriteToTranslation(_memberName);
writer.WriteToTranslation(" = ");
if (_memberName != string.Empty)
{
writer.WriteToTranslation(_memberName);
writer.WriteToTranslation(" = ");
}

_value.WriteTo(writer);
}
}
Expand Down
2 changes: 2 additions & 0 deletions ReadableExpressions/Translations/IParameterTranslation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
{
internal interface IParameterTranslation : ITranslation
{
string Name { get; }

void WithTypeNames(ITranslationContext context);

void WithoutTypeNames(ITranslationContext context);
Expand Down
20 changes: 16 additions & 4 deletions ReadableExpressions/Translations/ParameterTranslation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using System.Linq.Expressions;
#endif
using Extensions;
using static System.StringComparison;
using static Formatting.TokenType;

internal static class ParameterTranslation
Expand All @@ -18,13 +19,22 @@ public static ITranslation For(ParameterExpression parameter, ITranslationContex
return new UnnamedParameterTranslation(parameter, context);
}

if (parameter.Name.StartsWith("<>", Ordinal))
{
return new FixedValueTranslation(
ExpressionType.Parameter,
"_",
parameter.Type,
Variable,
context);
}

return new StandardParameterTranslation(parameter, context);
}

private abstract class ParameterTranslationBase : IParameterTranslation
{
private readonly ParameterExpression _parameter;
private readonly string _parameterName;
private ITranslation _typeNameTranslation;

protected ParameterTranslationBase(
Expand All @@ -33,9 +43,9 @@ protected ParameterTranslationBase(
ITranslationContext context)
{
_parameter = parameter;
_parameterName = parameterName;
Name = parameterName;

TranslationSize = _parameterName.Length;
TranslationSize = Name.Length;
FormattingSize = context.GetFormattingSize(Variable);
}

Expand All @@ -47,6 +57,8 @@ protected ParameterTranslationBase(

public int FormattingSize { get; private set; }

public string Name { get; }

public void WithTypeNames(ITranslationContext context)
{
_typeNameTranslation = context.GetTranslationFor(Type);
Expand Down Expand Up @@ -77,7 +89,7 @@ public void WriteTo(TranslationWriter writer)
writer.WriteSpaceToTranslation();
}

writer.WriteToTranslation(_parameterName, Variable);
writer.WriteToTranslation(Name, Variable);
}
}

Expand Down

0 comments on commit 7d35aa8

Please sign in to comment.