GMTC全球大前端技术大会(北京站)门票9折特惠截至本周五,点击立减¥480 了解详情
写点什么

使用 Roslyn 构建 Visual Studio 扩展

2011 年 11 月 05 日

之前我们报道了 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:391268
用户头像

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

关注

评论

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

MyBatis之启动分析(一)

ytao

mybatis Java 面试

一周信创舆情观察(5.25~5.31)

统小信uos

基础软件 操作系统 新基建

2020年6月3日 对象与类

瑞克与莫迪

愚蠢写作术(2):怎么让你的文章变得冷冰冰

史方远

学习 个人成长 写作

浅谈敏捷开发中的设计

czjczk

敏捷开发

OFD版式技术解析系列(一):开篇

华宇法律科技

计算机超全核心技术知识

cxuan

后端 计算机基础

我的个人知识管理方法

lidaobing

个人成长 知识管理 PKM

Mobaxterm (安装 、汉化、使用)入门教程

Geek_Offset

女朋友跟我吐槽Java中ArrayList遍历时删除元素的各种姿势

NotFound9

Java 架构 面试 编程语言 后端

一文让你快速上手 Mockito 单元测试框架

mghio

Java spring 单元测试 Mockito

JUC整理笔记五之梳理Varhandle(下)

JFound

Java

JAVA后端学习路线

敖丙

Java 学习 程序员 Java25周年

Sula - 可能是西湖区最好用的antd配置框架

开远

前端开发 antd sula 配置化开发 前端框架

大话设计模式 | 0 面向对象基础

Puran

C# 设计模式

ArrayList浅析

章小传

Java collection 原理 ArrayList

架构师必备的ToB产品交付之双轮驱动思维模型

常平

产品 极客大学架构师训练营

产品的本质,知道却看不到

Neco.W

产品 产品经理 需求 产品开发

Kafka的生产者优秀架构设计

奈学教育

kafka 分布式

如何更好的交谈(以英语为例)

七镜花园-董一凡

学习 生活

JDK 15 都发布了,可 Java 8 依然是最爱

古时的风筝

Java Java 25 周年 Java版本

SpringCloud-OpenFeign源码

云淡风轻

Spring Cloud

GitHub上10个不可错过的另类有趣项目

码农神说

GitHub 程序员人生 开源项目

路径依赖 - 偶然决策导致的依赖。

石云升

思维模型 路径依赖 网络效应 沉没成本 价值网依赖

CSS Tricks网站创始人作序推荐,这本书助你成为Web开发高手

图灵社区

CSS Web 开发 设计思维

读懂才会用 : 带你见识 Redis 的 zset

小眼睛聊技术

redis 学习 程序员 架构 redis6.0.0

分享一份阿里架构师 651 多个技术分支的脑图

奈学教育

大数据

科学提升认知方法之贝叶斯公式

奈学教育

贝叶斯公式

【译文】为什么说Rust是机器人技术的未来

袁承兴

rust 机器人 嵌入式

自定义 SpringBootStarter

lee

分布式事务 - 三种常见的解决方案

Java收录阁

分布式事务

使用Roslyn构建Visual Studio扩展-InfoQ