Browse Source

The resource expression is always needed regardless of the setting.

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

Loading…
Cancel
Save