diff --git a/ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs b/ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs index 6516a3951..8fbcf57e5 100644 --- a/ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs +++ b/ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs @@ -160,6 +160,18 @@ namespace ICSharpCode.Decompiler.CSharp VisitAsSequencePoint(lambdaExpression.Body); } + public override void VisitQuerySelectClause(QuerySelectClause querySelectClause) + { + AddToSequencePoint(querySelectClause); + VisitAsSequencePoint(querySelectClause.Expression); + } + + public override void VisitQueryWhereClause(QueryWhereClause queryWhereClause) + { + AddToSequencePoint(queryWhereClause); + VisitAsSequencePoint(queryWhereClause.Condition); + } + public override void VisitUsingStatement(UsingStatement usingStatement) { StartSequencePoint(usingStatement); diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs index 02faac75e..7084083f1 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs @@ -97,10 +97,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms return null; ParameterDeclaration parameter; Expression body; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out body)) { + Expression expr = invocation.Arguments.Single(); + if (MatchSimpleLambda(expr, out parameter, out body)) { QueryExpression query = new QueryExpression(); query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); - query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(body.Detach(), parameter.Name) }); + query.Clauses.Add(new QuerySelectClause { Expression = WrapExpressionInParenthesesIfNecessary(body.Detach(), parameter.Name) }.CopyAnnotationsFrom(expr)); return query; } return null; @@ -163,10 +164,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms return null; ParameterDeclaration parameter; Expression body; - if (MatchSimpleLambda(invocation.Arguments.Single(), out parameter, out body)) { + Expression expr = invocation.Arguments.Single(); + if (MatchSimpleLambda(expr, out parameter, out body)) { QueryExpression query = new QueryExpression(); query.Clauses.Add(MakeFromClause(parameter, mre.Target.Detach())); - query.Clauses.Add(new QueryWhereClause { Condition = body.Detach() }); + query.Clauses.Add(new QueryWhereClause { Condition = body.Detach() }.CopyAnnotationsFrom(expr)); return query; } return null; @@ -244,7 +246,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms joinClause.IntoIdentifier = p2.Name; // into p2.Name } query.Clauses.Add(joinClause); - query.Clauses.Add(new QuerySelectClause { Expression = ((Expression)lambda.Body).Detach() }); + query.Clauses.Add(new QuerySelectClause { Expression = ((Expression)lambda.Body).Detach() }.CopyAnnotationsFrom(lambda)); return query; } } diff --git a/ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs b/ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs index 32a45f9ab..6ba293229 100644 --- a/ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs +++ b/ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs @@ -133,6 +133,16 @@ namespace ICSharpCode.Decompiler.DebugInfo HandleMethod(anonymousMethodExpression); } + public override void VisitQuerySelectClause(QuerySelectClause querySelectClause) + { + HandleMethod(querySelectClause); + } + + public override void VisitQueryWhereClause(QueryWhereClause queryWhereClause) + { + HandleMethod(queryWhereClause); + } + void HandleMethod(AstNode node) { // Look into method body, e.g. in order to find lambdas