2016-09-01 6 views
-1

Я использую пример расширения «Displaying Matching Braces» в Visual Studio и нуждаюсь в помощи в понимании кода.Как работает пример расширения фигурных скобок в Visual Studio?

После создания начального «BraceMatchingTagger» для каждого движения каретки вызывается функция «UpdateAtCaretPosition». Эта функция вызывает событие TagsChanged. Я следую сюда. Однако

1) Кто занимается этим мероприятием?

2) Кто звонит GetTags?

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

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

ответ

0

Ваше понимание верное. ТегиChanged обрабатывается Visual Studio и вызывает GetTags после возврата UpdateAtCaretPosition. Эта последовательность вызовов (создана с использованием Runtime Flow):

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()