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

Add VB impl.

上级 c4e637b2
...@@ -2724,7 +2724,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2724,7 +2724,19 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Throw New ArgumentException(VBResources.NoNoneSearchCriteria, NameOf(filter)) Throw New ArgumentException(VBResources.NoNoneSearchCriteria, NameOf(filter))
End If 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 End Function
Friend Overrides Function IsUnreferencedAssemblyIdentityDiagnosticCode(code As Integer) As Boolean Friend Overrides Function IsUnreferencedAssemblyIdentityDiagnosticCode(code As Integer) As Boolean
...@@ -2740,34 +2752,50 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2740,34 +2752,50 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
#End Region #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 _cache As Dictionary(Of Declaration, NamespaceOrTypeSymbol)
Private ReadOnly _compilation As VisualBasicCompilation 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) _includeNamespace = (filter And SymbolFilter.Namespace) = SymbolFilter.Namespace
Me._cache = New Dictionary(Of Declaration, NamespaceOrTypeSymbol)() _includeType = (filter And SymbolFilter.Type) = SymbolFilter.Type
Me._compilation = compilation _includeMember = (filter And SymbolFilter.Member) = SymbolFilter.Member
_cancellationToken = cancellationToken
End Sub 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 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 Return result
End Function End Function
Private Sub AppendSymbolsWithName( 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) spine As ArrayBuilder(Of MergedNamespaceOrTypeDeclaration), current As MergedNamespaceOrTypeDeclaration, [set] As HashSet(Of ISymbol))
Dim includeNamespace = (filter And SymbolFilter.Namespace) = SymbolFilter.Namespace
Dim includeType = (filter And SymbolFilter.Type) = SymbolFilter.Type
Dim includeMember = (filter And SymbolFilter.Member) = SymbolFilter.Member
If current.Kind = DeclarationKind.Namespace Then 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 container = GetSpineSymbol(spine)
Dim symbol = GetSymbol(container, current) Dim symbol = GetSymbol(container, current)
If symbol IsNot Nothing Then If symbol IsNot Nothing Then
...@@ -2775,7 +2803,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2775,7 +2803,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If End If
End If End If
Else Else
If includeType AndAlso predicate(current.Name) Then If _includeType AndAlso Matches(current.Name) Then
Dim container = GetSpineSymbol(spine) Dim container = GetSpineSymbol(spine)
Dim symbol = GetSymbol(container, current) Dim symbol = GetSymbol(container, current)
If symbol IsNot Nothing Then If symbol IsNot Nothing Then
...@@ -2783,20 +2811,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2783,20 +2811,21 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End If End If
End If End If
If includeMember Then If _includeMember Then
AppendMemberSymbolsWithName(spine, current, predicate, [set], cancellationToken) Dim typeDeclaration = DirectCast(current, MergedTypeDeclaration)
If ShouldCheckTypeForMembers(typeDeclaration) Then
AppendMemberSymbolsWithName(spine, typeDeclaration, [set])
End If
End If End If
End If End If
spine.Add(current) spine.Add(current)
For Each child In current.Children.OfType(Of MergedNamespaceOrTypeDeclaration)() For Each child In current.Children
If includeMember OrElse includeType Then Dim mergedNamespaceOrType = TryCast(child, MergedNamespaceOrTypeDeclaration)
AppendSymbolsWithName(spine, child, predicate, filter, [set], cancellationToken) If mergedNamespaceOrType IsNot Nothing Then
Continue For If _includeMember OrElse _includeType OrElse child.Kind = DeclarationKind.Namespace Then
End If AppendSymbolsWithName(spine, mergedNamespaceOrType, [set])
End If
If child.Kind = DeclarationKind.Namespace Then
AppendSymbolsWithName(spine, child, predicate, filter, [set], cancellationToken)
End If End If
Next Next
...@@ -2804,14 +2833,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2804,14 +2833,14 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
End Sub End Sub
Private Sub AppendMemberSymbolsWithName( 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) spine.Add(current)
Dim container As NamespaceOrTypeSymbol = Nothing Dim container As NamespaceOrTypeSymbol = Nothing
Dim mergedType = DirectCast(current, MergedTypeDeclaration) Dim mergedType = DirectCast(current, MergedTypeDeclaration)
For Each name In mergedType.MemberNames For Each name In mergedType.MemberNames
If predicate(name) Then If Matches(name) Then
container = If(container, GetSpineSymbol(spine)) container = If(container, GetSpineSymbol(spine))
If container IsNot Nothing Then If container IsNot Nothing Then
[set].UnionWith(container.GetMembers(name)) [set].UnionWith(container.GetMembers(name))
...@@ -2822,7 +2851,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2822,7 +2851,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
spine.RemoveAt(spine.Count - 1) spine.RemoveAt(spine.Count - 1)
End Sub 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 If spine.Count = 0 Then
Return Nothing Return Nothing
End If End If
...@@ -2889,5 +2918,53 @@ Namespace Microsoft.CodeAnalysis.VisualBasic ...@@ -2889,5 +2918,53 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Next Next
End Sub End Sub
End Class 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 Class
End Namespace End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册