一个C#语法高亮插件
2016-02-20 22:02
429 查看
语法高亮对程序员阅读代码来说有着不小的帮助,虽然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);
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);
相关文章推荐
- C# 多线程 lock 实例
- C#调用CMD程序
- C#中毫米与像素的换算方法
- C#中using与添加引用的区别
- C# thread类
- C#继承/this/base/new
- C#中Math.Round()实现中国式四舍五入
- C# Random 生成不重复随机数
- 【C#学习之辨析小总结】
- C#之日志
- C#学习——字符串
- c# 扩展方法 奇思妙想 推荐酷。
- StructLayout特性
- 关于C#托管代码与非托管代码的理解
- (转)C#程序开发中经常遇到的10条实用的代码
- C# WPF获取任务栏时间区域的Rectangle
- C# WPF 让你的窗口始终钉在桌面上
- [置顶]10年C#之旅,终获MVP,感谢博客园这个舞台。。。。。
- [置顶]群蚁算法理论与实践全攻略——旅行商等路径优化问题的新方法【附C#群蚁算法完整项目代码】
- [置顶]白话贝叶斯理论及在足球比赛结果预测中的应用和C#实现