| File: Binding\TypesOfImportedNamespacesMembersBinder.vb | Web Access |
| Project: src\roslyn\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic) |
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports System.Collections.Concurrent Imports System.Collections.Generic Imports System.Collections.Immutable Imports System.Runtime.InteropServices Imports System.Threading Imports Microsoft.CodeAnalysis.PooledObjects Imports Microsoft.CodeAnalysis.RuntimeMembers Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Roslyn.Utilities Imports TypeKind = Microsoft.CodeAnalysis.TypeKind Namespace Microsoft.CodeAnalysis.VisualBasic ''' <summary> ''' Provides lookup in types of imported namespaces, either at file level or project level. ''' </summary> Friend Class TypesOfImportedNamespacesMembersBinder Inherits Binder Private ReadOnly _importedSymbols As ImmutableArray(Of NamespaceOrTypeAndImportsClausePosition) Public Sub New(containingBinder As Binder, importedSymbols As ImmutableArray(Of NamespaceOrTypeAndImportsClausePosition)) MyBase.New(containingBinder) _importedSymbols = importedSymbols End Sub Friend Overrides Sub LookupInSingleBinder(lookupResult As LookupResult, name As String, arity As Integer, options As LookupOptions, originalBinder As Binder, <[In], Out> ByRef useSiteInfo As CompoundUseSiteInfo(Of AssemblySymbol)) Debug.Assert(lookupResult.IsClear) ' Lookup in modules of imported namespaces. For Each importedSym In _importedSymbols If importedSym.NamespaceOrType.IsNamespace Then Dim currentResult = LookupResult.GetInstance() originalBinder.LookupMemberInModules(currentResult, DirectCast(importedSym.NamespaceOrType, NamespaceSymbol), name, arity, options, useSiteInfo) If currentResult.IsGood AndAlso Not originalBinder.IsSemanticModelBinder Then Me.Compilation.MarkImportDirectiveAsUsed(Me.SyntaxTree, importedSym.ImportsClausePosition) End If lookupResult.MergeAmbiguous(currentResult, ImportedTypesAndNamespacesMembersBinder.GenerateAmbiguityError) currentResult.Free() End If Next End Sub Public Function GetImportChainData() As ImmutableArray(Of ImportedNamespaceOrType) Return _importedSymbols.SelectAsArray(Function(n) New ImportedNamespaceOrType(n.NamespaceOrType, n.SyntaxReference)) End Function ''' <summary> ''' Collect extension methods with the given name that are in scope in this binder. ''' The passed in ArrayBuilder must be empty. Extension methods from the same containing type ''' must be grouped together. ''' </summary> Protected Overrides Sub CollectProbableExtensionMethodsInSingleBinder(name As String, methods As ArrayBuilder(Of MethodSymbol), originalBinder As Binder) Debug.Assert(methods.Count = 0) For Each importedSym In _importedSymbols If importedSym.NamespaceOrType.IsNamespace Then Dim count = methods.Count DirectCast(importedSym.NamespaceOrType, NamespaceSymbol).AppendProbableExtensionMethods(name, methods) If methods.Count <> count AndAlso Not originalBinder.IsSemanticModelBinder Then Me.Compilation.MarkImportDirectiveAsUsed(Me.SyntaxTree, importedSym.ImportsClausePosition) End If End If Next End Sub Protected Overrides Sub AddExtensionMethodLookupSymbolsInfoInSingleBinder(nameSet As LookupSymbolsInfo, options As LookupOptions, originalBinder As Binder) For Each importedSym In _importedSymbols If importedSym.NamespaceOrType.IsNamespace Then DirectCast(importedSym.NamespaceOrType, NamespaceSymbol).AddExtensionMethodLookupSymbolsInfo(nameSet, options, originalBinder) End If Next End Sub Friend Overrides Sub AddLookupSymbolsInfoInSingleBinder(nameSet As LookupSymbolsInfo, options As LookupOptions, originalBinder As Binder) options = options Or LookupOptions.IgnoreExtensionMethods For Each importedSym In _importedSymbols If importedSym.NamespaceOrType.IsNamespace Then For Each containedModule As NamedTypeSymbol In DirectCast(importedSym.NamespaceOrType, NamespaceSymbol).GetModuleMembers() originalBinder.AddMemberLookupSymbolsInfo(nameSet, containedModule, options) Next End If Next End Sub End Class End Namespace