|
|
|
@ -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) |
|
|
|
|