提交 def0e3aa 编写于 作者: C Cyrus Najmabadi

Add VB impl.

上级 c4e637b2
......@@ -2724,7 +2724,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Throw New ArgumentException(VBResources.NoNoneSearchCriteria, NameOf(filter))
End If
Return New SymbolSearcher(Me).GetSymbolsWithName(predicate, filter, cancellationToken)
Return New PredicateSymbolSearcher(Me, filter, predicate, cancellationToken).GetSymbolsWithName()
End Function
Friend Overrides Function GetSymbolsWithName(name As String, Optional filter As SymbolFilter = SymbolFilter.TypeAndMember, Optional cancellationToken As CancellationToken = Nothing) As IEnumerable(Of ISymbol)
If name Is Nothing Then
Throw New ArgumentNullException(NameOf(name))
End If
If filter = SymbolFilter.None Then
Throw New ArgumentException(VBResources.NoNoneSearchCriteria, NameOf(filter))
End If
Return New NameSymbolSearcher(Me, filter, name, cancellationToken).GetSymbolsWithName()
End Function
Friend Overrides Function IsUnreferencedAssemblyIdentityDiagnosticCode(code As Integer) As Boolean
......@@ -2740,34 +2752,50 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
#End Region
Private Class SymbolSearcher
Private MustInherit Class AbstractSymbolSearcher
Private Shared ReadOnly s_cachePool As New ObjectPool(Of Dictionary(Of Declaration, NamespaceOrTypeSymbol))(
Function() New Dictionary(Of Declaration, NamespaceOrTypeSymbol)())
Private ReadOnly _cache As Dictionary(Of Declaration, NamespaceOrTypeSymbol)
Private ReadOnly _compilation As VisualBasicCompilation
Private ReadOnly _includeNamespace As Boolean
Private ReadOnly _includeType As Boolean
Private ReadOnly _includeMember As Boolean
Private ReadOnly _cancellationToken As CancellationToken
Public Sub New(compilation As VisualBasicCompilation, filter As SymbolFilter, cancellationToken As CancellationToken)
_cache = s_cachePool.Allocate()
_compilation = compilation
Public Sub New(compilation As VisualBasicCompilation)
Me._cache = New Dictionary(Of Declaration, NamespaceOrTypeSymbol)()
Me._compilation = compilation
_includeNamespace = (filter And SymbolFilter.Namespace) = SymbolFilter.Namespace
_includeType = (filter And SymbolFilter.Type) = SymbolFilter.Type
_includeMember = (filter And SymbolFilter.Member) = SymbolFilter.Member
_cancellationToken = cancellationToken
End Sub
Public Function GetSymbolsWithName(predicate As Func(Of String, Boolean), filter As SymbolFilter, cancellationToken As CancellationToken) As IEnumerable(Of ISymbol)
Protected MustOverride Function Matches(name As String) As Boolean
Protected MustOverride Function ShouldCheckTypeForMembers(typeDeclaration As MergedTypeDeclaration) As Boolean
Public Function GetSymbolsWithName() As IEnumerable(Of ISymbol)
Dim result = New HashSet(Of ISymbol)()
Dim spine = New List(Of MergedNamespaceOrTypeDeclaration)()
Dim spine = ArrayBuilder(Of MergedNamespaceOrTypeDeclaration).GetInstance()
AppendSymbolsWithName(spine, _compilation.MergedRootDeclaration, predicate, filter, result, cancellationToken)
AppendSymbolsWithName(spine, _compilation.MergedRootDeclaration, result)
spine.Clear()
_cache.Clear()
s_cachePool.Free(_cache)
Return result
End Function
Private Sub AppendSymbolsWithName(
spine As List(Of MergedNamespaceOrTypeDeclaration), current As MergedNamespaceOrTypeDeclaration, predicate As Func(Of String, Boolean), filter As SymbolFilter, [set] As HashSet(Of ISymbol), cancellationToken As CancellationToken)
Dim includeNamespace = (filter And SymbolFilter.Namespace) = SymbolFilter.Namespace
Dim includeType = (filter And SymbolFilter.Type) = SymbolFilter.Type
Dim includeMember = (filter And SymbolFilter.Member) = SymbolFilter.Member
spine As ArrayBuilder(Of MergedNamespaceOrTypeDeclaration), current As MergedNamespaceOrTypeDeclaration, [set] As HashSet(Of ISymbol))
If current.Kind = DeclarationKind.Namespace Then
If includeNamespace AndAlso predicate(current.Name) Then
If _includeNamespace AndAlso Matches(current.Name) Then
Dim container = GetSpineSymbol(spine)
Dim symbol = GetSymbol(container, current)
If symbol IsNot Nothing Then
......@@ -2775,7 +2803,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If
End If
Else
If includeType AndAlso predicate(current.Name) Then
If _includeType AndAlso Matches(current.Name) Then
Dim container = GetSpineSymbol(spine)
Dim symbol = GetSymbol(container, current)
If symbol IsNot Nothing Then
......@@ -2783,20 +2811,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If
End If
If includeMember Then
AppendMemberSymbolsWithName(spine, current, predicate, [set], cancellationToken)
If _includeMember Then
Dim typeDeclaration = DirectCast(current, MergedTypeDeclaration)
If ShouldCheckTypeForMembers(typeDeclaration) Then
AppendMemberSymbolsWithName(spine, typeDeclaration, [set])
End If
End If
End If
spine.Add(current)
For Each child In current.Children.OfType(Of MergedNamespaceOrTypeDeclaration)()
If includeMember OrElse includeType Then
AppendSymbolsWithName(spine, child, predicate, filter, [set], cancellationToken)
Continue For
End If
If child.Kind = DeclarationKind.Namespace Then
AppendSymbolsWithName(spine, child, predicate, filter, [set], cancellationToken)
For Each child In current.Children
Dim mergedNamespaceOrType = TryCast(child, MergedNamespaceOrTypeDeclaration)
If mergedNamespaceOrType IsNot Nothing Then
If _includeMember OrElse _includeType OrElse child.Kind = DeclarationKind.Namespace Then
AppendSymbolsWithName(spine, mergedNamespaceOrType, [set])
End If
End If
Next
......@@ -2804,14 +2833,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Sub
Private Sub AppendMemberSymbolsWithName(
spine As List(Of MergedNamespaceOrTypeDeclaration), current As MergedNamespaceOrTypeDeclaration, predicate As Func(Of String, Boolean), [set] As HashSet(Of ISymbol), cancellationToken As CancellationToken)
spine As ArrayBuilder(Of MergedNamespaceOrTypeDeclaration), current As MergedNamespaceOrTypeDeclaration, [set] As HashSet(Of ISymbol))
spine.Add(current)
Dim container As NamespaceOrTypeSymbol = Nothing
Dim mergedType = DirectCast(current, MergedTypeDeclaration)
For Each name In mergedType.MemberNames
If predicate(name) Then
If Matches(name) Then
container = If(container, GetSpineSymbol(spine))
If container IsNot Nothing Then
[set].UnionWith(container.GetMembers(name))
......@@ -2822,7 +2851,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
spine.RemoveAt(spine.Count - 1)
End Sub
Private Function GetSpineSymbol(spine As List(Of MergedNamespaceOrTypeDeclaration)) As NamespaceOrTypeSymbol
Private Function GetSpineSymbol(spine As ArrayBuilder(Of MergedNamespaceOrTypeDeclaration)) As NamespaceOrTypeSymbol
If spine.Count = 0 Then
Return Nothing
End If
......@@ -2889,5 +2918,53 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Next
End Sub
End Class
Private Class PredicateSymbolSearcher
Inherits AbstractSymbolSearcher
Private ReadOnly _predicate As Func(Of String, Boolean)
Public Sub New(
compilation As VisualBasicCompilation, filter As SymbolFilter, predicate As Func(Of String, Boolean), cancellationToken As CancellationToken)
MyBase.New(compilation, filter, cancellationToken)
_predicate = predicate
End Sub
Protected Overrides Function ShouldCheckTypeForMembers(current As MergedTypeDeclaration) As Boolean
Return True
End Function
Protected Overrides Function Matches(name As String) As Boolean
Return _predicate(name)
End Function
End Class
Private Class NameSymbolSearcher
Inherits AbstractSymbolSearcher
Private ReadOnly _name As String
Public Sub New(
compilation As VisualBasicCompilation, filter As SymbolFilter, name As String, cancellationToken As CancellationToken)
MyBase.New(compilation, filter, cancellationToken)
_name = name
End Sub
Protected Overrides Function ShouldCheckTypeForMembers(current As MergedTypeDeclaration) As Boolean
For Each typeDecl In current.Declarations
If typeDecl.MemberNames.Contains(_name) Then
Return True
End If
Next
Return False
End Function
Protected Overrides Function Matches(name As String) As Boolean
Return IdentifierComparison.Equals(_name, name)
End Function
End Class
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册