Browse Source

Fix annotations on identifiers and use correct check for fallback case.

pull/877/head
Siegfried Pammer 8 years ago
parent
commit
c09c4ee404
  1. 3
      ICSharpCode.Decompiler.Tests/TestCases/Pretty/Loops.cs
  2. 2
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  3. 13
      ICSharpCode.Decompiler/CSharp/StatementBuilder.cs
  4. 2
      ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

3
ICSharpCode.Decompiler.Tests/TestCases/Pretty/Loops.cs

@ -233,9 +233,8 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty @@ -233,9 +233,8 @@ namespace ICSharpCode.Decompiler.Tests.TestCases.Pretty
}
} finally {
IDisposable disposable = enumerator as IDisposable;
if (disposable != null) {
if (disposable != null)
disposable.Dispose();
}
}
Console.WriteLine("After finally!");
}

2
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -153,7 +153,7 @@ namespace ICSharpCode.Decompiler.CSharp @@ -153,7 +153,7 @@ namespace ICSharpCode.Decompiler.CSharp
return expr.ConvertToBoolean(this, negate);
}
ExpressionWithResolveResult ConvertVariable(ILVariable variable)
internal ExpressionWithResolveResult ConvertVariable(ILVariable variable)
{
Expression expr;
if (variable.Kind == VariableKind.Parameter && variable.Index < 0)

13
ICSharpCode.Decompiler/CSharp/StatementBuilder.cs

@ -267,21 +267,22 @@ namespace ICSharpCode.Decompiler.CSharp @@ -267,21 +267,22 @@ namespace ICSharpCode.Decompiler.CSharp
return transformed;
AstNode usingInit = resource;
var var = inst.Variable;
if (!var.Type.GetAllBaseTypes().Any(b => b.IsKnownType(KnownTypeCode.IDisposable))) {
if (!inst.ResourceExpression.MatchLdNull() && !NullableType.GetUnderlyingType(var.Type).GetAllBaseTypes().Any(b => b.IsKnownType(KnownTypeCode.IDisposable))) {
var.Kind = VariableKind.Local;
var disposeType = exprBuilder.compilation.FindType(KnownTypeCode.IDisposable);
var disposeVariable = currentFunction.RegisterVariable(
VariableKind.Local, disposeType,
AssignVariableNames.GenerateVariableName(currentFunction, disposeType)
);
return new BlockStatement {
new ExpressionStatement(new AssignmentExpression(new IdentifierExpression(var.Name), resource.Detach())),
new ExpressionStatement(new AssignmentExpression(exprBuilder.ConvertVariable(var).Expression, resource.Detach())),
new TryCatchStatement {
TryBlock = ConvertAsBlock(inst.Body),
FinallyBlock = {
new ExpressionStatement(new AssignmentExpression(new IdentifierExpression(disposeVariable.Name), new AsExpression(new IdentifierExpression(var.Name), exprBuilder.ConvertType(disposeType)))),
FinallyBlock = new BlockStatement() {
new ExpressionStatement(new AssignmentExpression(exprBuilder.ConvertVariable(disposeVariable).Expression, new AsExpression(exprBuilder.ConvertVariable(var).Expression, exprBuilder.ConvertType(disposeType)))),
new IfElseStatement {
Condition = new BinaryOperatorExpression(new IdentifierExpression(disposeVariable.Name), BinaryOperatorType.InEquality, new NullReferenceExpression()),
TrueStatement = new ExpressionStatement(new InvocationExpression(new MemberReferenceExpression(new IdentifierExpression(disposeVariable.Name), "Dispose")))
Condition = new BinaryOperatorExpression(exprBuilder.ConvertVariable(disposeVariable), BinaryOperatorType.InEquality, new NullReferenceExpression()),
TrueStatement = new ExpressionStatement(new InvocationExpression(new MemberReferenceExpression(exprBuilder.ConvertVariable(disposeVariable).Expression, "Dispose")))
}
}
},

2
ICSharpCode.Decompiler/IL/Transforms/AssignVariableNames.cs

@ -410,6 +410,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms @@ -410,6 +410,8 @@ namespace ICSharpCode.Decompiler.IL.Transforms
proposedName = "item";
} else if (baseName.EndsWith("children", StringComparison.OrdinalIgnoreCase)) {
proposedName = baseName.Remove(baseName.Length - 3);
} else {
proposedName = baseName;
}
}
}

Loading…
Cancel
Save