| File: Completion\CompletionProviders\SymbolCompletionProvider.vb | Web Access |
| Project: src\roslyn\src\Features\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.Features.vbproj (Microsoft.CodeAnalysis.VisualBasic.Features) |
' 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.Immutable Imports System.Composition Imports System.Threading Imports Microsoft.CodeAnalysis.Completion Imports Microsoft.CodeAnalysis.Completion.Providers Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Extensions.ContextQuery Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.Completion.Providers <ExportCompletionProvider(NameOf(SymbolCompletionProvider), LanguageNames.VisualBasic)> <ExtensionOrder(After:=NameOf(AwaitCompletionProvider))> <[Shared]> Friend NotInheritable Class SymbolCompletionProvider Inherits AbstractRecommendationServiceBasedCompletionProvider(Of VisualBasicSyntaxContext) Private Shared ReadOnly s_cachedRules As New Dictionary(Of (importDirective As Boolean, preselect As Boolean, tuple As Boolean), CompletionItemRules) Shared Sub New() For importDirective = 0 To 1 For preselect = 0 To 1 For tuple = 0 To 1 Dim context = (importDirective:=importDirective = 1, preselect:=preselect = 1, tuple:=tuple = 1) s_cachedRules(context) = MakeRule(context) Next Next Next End Sub Private Shared Function MakeRule(context As (importDirective As Boolean, preselect As Boolean, tuple As Boolean)) As CompletionItemRules ' '(' should not filter the completion list, even though it's in generic items like IList(Of...) Dim generalBaseline = CompletionItemRules.Default. WithFilterCharacterRule(CharacterSetModificationRule.Create(CharacterSetModificationKind.Remove, "("c)). WithCommitCharacterRule(CharacterSetModificationRule.Create(CharacterSetModificationKind.Add, "("c)) Dim importDirectBasline = CompletionItemRules.Create( commitCharacterRules:=ImmutableArray.Create(CharacterSetModificationRule.Create(CharacterSetModificationKind.Replace, "."c))) Dim rule = If(context.importDirective, importDirectBasline, generalBaseline) If context.preselect Then rule = rule.WithSelectionBehavior(CompletionItemSelectionBehavior.SoftSelection) End If If context.tuple Then rule = rule.WithCommitCharacterRule(CharacterSetModificationRule.Create(CharacterSetModificationKind.Remove, ":"c)) End If Return rule End Function <ImportingConstructor> <Obsolete(MefConstruction.ImportingConstructorMessage, True)> Public Sub New() End Sub Friend Overrides ReadOnly Property Language As String Get Return LanguageNames.VisualBasic End Get End Property Protected Overrides ReadOnly Property PreselectedItemSelectionBehavior As CompletionItemSelectionBehavior = CompletionItemSelectionBehavior.SoftSelection Protected Overrides Function ShouldPreselectInferredTypesAsync(completionContext As CompletionContext, position As Integer, options As CompletionOptions, cancellationToken As CancellationToken) As Task(Of Boolean) Return SpecializedTasks.True End Function Protected Overrides Function ShouldProvideAvailableSymbolsInCurrentContextAsync(completionContext As CompletionContext, syntaxContext As VisualBasicSyntaxContext, position As Integer, options As CompletionOptions, cancellationToken As CancellationToken) As Task(Of Boolean) Return SpecializedTasks.True End Function Protected Overrides Function GetInsertionText(item As CompletionItem, ch As Char) As String Return GetInsertionTextAtInsertionTime(item, ch) End Function Public Overrides Function IsInsertionTrigger(text As SourceText, characterPosition As Integer, options As CompletionOptions) As Boolean Return IsDefaultTriggerCharacterOrParen(text, characterPosition, options) End Function Public Overrides ReadOnly Property TriggerCharacters As ImmutableHashSet(Of Char) = CompletionUtilities.CommonTriggerCharsAndParen Protected Overrides Function IsTriggerOnDot(token As SyntaxToken, characterPositoin As Integer) As Boolean If token.Kind() <> SyntaxKind.DotToken Then Return False End If Dim previousToken = token.GetPreviousToken() If previousToken.Kind = SyntaxKind.IntegerLiteralToken Then Return token.Parent.Kind <> SyntaxKind.SimpleMemberAccessExpression OrElse Not DirectCast(token.Parent, MemberAccessExpressionSyntax).Expression.IsKind(SyntaxKind.NumericLiteralExpression) End If Return True End Function Protected Overrides Function GetDisplayAndSuffixAndInsertionText(symbol As ISymbol, context As VisualBasicSyntaxContext) As (displayText As String, suffix As String, insertionText As String) Return CompletionUtilities.GetDisplayAndSuffixAndInsertionText(symbol, context) End Function Protected Overrides Function GetFilterText(symbol As ISymbol, displayText As String, context As VisualBasicSyntaxContext) As String ' Filter on New if we have a ctor If symbol.IsConstructor() Then Return "New" End If Return GetFilterTextDefault(symbol, displayText, context) End Function Protected Overrides Function GetCompletionItemRules(symbols As ImmutableArray(Of SymbolAndSelectionInfo), context As VisualBasicSyntaxContext) As CompletionItemRules Dim preselect = symbols.Any(Function(s) s.Preselect) Return If(s_cachedRules(ValueTuple.Create(context.IsInImportsDirective, preselect, context.IsPossibleTupleContext)), CompletionItemRules.Default) End Function Protected Overrides Function IsInstrinsic(s As ISymbol) As Boolean Return If(TryCast(s, ITypeSymbol)?.IsIntrinsicType(), False) End Function End Class End Namespace