/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/VisualStudio/VisualBasic/Impl/Snippets/SnippetCommandHandler.vb
109 строк
5 KB
Cyrus Najmabadi
Organize VB imports
27 июн 2025, 21:53
27 июн 2025, 21:53
e9c47fd
Код
Авторство
О чём код?
' 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.ComponentModel.Composition Imports System.Threading Imports Microsoft.CodeAnalysis Imports Microsoft.CodeAnalysis.Editor Imports Microsoft.CodeAnalysis.Editor.Shared.Extensions Imports Microsoft.CodeAnalysis.Editor.Shared.Utilities Imports Microsoft.CodeAnalysis.Host.Mef Imports Microsoft.CodeAnalysis.Options Imports Microsoft.CodeAnalysis.Shared.Extensions Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Extensions Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Imports Microsoft.VisualStudio.Editor Imports Microsoft.VisualStudio.Language.Intellisense.AsyncCompletion Imports Microsoft.VisualStudio.LanguageServices.Implementation.Snippets Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.TextManager.Interop Imports Microsoft.VisualStudio.Utilities Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.Snippets <Export(GetType(Commanding.ICommandHandler))> <ContentType(ContentTypeNames.VisualBasicContentType)> <Name("VB Snippets")> <Order(After:=PredefinedCompletionNames.CompletionCommandHandler)> <Order(After:=PredefinedCommandHandlerNames.SignatureHelpAfterCompletion)> <Order(Before:=PredefinedCommandHandlerNames.AutomaticLineEnder)> Friend NotInheritable Class SnippetCommandHandler Inherits AbstractSnippetCommandHandler Private ReadOnly _editorAdaptersFactoryService As IVsEditorAdaptersFactoryService <ImportingConstructor> <Obsolete(MefConstruction.ImportingConstructorMessage, True)> Public Sub New( threadingContext As IThreadingContext, editorAdaptersFactoryService As IVsEditorAdaptersFactoryService, textManager As IVsService(Of SVsTextManager, IVsTextManager2), editorOptionsService As EditorOptionsService) MyBase.New(threadingContext, editorOptionsService, textManager) _editorAdaptersFactoryService = editorAdaptersFactoryService End Sub Protected Overrides Function IsSnippetExpansionContext(document As Document, startPosition As Integer, cancellationToken As CancellationToken) As Boolean Dim syntaxTree = document.GetSyntaxTreeSynchronously(CancellationToken.None) Return Not syntaxTree.IsEntirelyWithinStringOrCharOrNumericLiteral(startPosition, cancellationToken) AndAlso Not syntaxTree.IsEntirelyWithinComment(startPosition, cancellationToken) AndAlso Not syntaxTree.FindTokenOnRightOfPosition(startPosition, cancellationToken).HasAncestor(Of XmlElementSyntax)() End Function Protected Overrides Function TryInvokeInsertionUI(textView As ITextView, subjectBuffer As ITextBuffer, Optional surroundWith As Boolean = False) As Boolean Debug.Assert(Not surroundWith) Dim expansionManager As IVsExpansionManager = Nothing If Not TryGetExpansionManager(expansionManager) Then Return False End If Dim document = subjectBuffer.CurrentSnapshot.GetOpenDocumentInCurrentContextWithChanges() If document Is Nothing Then Return False End If expansionManager.InvokeInsertionUI( _editorAdaptersFactoryService.GetViewAdapter(textView), GetSnippetExpansionClientFactory(document).GetOrCreateSnippetExpansionClient(document, textView, subjectBuffer), Guids.VisualBasicDebuggerLanguageId, bstrTypes:=Nothing, iCountTypes:=0, fIncludeNULLType:=1, bstrKinds:=Nothing, iCountKinds:=0, fIncludeNULLKind:=1, bstrPrefixText:=ServicesVSResources.Insert_Snippet, bstrCompletionChar:=">"c) Return True End Function Protected Overrides Function TryInvokeSnippetPickerOnQuestionMark(textView As ITextView, subjectBuffer As ITextBuffer) As Boolean Dim text = subjectBuffer.AsTextContainer().CurrentText Dim caretPosition = textView.GetCaretPoint(subjectBuffer).Value.Position If (caretPosition > 1 AndAlso text(caretPosition - 1) = "?"c AndAlso Microsoft.CodeAnalysis.VisualBasic.SyntaxFacts.IsWhitespace(text(caretPosition - 2))) OrElse (caretPosition = 1 AndAlso text(0) = "?"c) Then DeleteQuestionMark(subjectBuffer, caretPosition) TryInvokeInsertionUI(textView, subjectBuffer) Return True End If Return False End Function Private Shared Sub DeleteQuestionMark(subjectBuffer As ITextBuffer, caretPosition As Integer) Dim currentSnapshot = subjectBuffer.CurrentSnapshot Dim document = currentSnapshot.GetOpenDocumentInCurrentContextWithChanges() If document IsNot Nothing Then subjectBuffer.ApplyChange(New TextChange(Microsoft.CodeAnalysis.Text.TextSpan.FromBounds(caretPosition - 1, caretPosition), String.Empty)) End If End Sub End Class End Namespace