Visual Studio中的匹配大括号扩展示例如何工作?

时间:2016-09-01 17:51:21

标签: c# mef visual-studio-extensions

我正在浏览Visual Studio上的“Displaying Matching Braces”扩展示例,需要一些帮助来理解代码。

在创建初始“BraceMatchingTagger”之后,对于每个插入符号移动,将调用“UpdateAtCaretPosition”函数。此函数正在引发TagsChanged事件。我跟着到这里。但是,

1)谁在处理此事件?

2)谁打电话给GetTags?

我的理解是,当移动插入符号时,会引发“TagsChanged”事件。编辑器以某种方式处理这个。稍后,编辑器会调用扩展程序的“GetTags”。这是正确的吗?我也不完全清楚调用这些函数的顺序。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您的理解是正确的。 TagsChanged由Visual Studio处理,并在UpdateAtCaretPosition返回后调用GetTags。调用序列是这个(使用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()