Browse Source

CombineQueryExpressions: Add missing transparent-identifier pattern.

pull/1505/head
Siegfried Pammer 6 years ago
parent
commit
d0f42fb178
  1. 26
      ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs

26
ICSharpCode.Decompiler/CSharp/Transforms/CombineQueryExpressions.cs

@ -45,7 +45,10 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
void CombineQueries(AstNode node, Dictionary<string, object> letIdentifiers) void CombineQueries(AstNode node, Dictionary<string, object> letIdentifiers)
{ {
for (AstNode child = node.FirstChild; child != null; child = child.NextSibling) { AstNode next;
for (AstNode child = node.FirstChild; child != null; child = next) {
// store referece to next child before transformation
next = child.NextSibling;
CombineQueries(child, letIdentifiers); CombineQueries(child, letIdentifiers);
} }
QueryExpression query = node as QueryExpression; QueryExpression query = node as QueryExpression;
@ -76,7 +79,8 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
Initializers = { Initializers = {
new Repeat( new Repeat(
new Choice { new Choice {
new IdentifierExpression(Pattern.AnyString).WithName("expr"), // capture variable with same name new IdentifierExpression(Pattern.AnyString).WithName("expr"), // name is equivalent to name = name
new MemberReferenceExpression(new AnyNode(), Pattern.AnyString).WithName("expr"), // expr.name is equivalent to name = expr.name
new NamedExpression { new NamedExpression {
Name = Pattern.AnyString, Name = Pattern.AnyString,
Expression = new AnyNode() Expression = new AnyNode()
@ -117,20 +121,28 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
case IdentifierExpression identifier: case IdentifierExpression identifier:
// nothing to add // nothing to add
continue; continue;
case MemberReferenceExpression member:
AddQueryLetClause(member.MemberName, member);
break;
case NamedExpression namedExpression: case NamedExpression namedExpression:
if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier) { if (namedExpression.Expression is IdentifierExpression identifierExpression && namedExpression.Name == identifierExpression.Identifier) {
letClauses[namedExpression.Name] = identifierExpression.Annotation<ILVariableResolveResult>(); letClauses[namedExpression.Name] = identifierExpression.Annotation<ILVariableResolveResult>();
continue; continue;
} }
QueryLetClause letClause = new QueryLetClause { Identifier = namedExpression.Name, Expression = namedExpression.Expression.Detach() }; AddQueryLetClause(namedExpression.Name, namedExpression.Expression);
var annotation = new LetIdentifierAnnotation();
letClause.AddAnnotation(annotation);
letClauses[namedExpression.Name] = annotation;
query.Clauses.InsertAfter(insertionPos, letClause);
break; break;
} }
} }
return true; return true;
void AddQueryLetClause(string name, Expression expression)
{
QueryLetClause letClause = new QueryLetClause { Identifier = name, Expression = expression.Detach() };
var annotation = new LetIdentifierAnnotation();
letClause.AddAnnotation(annotation);
letClauses[name] = annotation;
query.Clauses.InsertAfter(insertionPos, letClause);
}
} }
/// <summary> /// <summary>

Loading…
Cancel
Save