diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs index e9cede1b4a55e89828051933ed97d4218fd7ecc0..60b142ed0305faca08448cb3f93aa7100ac6c9f7 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Lookup.cs @@ -1240,12 +1240,19 @@ private CSDiagnosticInfo MakeCallMethodsDirectlyDiagnostic(Symbol symbol) /// /// Does not consider - that is left to the caller. /// - internal bool CanAddLookupSymbolInfo(Symbol symbol, LookupOptions options, TypeSymbol accessThroughType) + internal bool CanAddLookupSymbolInfo(Symbol symbol, LookupOptions options, LookupSymbolsInfo info, TypeSymbol accessThroughType, AliasSymbol aliasSymbol = null) { Debug.Assert(symbol.Kind != SymbolKind.Alias, "It is the caller's responsibility to unwrap aliased symbols."); + Debug.Assert(aliasSymbol == null || aliasSymbol.GetAliasTarget(basesBeingResolved: null) == symbol); Debug.Assert(options.AreValid()); HashSet useSiteDiagnostics = null; + var name = aliasSymbol != null ? aliasSymbol.Name : symbol.Name; + if (!info.CanBeAdded(name)) + { + return false; + } + if ((options & LookupOptions.NamespacesOrTypesOnly) != 0 && !(symbol is NamespaceOrTypeSymbol)) { return false; @@ -1559,7 +1566,7 @@ private static void AddMemberLookupSymbolsInfoInNamespace(LookupSymbolsInfo resu { foreach (var symbol in GetCandidateMembers(ns, options, originalBinder)) { - if (originalBinder.CanAddLookupSymbolInfo(symbol, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(symbol, options, result, null)) { result.AddSymbol(symbol, symbol.Name, symbol.GetArity()); } @@ -1570,7 +1577,7 @@ private static void AddMemberLookupSymbolsInfoWithoutInheritance(LookupSymbolsIn { foreach (var symbol in GetCandidateMembers(type, options, originalBinder)) { - if (originalBinder.CanAddLookupSymbolInfo(symbol, options, accessThroughType)) + if (originalBinder.CanAddLookupSymbolInfo(symbol, options, result, accessThroughType)) { result.AddSymbol(symbol, symbol.Name, symbol.GetArity()); } diff --git a/src/Compilers/CSharp/Portable/Binder/Imports.cs b/src/Compilers/CSharp/Portable/Binder/Imports.cs index f618a4ab2ff0364d0abc32979be32e102b0be184..c28c1b2626ed0d09b5b6707bba7c4672228e88b4 100644 --- a/src/Compilers/CSharp/Portable/Binder/Imports.cs +++ b/src/Compilers/CSharp/Portable/Binder/Imports.cs @@ -838,7 +838,7 @@ internal void AddLookupSymbolsInfoInAliases(LookupSymbolsInfo result, LookupOpti private static void AddAliasSymbolToResult(LookupSymbolsInfo result, AliasSymbol aliasSymbol, LookupOptions options, Binder originalBinder) { var targetSymbol = aliasSymbol.GetAliasTarget(basesBeingResolved: null); - if (originalBinder.CanAddLookupSymbolInfo(targetSymbol, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(targetSymbol, options, result, accessThroughType: null, aliasSymbol: aliasSymbol)) { result.AddSymbol(aliasSymbol, aliasSymbol.Name, 0); } @@ -859,7 +859,7 @@ private static void AddAliasSymbolToResult(LookupSymbolsInfo result, AliasSymbol { foreach (var member in namespaceSymbol.NamespaceOrType.GetMembersUnordered()) { - if (IsValidLookupCandidateInUsings(member) && originalBinder.CanAddLookupSymbolInfo(member, options, null)) + if (IsValidLookupCandidateInUsings(member) && originalBinder.CanAddLookupSymbolInfo(member, options, result, null)) { result.AddSymbol(member, member.Name, member.GetArity()); } diff --git a/src/Compilers/CSharp/Portable/Binder/InMethodBinder.cs b/src/Compilers/CSharp/Portable/Binder/InMethodBinder.cs index 65163cc2674174815b6256af3893948d44ee7127..d623a7d5d55b02d3d61694c5ba86938207edd836 100644 --- a/src/Compilers/CSharp/Portable/Binder/InMethodBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/InMethodBinder.cs @@ -224,7 +224,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in _methodSymbol.Parameters) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/LocalScopeBinder.cs b/src/Compilers/CSharp/Portable/Binder/LocalScopeBinder.cs index 8f9ba2efa90a1c3c5aed9679a7dcd8b525672ea9..09af2badc358eb20ab8693678e7f001857973018 100644 --- a/src/Compilers/CSharp/Portable/Binder/LocalScopeBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/LocalScopeBinder.cs @@ -399,7 +399,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var local in this.LocalsMap) { - if (originalBinder.CanAddLookupSymbolInfo(local.Value, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(local.Value, options, result, null)) { result.AddSymbol(local.Value, local.Key, 0); } @@ -409,7 +409,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var local in this.LocalFunctionsMap) { - if (originalBinder.CanAddLookupSymbolInfo(local.Value, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(local.Value, options, result, null)) { result.AddSymbol(local.Value, local.Key, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/WithClassTypeParametersBinder.cs b/src/Compilers/CSharp/Portable/Binder/WithClassTypeParametersBinder.cs index 4dc51f56e438f073d66eadb94ebfcc5535c3d4e3..6e6ffb845d0faa436e19512973079ef0153afa0b 100644 --- a/src/Compilers/CSharp/Portable/Binder/WithClassTypeParametersBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/WithClassTypeParametersBinder.cs @@ -51,7 +51,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in _namedType.TypeParameters) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/WithCrefTypeParametersBinder.cs b/src/Compilers/CSharp/Portable/Binder/WithCrefTypeParametersBinder.cs index 047b097dd5d986fab9ef15476a1f6368081d7355..a2e2343e5704771bcbb641cbc86a35f582a36c56 100644 --- a/src/Compilers/CSharp/Portable/Binder/WithCrefTypeParametersBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/WithCrefTypeParametersBinder.cs @@ -141,7 +141,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res foreach (TypeParameterSymbol typeParameter in kvp.Value) { // In any context where this binder applies, the type parameters are always viable/speakable. - Debug.Assert(originalBinder.CanAddLookupSymbolInfo(typeParameter, options, null)); + Debug.Assert(!result.CanBeAdded(typeParameter.Name) || originalBinder.CanAddLookupSymbolInfo(typeParameter, options, result, null)); result.AddSymbol(typeParameter, kvp.Key, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/WithLambdaParametersBinder.cs b/src/Compilers/CSharp/Portable/Binder/WithLambdaParametersBinder.cs index 657b51f6585bb325aacb23c503fa101cd3f14406..791fa0f9c8475d5d9ee50e4a554451a51e3c3c83 100644 --- a/src/Compilers/CSharp/Portable/Binder/WithLambdaParametersBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/WithLambdaParametersBinder.cs @@ -100,7 +100,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in lambdaSymbol.Parameters) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/WithMethodTypeParametersBinder.cs b/src/Compilers/CSharp/Portable/Binder/WithMethodTypeParametersBinder.cs index e27701c5935f02dbceb062aa780b07dec8aaff66..279522d8a17c200b386a206c60331937e5e876cb 100644 --- a/src/Compilers/CSharp/Portable/Binder/WithMethodTypeParametersBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/WithMethodTypeParametersBinder.cs @@ -61,7 +61,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in _methodSymbol.TypeParameters) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/Compilers/CSharp/Portable/Binder/WithParametersBinder.cs b/src/Compilers/CSharp/Portable/Binder/WithParametersBinder.cs index 7729d7d57a6ec9fce8cf97d78373a2beaad86f8f..adacebbddbf1b455f5692cba034d17a456575d36 100644 --- a/src/Compilers/CSharp/Portable/Binder/WithParametersBinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/WithParametersBinder.cs @@ -29,7 +29,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in _parameters) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs index d634bd24e49cdc58ab9895d39905706d7a883740..f6d114daaffc2cfbbd5d0ee5c602865f20ae0f86 100644 --- a/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/CSharpSemanticModel.cs @@ -1510,6 +1510,7 @@ private void CheckModelAndSyntaxNodeToSpeculate(CSharpSyntaxNode syntax) } var info = LookupSymbolsInfo.GetInstance(); + info.FilterName = name; if ((object)container == null) { diff --git a/src/Compilers/Core/Portable/Binding/AbstractLookupSymbolsInfo.cs b/src/Compilers/Core/Portable/Binding/AbstractLookupSymbolsInfo.cs index cea3e086efe6989f4fa221a962d27f9cbf594e86..59dedf2f108e88cbdacc381d83a77dee6e4711a7 100644 --- a/src/Compilers/Core/Portable/Binding/AbstractLookupSymbolsInfo.cs +++ b/src/Compilers/Core/Portable/Binding/AbstractLookupSymbolsInfo.cs @@ -222,13 +222,18 @@ public int Count #endif } + private readonly IEqualityComparer _comparer; private readonly Dictionary _nameMap; + internal string FilterName { private get; set; } protected AbstractLookupSymbolsInfo(IEqualityComparer comparer) { + _comparer = comparer; _nameMap = new Dictionary(comparer); } + public bool CanBeAdded(string name) => FilterName == null || _comparer.Equals(name, FilterName); + public void AddSymbol(TSymbol symbol, string name, int arity) { UniqueSymbolOrArities pair; @@ -273,6 +278,8 @@ public void AddSymbol(TSymbol symbol, string name, int arity) out IArityEnumerable arities, out TSymbol uniqueSymbol) { + Debug.Assert(CanBeAdded(name)); + UniqueSymbolOrArities pair; if (!_nameMap.TryGetValue(name, out pair)) { @@ -287,6 +294,10 @@ public void AddSymbol(TSymbol symbol, string name, int arity) return true; } - public void Clear() => _nameMap.Clear(); + public void Clear() + { + _nameMap.Clear(); + FilterName = null; + } } } diff --git a/src/Compilers/VisualBasic/Portable/Binding/Binder_Lookup.vb b/src/Compilers/VisualBasic/Portable/Binding/Binder_Lookup.vb index ffce0cae9a64108e5fe84ea9502f84747af31f1f..44f0dffc273f20ee20cdeb29a7c9a4e9d8dc22a1 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/Binder_Lookup.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/Binder_Lookup.vb @@ -274,11 +274,17 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ''' Friend Function CanAddLookupSymbolInfo(sym As Symbol, options As LookupOptions, + nameSet As LookupSymbolsInfo, accessThroughType As TypeSymbol) As Boolean + Debug.Assert(sym IsNot Nothing) + + If Not nameSet.CanBeAdded(sym.Name) Then + Return False + End If + Dim singleResult = CheckViability(sym, -1, options, accessThroughType, useSiteDiagnostics:=Nothing) - If sym IsNot Nothing AndAlso - (options And LookupOptions.MethodsOnly) <> 0 AndAlso + If (options And LookupOptions.MethodsOnly) <> 0 AndAlso sym.Kind <> SymbolKind.Method Then Return False End If @@ -524,7 +530,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' Add names from the namespace For Each sym In container.GetMembersUnordered() ' UNDONE: filter by options - If binder.CanAddLookupSymbolInfo(sym, options, Nothing) Then + If binder.CanAddLookupSymbolInfo(sym, options, nameSet, Nothing) Then nameSet.AddSymbol(sym, sym.Name, sym.GetArity()) End If Next @@ -2081,7 +2087,7 @@ ExitForFor: ' validate them. If TypeOf container Is NamedTypeSymbol Then For Each sym In container.GetTypeMembersUnordered() - If binder.CanAddLookupSymbolInfo(sym, options, accessThroughType) Then + If binder.CanAddLookupSymbolInfo(sym, options, nameSet, accessThroughType) Then nameSet.AddSymbol(sym, sym.Name, sym.Arity) End If Next @@ -2089,7 +2095,7 @@ ExitForFor: ElseIf (options And LookupOptions.LabelsOnly) = 0 Then ' Go through each member of the type. For Each sym In container.GetMembersUnordered() - If binder.CanAddLookupSymbolInfo(sym, options, accessThroughType) Then + If binder.CanAddLookupSymbolInfo(sym, options, nameSet, accessThroughType) Then nameSet.AddSymbol(sym, sym.Name, sym.GetArity()) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/BlockBaseBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/BlockBaseBinder.vb index 4272e1a31d903c7ed8cf414a2a3355749c6f82aa..10b1437f7d5d55ac05df5bfda8f0c44a3f6cdd8e 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/BlockBaseBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/BlockBaseBinder.vb @@ -89,7 +89,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic Dim locals = Me.Locals If Not locals.IsEmpty AndAlso (options And (LookupOptions.NamespacesOrTypesOnly Or LookupOptions.LabelsOnly)) = 0 Then For Each localSymbol In locals - If originalBinder.CanAddLookupSymbolInfo(localSymbol, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(localSymbol, options, nameSet, Nothing) Then nameSet.AddSymbol(localSymbol, localSymbol.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentCrefBinder_TypeParameters.vb b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentCrefBinder_TypeParameters.vb index cbf55653f9887a34cdd2caffa05d4d330c3baae0..18e69775732f07437eb60489f5e9326ab6aed6d2 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentCrefBinder_TypeParameters.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentCrefBinder_TypeParameters.vb @@ -43,7 +43,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic originalBinder As Binder) For Each typeParameter In _typeParameters.Values - If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, nameSet, Nothing) Then nameSet.AddSymbol(typeParameter, typeParameter.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentParamBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentParamBinder.vb index 1cf47d25aff088f9e07efb681eadb694f45572a8..028d81dac30ad02ff0aeb7b45c1e009af3e24eab 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentParamBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentParamBinder.vb @@ -78,7 +78,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic End If For Each parameter In Me.Parameters - If originalBinder.CanAddLookupSymbolInfo(parameter, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(parameter, options, nameSet, Nothing) Then nameSet.AddSymbol(parameter, parameter.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentTypeParamBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentTypeParamBinder.vb index 4e53b0b5090f9c9d981d541c8c747df230784374..37cfb883c57204f7b3bd7b924b813ff26b2d978f 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentTypeParamBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/DocumentationCommentTypeParamBinder.vb @@ -60,7 +60,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic If Not typeParameters.IsEmpty Then For Each typeParameter In typeParameters - If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, nameSet, Nothing) Then nameSet.AddSymbol(typeParameter, typeParameter.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/ImplicitVariableBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/ImplicitVariableBinder.vb index cb08fe896ea8108b167f67105543919adb187ef5..4a5caf29c8c0c6b5511e5ac9c43795454135ca3f 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/ImplicitVariableBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/ImplicitVariableBinder.vb @@ -231,7 +231,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic (options And (LookupOptions.NamespacesOrTypesOnly Or LookupOptions.LabelsOnly)) = 0 Then For Each localSymbol In _implicitLocals.Values - If originalBinder.CanAddLookupSymbolInfo(localSymbol, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(localSymbol, options, nameSet, Nothing) Then nameSet.AddSymbol(localSymbol, localSymbol.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/MethodTypeParametersBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/MethodTypeParametersBinder.vb index f87f9bb59119fdba12d0c220d3445a0c7617767c..d5444cf413394a5de51e7a932df774361db9ea1d 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/MethodTypeParametersBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/MethodTypeParametersBinder.vb @@ -57,7 +57,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic originalBinder As Binder) ' UNDONE: check options to see if type parameters should be found. For Each typeParameter In _typeParameters - If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(typeParameter, options, nameSet, Nothing) Then nameSet.AddSymbol(typeParameter, typeParameter.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/NamedTypeBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/NamedTypeBinder.vb index 2e19a1217ae3eec0424b34d0d4295752d0c79475..46cb23473b7ba5b69c153064338954df6e77bc7e 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/NamedTypeBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/NamedTypeBinder.vb @@ -113,7 +113,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' UNDONE: filter using options. If _typeSymbol.Arity > 0 Then For Each tp In _typeSymbol.TypeParameters - If originalBinder.CanAddLookupSymbolInfo(tp, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(tp, options, nameSet, Nothing) Then nameSet.AddSymbol(tp, tp.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Binding/SubOrFunctionBodyBinder.vb b/src/Compilers/VisualBasic/Portable/Binding/SubOrFunctionBodyBinder.vb index 5d8f86e48f54bf57e5700fba9e90d9f818530eec..99e1e45aedbebde903bf7f9a4c32d9a6a65fe09a 100644 --- a/src/Compilers/VisualBasic/Portable/Binding/SubOrFunctionBodyBinder.vb +++ b/src/Compilers/VisualBasic/Portable/Binding/SubOrFunctionBodyBinder.vb @@ -75,7 +75,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ' UNDONE: additional filtering based on options? If (options And (LookupOptions.NamespacesOrTypesOnly Or LookupOptions.LabelsOnly)) = 0 Then For Each param In _parameterMap.Values - If originalBinder.CanAddLookupSymbolInfo(param, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(param, options, nameSet, Nothing) Then nameSet.AddSymbol(param, param.Name, 0) End If Next diff --git a/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb b/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb index 7cfcb5ae1d16de35c3fa09ec2423579b3d06f106..f9454ad56964d0c2dd118680f5bc90effbf6aaf8 100644 --- a/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb +++ b/src/Compilers/VisualBasic/Portable/Compilation/SemanticModel.vb @@ -1890,6 +1890,8 @@ _Default: Else ' They provided a name. Find all the arities for that name, and then look all of those up. Dim info = LookupSymbolsInfo.GetInstance() + info.FilterName = name + Me.AddLookupSymbolsInfo(position, info, container, options) Dim results = ArrayBuilder(Of Symbol).GetInstance(info.Count) diff --git a/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb index bdcea2ffa3d3914ba5dda4e857f8a6f37723eb90..a9d096f4181bddb0333088168bfd0a77941dfb8b 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/NamespaceOrTypeSymbol.vb @@ -215,7 +215,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols If method.MayBeReducibleExtensionMethod Then haveSeenExtensionMethod = True - If AddExtensionMethodLookupSymbolsInfoViabilityCheck(method, options, originalBinder) Then + If AddExtensionMethodLookupSymbolsInfoViabilityCheck(method, options, nameSet, originalBinder) Then nameSet.AddSymbol(member, member.Name, member.GetArity()) ' Move to the next name. @@ -239,9 +239,10 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Friend Overridable Function AddExtensionMethodLookupSymbolsInfoViabilityCheck( method As MethodSymbol, options As LookupOptions, + nameSet As LookupSymbolsInfo, originalBinder As Binder ) As Boolean - Return originalBinder.CanAddLookupSymbolInfo(method, options, accessThroughType:=method.ContainingType) + Return originalBinder.CanAddLookupSymbolInfo(method, options, nameSet, accessThroughType:=method.ContainingType) End Function ''' diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamedTypeSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamedTypeSymbol.vb index 4aacd55f7896e2f29ca5cd6101314048b0ee04e3..4dcc0c53cf406a55ddcfe70e95011dd5ce722df6 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamedTypeSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamedTypeSymbol.vb @@ -214,8 +214,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting ''' ''' Make sure we retarget methods when underlying type checks their viability. ''' - Friend Overrides Function AddExtensionMethodLookupSymbolsInfoViabilityCheck(method As MethodSymbol, options As LookupOptions, originalBinder As Binder) As Boolean - Return MyBase.AddExtensionMethodLookupSymbolsInfoViabilityCheck(RetargetingTranslator.Retarget(method), options, originalBinder) + Friend Overrides Function AddExtensionMethodLookupSymbolsInfoViabilityCheck(method As MethodSymbol, options As LookupOptions, nameSet As LookupSymbolsInfo, originalBinder As Binder) As Boolean + Return MyBase.AddExtensionMethodLookupSymbolsInfoViabilityCheck(RetargetingTranslator.Retarget(method), options, nameSet, originalBinder) End Function Friend Overrides Sub AddExtensionMethodLookupSymbolsInfo(nameSet As LookupSymbolsInfo, diff --git a/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamespaceSymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamespaceSymbol.vb index ea51d3cec0492330c186260749fadcf931e5d420..a8b092b4690f5aeeee8d92f6c07ec374a88a8b7e 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamespaceSymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/Retargeting/RetargetingNamespaceSymbol.vb @@ -270,8 +270,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols.Retargeting ''' ''' Make sure we retarget methods when underlying namespace checks their viability. ''' - Friend Overrides Function AddExtensionMethodLookupSymbolsInfoViabilityCheck(method As MethodSymbol, options As LookupOptions, originalBinder As Binder) As Boolean - Return MyBase.AddExtensionMethodLookupSymbolsInfoViabilityCheck(RetargetingTranslator.Retarget(method), options, originalBinder) + Friend Overrides Function AddExtensionMethodLookupSymbolsInfoViabilityCheck(method As MethodSymbol, options As LookupOptions, nameSet As LookupSymbolsInfo, originalBinder As Binder) As Boolean + Return MyBase.AddExtensionMethodLookupSymbolsInfoViabilityCheck(RetargetingTranslator.Retarget(method), options, nameSet, originalBinder) End Function Friend Overrides Sub AddExtensionMethodLookupSymbolsInfo(nameSet As LookupSymbolsInfo, diff --git a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Binders/WithTypeArgumentsBinder.cs b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Binders/WithTypeArgumentsBinder.cs index 6a7eb4ee5f87ad5357ed63c687b5f1fe8fb242d6..ca4239d3795b5511bd1f762ab138c91d77c323f5 100644 --- a/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Binders/WithTypeArgumentsBinder.cs +++ b/src/ExpressionEvaluator/CSharp/Source/ExpressionCompiler/Binders/WithTypeArgumentsBinder.cs @@ -45,7 +45,7 @@ protected override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo res { foreach (var parameter in _typeArguments) { - if (originalBinder.CanAddLookupSymbolInfo(parameter, options, null)) + if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } diff --git a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Binders/ParametersAndLocalsBinder.vb b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Binders/ParametersAndLocalsBinder.vb index 92a94ebe30ab6f26e04b8690b047c7634a541338..63c9b38f8e2f53200fe878de7c2ae33076de6529 100644 --- a/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Binders/ParametersAndLocalsBinder.vb +++ b/src/ExpressionEvaluator/VisualBasic/Source/ExpressionCompiler/Binders/ParametersAndLocalsBinder.vb @@ -91,7 +91,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator ' UNDONE: additional filtering based on options? If (options And (LookupOptions.NamespacesOrTypesOnly Or LookupOptions.LabelsOnly Or LookupOptions.MustNotBeLocalOrParameter)) = 0 Then For Each symbol In _nameToSymbolMap.Values - If originalBinder.CanAddLookupSymbolInfo(symbol, options, Nothing) Then + If originalBinder.CanAddLookupSymbolInfo(symbol, options, nameSet, Nothing) Then nameSet.AddSymbol(symbol, symbol.Name, 0) End If Next