Browse Source

modify the using pattern to also detect F#

pull/671/head
lrieger 10 years ago
parent
commit
42bfb9bb23
  1. 53
      ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs

53
ICSharpCode.Decompiler/Ast/Transforms/PatternStatementTransform.cs

@ -58,11 +58,12 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
public override AstNode VisitExpressionStatement(ExpressionStatement expressionStatement, object data) public override AstNode VisitExpressionStatement(ExpressionStatement expressionStatement, object data)
{ {
AstNode result; AstNode result;
if (context.Settings.UsingStatement) { if (context.Settings.UsingStatement)
result = TransformUsings(expressionStatement); {
result = TransformNonGenericForEach(expressionStatement);
if (result != null) if (result != null)
return result; return result;
result = TransformNonGenericForEach(expressionStatement); result = TransformUsings(expressionStatement);
if (result != null) if (result != null)
return result; return result;
} }
@ -156,7 +157,9 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
}; };
} }
static readonly AstNode usingTryCatchPattern = new TryCatchStatement { static readonly AstNode usingTryCatchPattern = new Choice {
{ "c#/vb",
new TryCatchStatement {
TryBlock = new AnyNode(), TryBlock = new AnyNode(),
FinallyBlock = new BlockStatement { FinallyBlock = new BlockStatement {
new Choice { new Choice {
@ -177,6 +180,33 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
} }
}.ToStatement() }.ToStatement()
} }
}
},
{ "f#",
new TryCatchStatement {
TryBlock = new AnyNode(),
FinallyBlock =
new BlockStatement {
new ExpressionStatement(
new AssignmentExpression(left: new NamedNode("disposable", new IdentifierExpression(Pattern.AnyString)),
right: new AsExpression(expression: new NamedNode("ident", new IdentifierExpression(Pattern.AnyString)),
type: new TypePattern(typeof(IDisposable))
)
)
),
new IfElseStatement {
Condition = new BinaryOperatorExpression(
new Backreference("disposable"),
BinaryOperatorType.InEquality,
new NullReferenceExpression()
),
TrueStatement = new BlockStatement {
new ExpressionStatement(InvokeDispose(new Backreference("disposable")))
}
}
}
}
}
}; };
public UsingStatement TransformUsings(ExpressionStatement node) public UsingStatement TransformUsings(ExpressionStatement node)
@ -213,9 +243,20 @@ namespace ICSharpCode.Decompiler.Ast.Transforms
// Validate that the variable is not used after the using statement: // Validate that the variable is not used after the using statement:
if (!IsVariableValueUnused(varDecl, tryCatch)) if (!IsVariableValueUnused(varDecl, tryCatch))
return null; return null;
if (m2.Has("f#")) {
string variableNameDisposable = m2.Get<IdentifierExpression>("disposable").Single().Identifier;
VariableDeclarationStatement varDeclDisposable = FindVariableDeclaration(node, variableNameDisposable);
if (varDeclDisposable == null || !(varDeclDisposable.Parent is BlockStatement))
return null;
// Validate that the variable is not used after the using statement:
if (!IsVariableValueUnused(varDeclDisposable, tryCatch))
return null;
}
node.Remove(); node.Remove();
UsingStatement usingStatement = new UsingStatement(); UsingStatement usingStatement = new UsingStatement();
usingStatement.EmbeddedStatement = tryCatch.TryBlock.Detach(); usingStatement.EmbeddedStatement = tryCatch.TryBlock.Detach();
tryCatch.ReplaceWith(usingStatement); tryCatch.ReplaceWith(usingStatement);

Loading…
Cancel
Save