写点什么

使用 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:392482
用户头像

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

关注

评论

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

即时通讯技术文集(第7期):长连接网关、P2P等 [共10篇]

JackJiang

网络编程 IM 即时通讯IM

JVM 核心知识体系

钟奕礼

Java java面试 java编程 程序员‘

华为开发者联盟学堂上线超1800门课程,为开发者提供一站式赋能

最新动态

端云一体开发,助力鸿蒙应用开发效率全面提升

最新动态

咱也不知道这份牛P哄哄的【Nginx实战】资料是不是你们想要的

钟奕礼

Java 程序员 java面试 java编程

ITSM | 对话——从业务场景、中国市场策略角度解读Atlassian ITSM解决方案

龙智—DevSecOps解决方案

ITSM ITIL

一次MTU问题导致的RDS访问故障

京东科技开发者

数据库 Linux MTU RDS vpn

【实用工具】解决PCB设计难题,痛击风险漏洞!

华秋PCB

工具 PCB PCB设计

PGL图学习之项目实践(UniMP算法实现论文节点分类、新冠疫苗项目实战,助力疫情)[系列九]

汀丶人工智能

图神经网络 图学习 11月月更 论文节点分类任务 新冠疫苗任务

观察者模式在spring中的应用

京东科技开发者

Java spring 编程 观察者模式

Spring6正式发布!重磅更新,是否可以拯救Java

宋小生

A/B测试有哪些常见应用场景?——火山引擎DataTester科普

字节跳动数据平台

大数据 AB testing实战

异常的基本概念和Java中的体系

共饮一杯无

Java 异常 11月月更

东莞理工学院-网安学院举办第二届“火焰杯”软件测试高校就业选拔赛颁奖典礼

测试人

软件测试 自动化测试 测试发开 测试比赛

车间工厂看板还搞不定,数据可视化包教包会

葡萄城技术团队

数据可视化 看板 智能工厂

四项发明专利布局国际市场 申威睿思层级化数据库操作加速系统和方法获肯定

科技热闻

深度 | 新兴软件研发范式崛起,云计算全面走向 Serverless 化

Serverless Devs

阿里云 Serverless

高效!启科量子线路模拟器 QuSprout 与 Amazon HPC 集成,赋能量子计算

亚马逊云科技 (Amazon Web Services)

量子计算 Hero 专栏

《鸿蒙生态应用开发白皮书》正式发布,携手更多开发者迈入鸿蒙世界

最新动态

“鸿蒙开发套件”焕新升级 端到端赋能助力开发运维事半功倍

最新动态

高管对上新老板的 Twitter

HoneyMoose

技术指南 | 如何集成Perforce版本控制系统Helix Core (P4V) 与敏捷规划工具Hansoft

龙智—DevSecOps解决方案

敏捷 版本管理

代码质量与安全 | 使用Incredibuild加速Klocwork静态代码分析

龙智—DevSecOps解决方案

代码静态分析 SAST工具 SAST 编译器 加速器 编程语言

《鸿蒙生态应用开发白皮书》正式发布,携手更多开发者迈入鸿蒙世界

最新动态

DNS中有哪些值得学习的优秀设计

小小怪下士

Java 程序员 DNS

2022中国区Cyber Monday限时优惠来袭,Linux基金会开源软件学园带来优惠

kk-OSC

k8s Linux基金会 CKA CKS

DHorse系列文章之操作手册

tiandizhiguai

微服务 云原生 k8s管理 微服务治理 Serverless Kubernetes

从零开始学习Java系列之Java运行机制与跨平台特性

千锋IT教育

单体分层应用架构剖析

京东科技开发者

架构 模块 应用架构 服务层 业务层

软件测试自动化“领导者”SmartBear举办首场中国线上研讨会:洞悉全球自动化测试走向,探讨降本增效之策

龙智—DevSecOps解决方案

自动化测试 API测试 UI测试 软件测试自动化

这可能是最全的SpringBoot3新版本变化了!

艾小仙

Java spring could spring-boot

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