Как работает пример расширения Matching Braces в Visual Studio?

Я рассматриваю пример расширения " Отображение совпадающих фигурных скобок" в Visual Studio и мне нужна помощь в понимании кода.

После создания исходного "BraceMatchingTagger" для каждого перемещения каретки вызывается функция "UpdateAtCaretPosition". Эта функция вызывает событие TagsChanged. Я следую до здесь. Тем не мение,

1) Кто занимается этим событием?

2) Кто вызывает GetTags?

Насколько я понимаю, когда каретка перемещается, возникает событие "TagsChanged". Редактор как-то справляется с этим. Позже, GetTags расширения вызывается редактором. Это правильно? Мне также не совсем ясно, в каком порядке эти функции вызываются.

Может кто-нибудь помочь с этим?

1 ответ

Решение

Ваше понимание верно. TagsChanged обрабатывается Visual Studio и вызывает GetTags после возврата UpdateAtCaretPosition. Последовательность вызовов такая (создается с использованием потока выполнения):

   void BraceMatchingTagger.CaretPositionChanged(CaretElement{_blinkInterval=530, _newOpacity=1., _preferredXCoordinate=2., _preferredYOffset=88., _displayedHeight=15., _displayedWidth=1., _updateNeeded=false, _isClosed=false, _emptySelection=true, _isHidden=false, _forceVirtualSpace=false, _caretGeometryNeedsToBeUpdated=true, _isContainedByView=true, _overwriteMode=false}, CaretPositionChangedEventArgs)
     void BraceMatchingTagger.UpdateAtCaretPosition(CaretPosition)
   . BraceMatchingTagger.GetTags(NormalizedSnapshotSpanCollection)
   . <GetTags>d__20.System.Collections.Generic.IEnumerable<Microsoft.VisualStudio.Text.Tagging.ITagSpan<Microsoft.VisualStudio.Text.Tagging.TextMarkerTag>>.GetEnumerator()
   true <GetTags>d__20.MoveNext()
     true BraceMatchingTagger.FindMatchingCloseChar(SnapshotPoint{position=27}, {, }, 7, .)
   . <GetTags>d__20.System.Collections.Generic.IEnumerator<Microsoft.VisualStudio.Text.Tagging.ITagSpan<Microsoft.VisualStudio.Text.Tagging.TextMarkerTag>>.get_Current()
   true...false <GetTags>d__20.MoveNext()
   void <GetTags>d__20.System.IDisposable.Dispose()
Другие вопросы по тегам