Browse Source

Fix highlighting of identifiers declared in LINQ join clauses

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

11
ICSharpCode.Decompiler/Output/TextTokenWriter.cs

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

Loading…
Cancel
Save