Browse Source

The resource expression is always needed regardless of the setting.

pull/1754/head
David Wengier 6 years ago
parent
commit
e30e08a59d
  1. 9
      ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

9
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -406,7 +406,8 @@ namespace ICSharpCode.Decompiler.CSharp @@ -406,7 +406,8 @@ namespace ICSharpCode.Decompiler.CSharp
protected internal override Statement VisitUsingInstruction(UsingInstruction inst)
{
var transformed = TransformToForeach(inst, out var resource);
var resource = exprBuilder.Translate(inst.ResourceExpression).Expression;
var transformed = TransformToForeach(inst, resource);
if (transformed != null)
return transformed;
AstNode usingInit = resource;
@ -420,7 +421,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -420,7 +421,7 @@ namespace ICSharpCode.Decompiler.CSharp
AssignVariableNames.GenerateVariableName(currentFunction, disposeType)
);
return new BlockStatement {
new ExpressionStatement(new AssignmentExpression(exprBuilder.ConvertVariable(var).Expression, resource?.Detach())),
new ExpressionStatement(new AssignmentExpression(exprBuilder.ConvertVariable(var).Expression, resource.Detach())),
new TryCatchStatement {
TryBlock = ConvertAsBlock(inst.Body),
FinallyBlock = new BlockStatement() {
@ -446,14 +447,12 @@ namespace ICSharpCode.Decompiler.CSharp @@ -446,14 +447,12 @@ namespace ICSharpCode.Decompiler.CSharp
}
}
Statement TransformToForeach(UsingInstruction inst, out Expression resource)
Statement TransformToForeach(UsingInstruction inst, Expression resource)
{
if (!settings.ForEachStatement) {
resource = null;
return null;
}
// Check if the using resource matches the GetEnumerator pattern.
resource = exprBuilder.Translate(inst.ResourceExpression);
var m = getEnumeratorPattern.Match(resource);
// The using body must be a BlockContainer.
if (!(inst.Body is BlockContainer container) || !m.Success)

Loading…
Cancel
Save