Browse Source

Fix highlighting of identifiers declared in LINQ join clauses

pull/2276/head
Siegfried Pammer 5 years ago
parent
commit
2b16be76b6
  1. 2
      ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs
  2. 11
      ICSharpCode.Decompiler/Output/TextTokenWriter.cs

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

@ -258,12 +258,14 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms
query.Clauses.Add(MakeFromClause(element1, source1.Detach())); query.Clauses.Add(MakeFromClause(element1, source1.Detach()));
QueryJoinClause joinClause = new QueryJoinClause(); QueryJoinClause joinClause = new QueryJoinClause();
joinClause.JoinIdentifier = element2.Name; // join elementName2 joinClause.JoinIdentifier = element2.Name; // join elementName2
joinClause.JoinIdentifierToken.CopyAnnotationsFrom(element2);
joinClause.InExpression = source2.Detach(); // in source2 joinClause.InExpression = source2.Detach(); // in source2
joinClause.OnExpression = key1.Detach(); // on key1 joinClause.OnExpression = key1.Detach(); // on key1
joinClause.EqualsExpression = key2.Detach(); // equals key2 joinClause.EqualsExpression = key2.Detach(); // equals key2
if (mre.MemberName == "GroupJoin") if (mre.MemberName == "GroupJoin")
{ {
joinClause.IntoIdentifier = p2.Name; // into p2.Name joinClause.IntoIdentifier = p2.Name; // into p2.Name
joinClause.IntoIdentifierToken.CopyAnnotationsFrom(p2);
} }
joinClause.AddAnnotation(new QueryJoinClauseAnnotation(outerLambda.Annotation<IL.ILFunction>(), innerLambda.Annotation<IL.ILFunction>())); joinClause.AddAnnotation(new QueryJoinClauseAnnotation(outerLambda.Annotation<IL.ILFunction>(), innerLambda.Annotation<IL.ILFunction>()));
query.Clauses.Add(joinClause); query.Clauses.Add(joinClause);

11
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

@ -85,7 +85,7 @@ namespace ICSharpCode.Decompiler
return; return;
} }
var localDefinition = GetCurrentLocalDefinition(); var localDefinition = GetCurrentLocalDefinition(identifier);
if (localDefinition != null) if (localDefinition != null)
{ {
output.WriteLocalReference(name, localDefinition, isDefinition: true); output.WriteLocalReference(name, localDefinition, isDefinition: true);
@ -169,7 +169,7 @@ namespace ICSharpCode.Decompiler
return null; return null;
} }
object GetCurrentLocalDefinition() object GetCurrentLocalDefinition(Identifier id)
{ {
AstNode node = nodeStack.Peek(); AstNode node = nodeStack.Peek();
if (node is Identifier && node.Parent != null) if (node is Identifier && node.Parent != null)
@ -182,6 +182,13 @@ namespace ICSharpCode.Decompiler
return variable; return variable;
} }
if (id.Role == QueryJoinClause.IntoIdentifierRole || id.Role == QueryJoinClause.JoinIdentifierRole)
{
var variable = id.Annotation<ILVariableResolveResult>()?.Variable;
if (variable != null)
return variable;
}
if (node is QueryLetClause) if (node is QueryLetClause)
{ {
var variable = node.Annotation<CSharp.Transforms.LetIdentifierAnnotation>(); var variable = node.Annotation<CSharp.Transforms.LetIdentifierAnnotation>();

Loading…
Cancel
Save