From caa4ee76c3ce97eac68a03f781ad2297190310c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Matou=C5=A1ek?= Date: Mon, 23 Mar 2020 12:50:58 -0700 Subject: [PATCH] Add WhereAsArray with generic argument (#42682) * Add WhereAsArray with generic argument. * Feedback --- .../CSharp/Portable/Binder/Binder_Crefs.cs | 4 ++-- .../Portable/Binder/DecisionDagBuilder.cs | 2 +- src/Compilers/CSharp/Portable/Binder/Imports.cs | 2 +- .../Portable/Compilation/CSharpSemanticModel.cs | 6 +++--- .../CSharp/Portable/Symbols/ErrorTypeSymbol.cs | 2 +- .../Symbols/Metadata/PE/PENamedTypeSymbol.cs | 2 +- .../Symbols/Metadata/PE/PENamespaceSymbol.cs | 2 +- .../Portable/Symbols/NamespaceOrTypeSymbol.cs | 2 +- .../CSharp/Portable/Symbols/ReferenceManager.cs | 4 +++- .../Source/SourceMemberContainerSymbol.cs | 2 +- .../Symbols/Source/SourceNamespaceSymbol.cs | 2 +- .../Symbols/SubstitutedNamedTypeSymbol.cs | 2 +- .../ImmutableArrayExtensionsTests.cs | 10 ++++++++++ .../Collections/ImmutableArrayExtensions.cs | 17 ++++++++++++++--- .../Symbols/Metadata/PE/PENamedTypeSymbol.vb | 2 +- .../Symbols/Metadata/PE/PENamespaceSymbol.vb | 2 +- .../Portable/Symbols/NamespaceOrTypeSymbol.vb | 2 +- .../Portable/Symbols/ReferenceManager.vb | 4 +++- .../Source/SourceMemberContainerTypeSymbol.vb | 2 +- .../Portable/Symbols/Tuples/TupleTypeSymbol.vb | 2 +- .../Rewriters/CapturedVariableRewriter.cs | 2 +- .../Symbols/EENamedTypeSymbol.cs | 2 +- .../Symbols/EENamedTypeSymbol.vb | 2 +- 23 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Crefs.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Crefs.cs index 6316e62f345..adb6423de30 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Crefs.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Crefs.cs @@ -278,8 +278,8 @@ private ImmutableArray BindConversionOperatorMemberCref(ConversionOperat TypeSymbol returnType = BindCrefParameterOrReturnType(syntax.Type, syntax, diagnostics); // Filter out methods with the wrong return type, since overload resolution won't catch these. - sortedSymbols = sortedSymbols.WhereAsArray(symbol => - symbol.Kind != SymbolKind.Method || TypeSymbol.Equals(((MethodSymbol)symbol).ReturnType, returnType, TypeCompareKind.ConsiderEverything2)); + sortedSymbols = sortedSymbols.WhereAsArray((symbol, returnType) => + symbol.Kind != SymbolKind.Method || TypeSymbol.Equals(((MethodSymbol)symbol).ReturnType, returnType, TypeCompareKind.ConsiderEverything2), returnType); if (!sortedSymbols.Any()) { diff --git a/src/Compilers/CSharp/Portable/Binder/DecisionDagBuilder.cs b/src/Compilers/CSharp/Portable/Binder/DecisionDagBuilder.cs index 87b2027becb..21c4a47a389 100644 --- a/src/Compilers/CSharp/Portable/Binder/DecisionDagBuilder.cs +++ b/src/Compilers/CSharp/Portable/Binder/DecisionDagBuilder.cs @@ -1126,7 +1126,7 @@ private static RemainingTestsForCase RemoveEvaluation(RemainingTestsForCase c, B { return new RemainingTestsForCase( Index: c.Index, Syntax: c.Syntax, - RemainingTests: c.RemainingTests.WhereAsArray(d => !(d is BoundDagEvaluation e2) || e2 != e), + RemainingTests: c.RemainingTests.WhereAsArray((d, e) => !(d is BoundDagEvaluation e2) || e2 != e, e), Bindings: c.Bindings, WhenClause: c.WhenClause, CaseLabel: c.CaseLabel); } diff --git a/src/Compilers/CSharp/Portable/Binder/Imports.cs b/src/Compilers/CSharp/Portable/Binder/Imports.cs index 23459a9bad1..7546ac8b10e 100644 --- a/src/Compilers/CSharp/Portable/Binder/Imports.cs +++ b/src/Compilers/CSharp/Portable/Binder/Imports.cs @@ -459,7 +459,7 @@ private static ImmutableArray ConcatExternAliases( var replacedExternAliases = PooledHashSet.GetInstance(); replacedExternAliases.AddAll(externs2.Select(e => e.Alias.Name)); - return externs1.WhereAsArray(e => !replacedExternAliases.Contains(e.Alias.Name)).AddRange(externs2); + return externs1.WhereAsArray((e, replacedExternAliases) => !replacedExternAliases.Contains(e.Alias.Name), replacedExternAliases).AddRange(externs2); } private static ImmutableArray BuildExternAliases( diff --git a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs index 087ff2d9230..0d91248aec8 100644 --- a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs @@ -3970,7 +3970,7 @@ private static ImmutableArray FilterOverriddenOrHiddenMethods(Immu } } - return methods.WhereAsArray(m => !hiddenSymbols.Contains(m)); + return methods.WhereAsArray((m, hiddenSymbols) => !hiddenSymbols.Contains(m), hiddenSymbols); } // Get the symbols and possible method group associated with a method group bound node, as @@ -4075,7 +4075,7 @@ private static ImmutableArray FilterOverriddenOrHiddenMethods(Immu // If the bad expression has symbol(s) from this method group, it better indicates any problems. ImmutableArray myMethodGroup = methodGroup; - symbols = ((BoundBadExpression)boundNodeForSyntacticParent).Symbols.WhereAsArray(sym => myMethodGroup.Contains(sym)); + symbols = ((BoundBadExpression)boundNodeForSyntacticParent).Symbols.WhereAsArray((sym, myMethodGroup) => myMethodGroup.Contains(sym), myMethodGroup); if (symbols.Any()) { resultKind = ((BoundBadExpression)boundNodeForSyntacticParent).ResultKind; @@ -4176,7 +4176,7 @@ private static ImmutableArray FilterOverriddenOrHiddenMethods(Immu // If the bad expression has symbol(s) from this property group, it better indicates any problems. ImmutableArray myPropertyGroup = propertyGroup; - symbols = ((BoundBadExpression)boundNodeForSyntacticParent).Symbols.WhereAsArray(sym => myPropertyGroup.Contains(sym)); + symbols = ((BoundBadExpression)boundNodeForSyntacticParent).Symbols.WhereAsArray((sym, myPropertyGroup) => myPropertyGroup.Contains(sym), myPropertyGroup); if (symbols.Any()) { resultKind = ((BoundBadExpression)boundNodeForSyntacticParent).ResultKind; diff --git a/src/Compilers/CSharp/Portable/Symbols/ErrorTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/ErrorTypeSymbol.cs index 1a89f1bff51..c29a5d0fbf6 100644 --- a/src/Compilers/CSharp/Portable/Symbols/ErrorTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/ErrorTypeSymbol.cs @@ -158,7 +158,7 @@ public override ImmutableArray GetMembers() /// no members with this name, returns an empty ImmutableArray. Never returns Null. public override ImmutableArray GetMembers(string name) { - return GetMembers().WhereAsArray(m => m.Name == name); + return GetMembers().WhereAsArray((m, name) => m.Name == name, name); } internal sealed override IEnumerable GetFieldsToEmit() diff --git a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.cs index 3e566489c07..373e4a0d1a6 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.cs @@ -1474,7 +1474,7 @@ public override ImmutableArray GetTypeMembers(string name) public override ImmutableArray GetTypeMembers(string name, int arity) { - return GetTypeMembers(name).WhereAsArray(type => type.Arity == arity); + return GetTypeMembers(name).WhereAsArray((type, arity) => type.Arity == arity, arity); } public override ImmutableArray Locations diff --git a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamespaceSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamespaceSymbol.cs index 08651f9a43e..9be6a2ae0a1 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamespaceSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Metadata/PE/PENamespaceSymbol.cs @@ -132,7 +132,7 @@ public sealed override ImmutableArray GetTypeMembers(string nam public sealed override ImmutableArray GetTypeMembers(string name, int arity) { - return GetTypeMembers(name).WhereAsArray(type => type.Arity == arity); + return GetTypeMembers(name).WhereAsArray((type, arity) => type.Arity == arity, arity); } public sealed override ImmutableArray Locations diff --git a/src/Compilers/CSharp/Portable/Symbols/NamespaceOrTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/NamespaceOrTypeSymbol.cs index 3d08619c06a..aacb9649373 100644 --- a/src/Compilers/CSharp/Portable/Symbols/NamespaceOrTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/NamespaceOrTypeSymbol.cs @@ -165,7 +165,7 @@ public virtual ImmutableArray GetTypeMembers(string name, int a { // default implementation does a post-filter. We can override this if its a performance burden, but // experience is that it won't be. - return GetTypeMembers(name).WhereAsArray(t => t.Arity == arity); + return GetTypeMembers(name).WhereAsArray((t, arity) => t.Arity == arity, arity); } /// diff --git a/src/Compilers/CSharp/Portable/Symbols/ReferenceManager.cs b/src/Compilers/CSharp/Portable/Symbols/ReferenceManager.cs index 4de5afd53a3..15347bb5421 100644 --- a/src/Compilers/CSharp/Portable/Symbols/ReferenceManager.cs +++ b/src/Compilers/CSharp/Portable/Symbols/ReferenceManager.cs @@ -270,7 +270,9 @@ public PEAssemblySymbol CreatePEAssemblyForAssemblyMetadata(AssemblyMetadata met var assemblySymbol = new PEAssemblySymbol(assembly, DocumentationProvider.Default, isLinked: false, importOptions: importOptions); - var unifiedAssemblies = this.UnifiedAssemblies.WhereAsArray(unified => referencedAssembliesByIdentity.Contains(unified.OriginalReference, allowHigherVersion: false)); + var unifiedAssemblies = this.UnifiedAssemblies.WhereAsArray( + (unified, referencedAssembliesByIdentity) => referencedAssembliesByIdentity.Contains(unified.OriginalReference, allowHigherVersion: false), referencedAssembliesByIdentity); + InitializeAssemblyReuseData(assemblySymbol, peReferences, unifiedAssemblies); if (assembly.ContainsNoPiaLocalTypes()) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index 33501ff2ff2..ef2809ba21a 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -1112,7 +1112,7 @@ public override ImmutableArray GetTypeMembers(string name) public override ImmutableArray GetTypeMembers(string name, int arity) { - return GetTypeMembers(name).WhereAsArray(t => t.Arity == arity); + return GetTypeMembers(name).WhereAsArray((t, arity) => t.Arity == arity, arity); } private Dictionary> GetTypeMembersDictionary() diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamespaceSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamespaceSymbol.cs index a212339c612..0ce68725202 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamespaceSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamespaceSymbol.cs @@ -179,7 +179,7 @@ public override ImmutableArray GetTypeMembers(string name) public override ImmutableArray GetTypeMembers(string name, int arity) { - return GetTypeMembers(name).WhereAsArray(s => s.Arity == arity); + return GetTypeMembers(name).WhereAsArray((s, arity) => s.Arity == arity, arity); } internal override ModuleSymbol ContainingModule diff --git a/src/Compilers/CSharp/Portable/Symbols/SubstitutedNamedTypeSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/SubstitutedNamedTypeSymbol.cs index 274b02f16a4..37e2103f78a 100644 --- a/src/Compilers/CSharp/Portable/Symbols/SubstitutedNamedTypeSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/SubstitutedNamedTypeSymbol.cs @@ -286,7 +286,7 @@ private ImmutableArray GetMembersWorker(string name) { if (IsTupleType) { - var result = GetMembers().WhereAsArray(m => m.Name == name); + var result = GetMembers().WhereAsArray((m, name) => m.Name == name, name); cacheResult(result); return result; } diff --git a/src/Compilers/Core/CodeAnalysisTest/Collections/ImmutableArrayExtensionsTests.cs b/src/Compilers/Core/CodeAnalysisTest/Collections/ImmutableArrayExtensionsTests.cs index d2dcb2a9174..c8a0044abbb 100644 --- a/src/Compilers/Core/CodeAnalysisTest/Collections/ImmutableArrayExtensionsTests.cs +++ b/src/Compilers/Core/CodeAnalysisTest/Collections/ImmutableArrayExtensionsTests.cs @@ -453,6 +453,16 @@ public void WhereAsArray() Assert.True(a.WhereAsArray(i => i % 2 == 1).SequenceEqual(ImmutableArray.Create(1, 3, 5))); } + [Fact] + public void WhereAsArray_WithArg() + { + var x = new C(); + Assert.Same(x, ImmutableArray.Create(x).WhereAsArray((o, arg) => o == arg, x)[0]); + + var a = ImmutableArray.Create(0, 1, 2, 3, 4, 5); + AssertEx.Equal(new[] { 3, 4, 5 }, a.WhereAsArray((i, j) => i > j, 2)); + } + private class C { } diff --git a/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs b/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs index b55a4cb7f36..3df4f0471ff 100644 --- a/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs +++ b/src/Compilers/Core/Portable/Collections/ImmutableArrayExtensions.cs @@ -259,13 +259,23 @@ public static ImmutableArray ToImmutable(this MemoryStream stream) /// /// Creates a new immutable array based on filtered elements by the predicate. The array must not be null. /// - /// /// The array to process /// The delegate that defines the conditions of the element to search for. - /// public static ImmutableArray WhereAsArray(this ImmutableArray array, Func predicate) + => WhereAsArrayImpl(array, predicate, predicateWithArg: null, arg: null); + + /// + /// Creates a new immutable array based on filtered elements by the predicate. The array must not be null. + /// + /// The array to process + /// The delegate that defines the conditions of the element to search for. + public static ImmutableArray WhereAsArray(this ImmutableArray array, Func predicate, TArg arg) + => WhereAsArrayImpl(array, predicateWithoutArg: null, predicate, arg); + + private static ImmutableArray WhereAsArrayImpl(ImmutableArray array, Func? predicateWithoutArg, Func? predicateWithArg, TArg arg) { Debug.Assert(!array.IsDefault); + Debug.Assert(predicateWithArg != null ^ predicateWithoutArg != null); ArrayBuilder? builder = null; bool none = true; @@ -275,7 +285,8 @@ public static ImmutableArray WhereAsArray(this ImmutableArray array, Fu for (int i = 0; i < n; i++) { var a = array[i]; - if (predicate(a)) + + if ((predicateWithoutArg != null) ? predicateWithoutArg(a) : predicateWithArg!(a, arg)) { none = false; if (all) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.vb index 7d9420df012..e3ed0880f28 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamedTypeSymbol.vb @@ -803,7 +803,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE End Function Public Overloads Overrides Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) - Return GetTypeMembers(name).WhereAsArray(Function(type) type.Arity = arity) + Return GetTypeMembers(name).WhereAsArray(Function(type, arity_) type.Arity = arity_, arity) End Function Public Overrides ReadOnly Property Locations As ImmutableArray(Of Location) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamespaceSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamespaceSymbol.vb index 3521473cfe8..7bc12d6b911 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamespaceSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Metadata/PE/PENamespaceSymbol.vb @@ -120,7 +120,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Metadata.PE End Function Public Overloads Overrides Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) - Return GetTypeMembers(name).WhereAsArray(Function(type) type.Arity = arity) + Return GetTypeMembers(name).WhereAsArray(Function(type, arity_) type.Arity = arity_, arity) End Function Public NotOverridable Overrides ReadOnly Property Locations As ImmutableArray(Of Location) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb index abf37a44290..b30611c87ec 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb @@ -112,7 +112,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Public Overridable Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) ' default implementation does a post-filter. We can override this if its a performance burden, but ' experience is that it won't be. - Return GetTypeMembers(name).WhereAsArray(Function(t) t.Arity = arity) + Return GetTypeMembers(name).WhereAsArray(Function(type, arity_) type.Arity = arity_, arity) End Function ' Only the compiler can create new instances. diff --git a/src/Compilers/VisualBasic/Portable/Symbols/ReferenceManager.vb b/src/Compilers/VisualBasic/Portable/Symbols/ReferenceManager.vb index 195f029804e..afb78bb902c 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/ReferenceManager.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/ReferenceManager.vb @@ -227,7 +227,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim assemblySymbol = New PEAssemblySymbol(assembly, DocumentationProvider.Default, isLinked:=False, importOptions:=importOptions) - Dim unifiedAssemblies = Me.UnifiedAssemblies.WhereAsArray(Function(unified) referencedAssembliesByIdentity.Contains(unified.OriginalReference, allowHigherVersion:=False)) + Dim unifiedAssemblies = Me.UnifiedAssemblies.WhereAsArray( + Function(unified, refAsmByIdentity) refAsmByIdentity.Contains(unified.OriginalReference, allowHigherVersion:=False), referencedAssembliesByIdentity) + InitializeAssemblyReuseData(assemblySymbol, peReferences, unifiedAssemblies) If assembly.ContainsNoPiaLocalTypes() Then diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb index cae15ae5124..a91e0147f7a 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Source/SourceMemberContainerTypeSymbol.vb @@ -1649,7 +1649,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End Function Public Overrides Function GetTypeMembers(name As String, arity As Integer) As ImmutableArray(Of NamedTypeSymbol) - Return GetTypeMembers(name).WhereAsArray(Function(t) t.Arity = arity) + Return GetTypeMembers(name).WhereAsArray(Function(t, arity_) t.Arity = arity_, arity) End Function Friend Overrides ReadOnly Property DefaultPropertyName As String diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Tuples/TupleTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Tuples/TupleTypeSymbol.vb index f1bf8a40295..696afefae03 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Tuples/TupleTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Tuples/TupleTypeSymbol.vb @@ -942,7 +942,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols End Function Public Overrides Function GetMembers(name As String) As ImmutableArray(Of Symbol) - Return Me.GetMembers().WhereAsArray(Function(m As Symbol) IdentifierComparison.Equals(m.Name, name)) + Return Me.GetMembers().WhereAsArray(Function(member, name_) IdentifierComparison.Equals(member.Name, name_), name) End Function Public Overrides Function GetTypeMembers() As ImmutableArray(Of NamedTypeSymbol) diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/CapturedVariableRewriter.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/CapturedVariableRewriter.cs index 1193ba8a94e..5afa949a326 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/CapturedVariableRewriter.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Rewriters/CapturedVariableRewriter.cs @@ -43,7 +43,7 @@ internal sealed class CapturedVariableRewriter : BoundTreeRewriterWithStackGuard public override BoundNode VisitBlock(BoundBlock node) { - var rewrittenLocals = node.Locals.WhereAsArray(local => local.IsCompilerGenerated || local.Name == null || this.GetVariable(local.Name) == null); + var rewrittenLocals = node.Locals.WhereAsArray((local, rewriter) => local.IsCompilerGenerated || local.Name == null || rewriter.GetVariable(local.Name) == null, this); var rewrittenLocalFunctions = node.LocalFunctions; var rewrittenStatements = VisitList(node.Statements); return node.Update(rewrittenLocals, rewrittenLocalFunctions, rewrittenStatements); diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.cs index c811de838be..252d65ac0d2 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.cs @@ -172,7 +172,7 @@ public override ImmutableArray GetMembers(string name) // Should not be requesting generated members // by name other than constructors. Debug.Assert((name == WellKnownMemberNames.InstanceConstructorName) || (name == WellKnownMemberNames.StaticConstructorName)); - return this.GetMembers().WhereAsArray(m => m.Name == name); + return this.GetMembers().WhereAsArray((m, name) => m.Name == name, name); } public override ImmutableArray GetTypeMembers() diff --git a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.vb b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.vb index c02bac5b937..6ea726eb669 100644 --- a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.vb +++ b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Symbols/EENamedTypeSymbol.vb @@ -170,7 +170,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator Public Overrides Function GetMembers(name As String) As ImmutableArray(Of Symbol) ' Should not be requesting generated members by name other than constructors. Debug.Assert(name = WellKnownMemberNames.InstanceConstructorName OrElse name = WellKnownMemberNames.StaticConstructorName) - Return GetMembers().WhereAsArray(Function(m) m.Name = name) + Return GetMembers().WhereAsArray(Function(member, name_) member.Name = name_, name) End Function Public Overrides Function GetTypeMembers() As ImmutableArray(Of NamedTypeSymbol) -- GitLab