Browse Source

Fix #1593: TransformCollectionAndObjectInitializers uses nested indexer call as target of object initializer.

pull/1612/head
Siegfried Pammer 6 years ago
parent
commit
61231b7725
  1. 20
      ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

20
ICSharpCode.Decompiler/IL/Transforms/TransformCollectionAndObjectInitializers.cs

@ -216,15 +216,25 @@ namespace ICSharpCode.Decompiler.IL.Transforms
case AccessPathKind.Setter: case AccessPathKind.Setter:
if (isCollection || !pathStack.Peek().Add(lastElement)) if (isCollection || !pathStack.Peek().Add(lastElement))
return false; return false;
if (values.Count == 1) { if (values.Count != 1 || !IsValidObjectInitializerTarget(currentPath))
blockKind = BlockKind.ObjectInitializer; return false;
return true; blockKind = BlockKind.ObjectInitializer;
} return true;
return false;
default: default:
return false; return false;
} }
} }
bool IsValidObjectInitializerTarget(List<AccessPathElement> path)
{
if (path.Count == 0)
return true;
var element = path.Last();
var previous = path.SkipLast(1).LastOrDefault();
if (!(element.Member is IProperty p))
return true;
return !p.IsIndexer || (previous.Member?.ReturnType.Equals(element.Member.DeclaringType) == true);
}
} }
public enum AccessPathKind public enum AccessPathKind

Loading…
Cancel
Save