使用Roslyn構建Visual Studio擴充套件

2021-09-08 08:11:16 字數 2026 閱讀 3157

之前我們報道了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

通過Roslyn構建自己的C 指令碼

注意 本文編寫時參考自roslyn ctp版,roslyn script api在正式版本中i形式是有所改變的,請移步檢視這篇文章 通過roslyn構建自己的c 指令碼 更新版 在下一代的c 中,乙個重要的特性就是 compiler as a service 簡單的講,就是就是將編譯器開放為一種可在...

通過Roslyn構建自己的C 指令碼

在下一代的c 中,乙個重要的特性就是 compiler as a service 簡單的講,就是就是將編譯器開放為一種可在 中呼叫的服務。最近使用了一下微軟放出的project roslyn ctp版,感覺還是非常強大的。要在自己的 中執行c 指令碼,首先進行如下幾步準備工作。在工程中新增rosly...

通過Roslyn構建自己的C 指令碼(更新版)

之前寫過文章介紹過如何通過roslyn構建自己的c 指令碼,但那篇文章是參考自roslyn ctp版的,記得本來想等到roslyn正式版出來重新更新一下文件的,不過記得後來roslyn是跳票了的,scripting api在正式版本中都一度被移除了,這個更新就沒有做下去了。最近看到有人在原文中詢問如...