語法高亮對程序員閱讀代碼來說有着不小的幫助,雖然VisualStudio本身支持C#語法高亮,但也只是對關鍵字、類名、字符串等少數元素加了標記,而我們代碼中主題:變量、函數、屬性、事件等都沒有進行高亮,如下所示:
var nodes = from id in GetIdentifiersInSpans(doc.Workspace, doc.SemanticModel, spans)
let node = doc.SyntaxRoot.FindNode(id.TextSpan)
let symbol = doc.SemanticModel.GetSymbolInfo(GetExpression(node)).Symbol
where symbol != null
let type = RoslynSymbolParser.GetSymbolType(symbol)
where type != null
let classficationType = _classificationMap[type]
select id.TextSpan.ToTagSpan(spans[0].Snapshot, classficationType);
有一些第三方控件如Visual Assist針對這一不足進行了增強,不過VisualAssist是一個收費控件,之前我找到了一個控件,這個控件雖然效果非常不錯,不過它的語法解析功能太弱,在代碼中間修改的時候,一旦有語法錯誤,它的語法高亮就時效了,導致界面出現不停的閃爍現象。這個Bug導致該語法高亮特性基本不可用。本來想自己寫的,結果發現VisualStudio擴展的相關文檔太少,又沒有什么時間投入研究它,便一度擱置了。
今天在GitHub上發現了一個語法高亮控件的項目roslyn-colorizer,這個項目本身做的並不完善,因此並沒有作為插件發布。不過倒是一個很好的示例代碼,基於它簡單的改了一下,增加了參數、成員變量、屬性、事件、枚舉、函數等幾種元素的語法高亮,前面的代碼加上語法高亮插件后就變成了如下形式:
var nodes = from id in GetIdentifiersInSpans(doc.Workspace, doc.SemanticModel, spans)
let node = doc.SyntaxRoot.FindNode(id.TextSpan)
let symbol = doc.SemanticModel.GetSymbolInfo(GetExpression(node)).Symbol
where symbol != null
let type = RoslynSymbolParser.GetSymbolType(symbol)
where type != null
let classficationType = _classificationMap[type]
select id.TextSpan.ToTagSpan(spans[0].Snapshot, classficationType);
