写点什么

使用 Roslyn 构建 Visual Studio 扩展

  • 2011-11-05
  • 本文字数:1530 字

    阅读完需:约 5 分钟

之前我们报道了 Roslyn 编译器和工作空间 API(Workspace API)。现在让我们来看下 Roslyn 的服务 API,以及我们能够如何使用它来扩展 Visual Studio。我们在本文中要查看的扩展包括代码问题报告、快速修正、代码重构、自动完成提供程序以及大纲视图。

和所有最新的 Visual Studio 扩展一样,服务 API(Service API)也是使用 MEF 注册的。这意味着开发者只需要实现特定的接口,并包含相符的 MEF 样式的属性就可以,与之前版本的 Visual Studio 相比,这项改变受到了大家的欢迎,之前我们需要使用代码签名以及 COM 注册才可以。

代码问题报告

代码问题报告(Code Issue)扩展让开发者可以编写自己的编译器警告和错误。在 CTP 版本中包含的实例为我们展示了,如何在语法树中出现字母“a”的地方显示警告。正如你在下面的图中所看到的,它很好地整合到 Visual Studio 的总体工作流程之中。

ICodeIssueProvider 接口非常简单,它只包含了 GetIssues 方法的三种重载。每种重载方法都会接受 IDocument 参数,其中包含了所有与正在处理的文件相关的信息,包括原始文本、语法树、语义模型以及指向所包含项目的反向引用。其中还包含了一个取消令牌(cancellation token),以防备 IDE 需要取消分析操作,原因可能是因为用户对某个文件进行了编辑。

三种重载方法还会接受三种语法类型中的一种: 节点(node)、令牌(token)或者琐碎内容(trivia)。大多数分析工作都是在节点级别上完成的。琐碎内容代表的是编译器不需要的信息,像空格、注释以及缺少上下文的令牌。另一方面,节点表示的内容很广泛,从最顶级的命名空间声明,一直到最小的表达式都可以表示。

当检测到错误的时候,它就会以 CodeIssue 列表的形式返回给 IDE。CodeIssue 中会包含严重等级(信息、警告还是错误)、表示错误发生位置的 Span 对象以及对错误的描述。

快速修正

代码问题报告中可能还包含一个或多个 ICodeAction 对象。这些对象让开发者可以提供自动修正的选择,就像下图所显示的这样。

创建 ICodeAction 并与 ICodeActionEdit 匹配要比创建代码问题报告困难得多。我们需要学习如何编辑语法树,并通过 IWorkstation 接口来发布所做的变更。Roslyn 站点上提供了编写快速修正的简单教程

代码重构

对代码重构的支持看起来和修正代码问题的“快速修正”功能很类似,但是它应用于文本级别。使用ICodeRefactoringProvider 的时候要提供一个文档和TextSpan 对象,并且要返回CodeRefactoring 对象。这个对象只是包含了ICodeAction 对象的集合,就像上面所讨论的CodeIssue 对象一样。

为代码重构所提供的项目模板中并没有包含可用的演示程序,但是在此我们可以使用快速修正教程中所展示的相同技术。

自动完成提供程序

ICompletionProvider 接口中仅有一个叫做 GetItems 的方法。它会接受一个 IDocument 类型的参数和一个整型的 position 参数。并返回 CompletionItem 的列表。每个 CompletionItem 都需要提供要显示的文本。开发者可能还会在其中包含图标、描述和(或)要插入的替换文本。(对于 insertionText,如何不提供的话,默认就是要显示的文本。)

尽管它不像其它提供程序那样有用,但是我们还是可以做一些有趣的操作,像构建对于一般的代码片段结构过于复杂的模板等。

大纲视图

最后一个项目模板是语法大纲视图(Syntax Outliner),这是通过 ISyntaxOutliner 接口暴露出来的。我们可以使用它在文本编辑器中创建可折叠的大纲视图,就像我们可以折叠区域、类和方法一样。接口会接受一个语法节点(Syntax node)作为参数,并要返回一个 OutliningSpan 对象列表,其中每个对象都拥有所要包含的 TextSpan、HintSpan(用于鼠标悬停时显示文本)、标题文本以及自动折叠的选项。

查看英文原文: Building Visual Studio Extensions with Roslyn

2011-11-05 23:392637
用户头像

发布了 340 篇内容, 共 144.2 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

BoCloud博云微服务平台3.0正式发布:让微服务转型路径更清晰

BoCloud博云

微服务

全球案例 | 一家财富500强公司利用 Jira 和 Jira Align 将万人级团队的生产力提高了 30%

Atlassian

管理 DevOps 敏捷 Jira 协同办公

mPaaS 月度小报 | 应用上线前都应该检查哪些指标?CodeHub#5回顾:小程序容器加持下的技术架构“提质增效”

蚂蚁集团移动开发平台 mPaaS

小程序 移动开发 mPaaS

NUCLEO-L432KC实现GPIO控制(STM32L432KC)

不脱发的程序猿

嵌入式 stm32 单片机 NUCLEO-L432KC STM32L432KC

六一限定,致每一个追光者

白洞计划

六一儿童节,看我用ModelArts让8090梦回童年

华为云开发者联盟

AI 美食 童年 modelarts 六一

Serverless over Storage

焱融科技

云计算 容器 云原生 高性能 文件存储

用敏捷扑克做需求评审的3大优势,你get了吗?

LigaAI

高效工作 团队管理 产品思考

智慧工厂VR拆解零件——3D虚实现实可视化系统

一只数据鲸鱼

数据可视化 工业互联网 vr 智慧工厂 零件拆解

实现接口幂等性的四种方案!

李阿柯

面试 编程之路 幂等性

模块五总结

竹林七贤

Python3 Note 对象初始化

awen

Python 生命周期 对象初始化

webRTC探索音视频的录制的实现

云小梦

JavaScript WebRTC 浏览器API

一文带你认识队列数据结构

华为云开发者联盟

Java 数据结构 数组 队列

从VMWare安装到Nginx配置

wildpig

nginx vmware Centos 7

数字人民币有望为全球贸易结算开辟新视窗

CECBC

【LeetCode】包含min函数的栈Java题解

Albert

算法 LeetCode 6月日更

个推CTO谈数据中台(上):从要求、方法论到应用实践

个推

大数据 数据中台 数字化转型 数据智能

Python3 Note 函数注解

awen

Python Function 函数注解

净筹6亿美元:微盟正在加速拉开差距

ToB行业头条

SaaS 微盟

GitHub上收录400余篇任正非的讲话稿

不脱发的程序猿

GitHub 开源 程序人生 任正非讲话

Android studio 在外置硬盘运行项目报.lock 的错误

三爻

flutter android Mac Android Studio

因为一个字符校对问题,我的大厂面试挂了

华为云开发者联盟

MySQL 字符 字符校对 语句 MySQL5.7

人生算法:涌现,在自己身上发挥群体智慧

石云升

读书笔记 6月日更

苏州源控电子科技怎么样?名副其实的行业新星

Geek_8a195c

工业制造业在数字化时代的三大发展方向

CECBC

计算机视觉常用图像数据集标记平台

不脱发的程序猿

人工智能 计算机视觉 图像处理 图像数据集标记平台

安迈云首席战略官于晓晖:去中心化云计算构建Web3.0世界

DT极客

“图发展”与“保安全”:大数据今后怎么玩?

CECBC

☕️【Java技术之旅】深入学习JIT编译器实现机制(原理篇)

码界西柚

Java 编译器 JIT 6月日更

Python3 Note __slots__

awen

Python slots

使用Roslyn构建Visual Studio扩展_.NET_Jonathan Allen_InfoQ精选文章