Browse Source

Fix another bug in TranslateObjectAndCollectionInitializer

pull/734/merge
Siegfried Pammer 8 years ago
parent
commit
ef50a1114f
  1. 10
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 16
      ICSharpCode.Decompiler/Tests/TestCases/Correctness/InitializerTests.cs

10
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1456,9 +1456,10 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1456,9 +1456,10 @@ namespace ICSharpCode.Decompiler.CSharp
index++;
firstDifferenceIndex = index;
while (elementsStack.Count - 1 > firstDifferenceIndex) {
var methodElement = currentPath[elementsStack.Count - 1];
var pathElement = currentPath[elementsStack.Count - 2];
var values = elementsStack.Pop();
elementsStack.Peek().Add(MakeInitializerAssignment(pathElement.Member, values));
elementsStack.Peek().Add(MakeInitializerAssignment(methodElement.Member, pathElement.Member, values));
}
currentPath = info.Path;
}
@ -1478,20 +1479,21 @@ namespace ICSharpCode.Decompiler.CSharp @@ -1478,20 +1479,21 @@ namespace ICSharpCode.Decompiler.CSharp
}
}
while (elementsStack.Count > 1) {
var methodElement = currentPath[elementsStack.Count - 1];
var pathElement = currentPath[elementsStack.Count - 2];
var values = elementsStack.Pop();
elementsStack.Peek().Add(MakeInitializerAssignment(pathElement.Member, values));
elementsStack.Peek().Add(MakeInitializerAssignment(methodElement.Member, pathElement.Member, values));
}
var oce = (ObjectCreateExpression)expr.Expression;
oce.Initializer = new ArrayInitializerExpression(elements);
return expr.WithILInstruction(block);
}
Expression MakeInitializerAssignment(IMember member, List<Expression> values)
Expression MakeInitializerAssignment(IMember method, IMember member, List<Expression> values)
{
var target = new IdentifierExpression(member.Name);
Expression value;
if (values.Count == 1 && !(values[0] is AssignmentExpression))
if (values.Count == 1 && !(values[0] is AssignmentExpression) && !(method.SymbolKind == SymbolKind.Method && method.Name == "Add"))
value = values[0];
else
value = new ArrayInitializerExpression(values);

16
ICSharpCode.Decompiler/Tests/TestCases/Correctness/InitializerTests.cs

@ -54,6 +54,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness @@ -54,6 +54,11 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
get;
set;
}
public InitializerTests.MyEnum b
{
get;
set;
}
public List<InitializerTests.MyEnum2> PropertyList
{
get;
@ -527,6 +532,17 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness @@ -527,6 +532,17 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Correctness
});
}
public static void CollectionInitializerInsideObjectInitializers()
{
InitializerTests.Data castPattern = new InitializerTests.Data {
MoreData = new InitializerTests.Data {
a = InitializerTests.MyEnum.a,
b = InitializerTests.MyEnum.b,
PropertyList = { InitializerTests.MyEnum2.c }
}
};
}
public static void NotAStructInitializer_DefaultConstructor()
{
InitializerTests.StructData data = new InitializerTests.StructData();

Loading…
Cancel
Save