Browse Source

Don't remove redundant ToString() calls in expression trees.

pull/1726/head
Daniel Grunwald 6 years ago
parent
commit
b5eecb8afc
  1. 8
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/ExpressionTrees.cs
  2. 13
      ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs

8
ICSharpCode.Decompiler.Tests/TestCases/Pretty/ExpressionTrees.cs

@ -1026,6 +1026,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -1026,6 +1026,14 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
});
}
public static void StringConcat()
{
Test<Func<string, object, string>>(null, (string a, object b) => a + b);
Test<Func<string, object, string>>(null, (string a, object b) => a + b.ToString());
Test<Func<string, int, string>>(null, (string a, int b) => a + b);
Test<Func<string, int, string>>(null, (string a, int b) => a + b.ToString());
}
public async Task Issue1524(string str)
{
await Task.Delay(100);

13
ICSharpCode.Decompiler/CSharp/Transforms/ReplaceMethodCallsWithOperators.cs

@ -59,10 +59,17 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -59,10 +59,17 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
// Reduce "String.Concat(a, b)" to "a + b"
if (IsStringConcat(method) && CheckArgumentsForStringConcat(arguments)) {
invocationExpression.Arguments.Clear(); // detach arguments from invocationExpression
Expression expr = RemoveRedundantToStringInConcat(arguments[0], method, isLastArgument: false).Detach();
bool isInExpressionTree = invocationExpression.Ancestors.OfType<LambdaExpression>().Any(
lambda => lambda.Annotation<IL.ILFunction>()?.Kind == IL.ILFunctionKind.ExpressionTree);
Expression expr = arguments[0].Detach();
if (!isInExpressionTree) {
expr = RemoveRedundantToStringInConcat(expr, method, isLastArgument: false).Detach();
}
for (int i = 1; i < arguments.Length; i++) {
var arg = RemoveRedundantToStringInConcat(arguments[i], method, isLastArgument: i == arguments.Length - 1).Detach();
var arg = arguments[i].Detach();
if (!isInExpressionTree) {
arg = RemoveRedundantToStringInConcat(arg, method, isLastArgument: i == arguments.Length - 1).Detach();
}
expr = new BinaryOperatorExpression(expr, BinaryOperatorType.Add, arg);
}
expr.CopyAnnotationsFrom(invocationExpression);

Loading…
Cancel
Save