diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs index ba957df7c..9b8cb13df 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/IntroduceQueryExpressions.cs @@ -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(), innerLambda.Annotation())); query.Clauses.Add(joinClause); diff --git a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs index 5ec4e54b6..8ccf41ba2 100644 --- a/ICSharpCode.Decompiler/Output/TextTokenWriter.cs +++ b/ICSharpCode.Decompiler/Output/TextTokenWriter.cs @@ -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 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 return variable; } + if (id.Role == QueryJoinClause.IntoIdentifierRole || id.Role == QueryJoinClause.JoinIdentifierRole) + { + var variable = id.Annotation()?.Variable; + if (variable != null) + return variable; + } + if (node is QueryLetClause) { var variable = node.Annotation();