Browse Source

#1482: Fix sequence points of LINQ select and where.

pull/1967/head
Siegfried Pammer 5 years ago
parent
commit
3f108cea37
  1. 12
      ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs
  2. 12
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs
  3. 10
      ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs

12
ICSharpCode.Decompiler/CSharp/SequencePointBuilder.cs

@ -160,6 +160,18 @@ namespace ICSharpCode.Decompiler.CSharp @@ -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);

12
ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs

@ -97,10 +97,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms @@ -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 @@ -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 @@ -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;
}
}

10
ICSharpCode.Decompiler/DebugInfo/DebugInfoGenerator.cs

@ -133,6 +133,16 @@ namespace ICSharpCode.Decompiler.DebugInfo @@ -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

Loading…
Cancel
Save