2011-07-28 79 views
1

我想爲resharper編寫一個測試框架擴展。這裏的文檔在這裏:http://confluence.jetbrains.net/display/ReSharper/Test+Framework+Support如何獲取特定JetBrains.ReSharper.Psi.IDeclaredElement的文件名和行號?

這樣做的一個方面是指示一段代碼是否是測試的一部分。這段代碼被表示爲IDeclaredElement。

是否可以獲取由特定IDeclaredElement表示的一段代碼的文件名和行號?

跟進到下面的響應:

@Evgeny,感謝您的回答,我想知道你能否澄清一點對我來說。

假設用戶在Visual Studio中打開了此測試:https://github.com/fschwiet/DreamNJasmine/blob/master/NJasmine.Tests/SampleTest.cs 假設用戶右鍵單擊第48行「player.Resume()」表達式。 IDeclaredElement會告訴我他們想要在第48行運行嗎?或者它會給我一個對應於整個班級的IDeclaredElement,以及整個班級的文件名/行號範圍?

我應該玩這個我自己,但我很欣賞利用你已經知道的。

回答

3

是的。

「IDeclaredElement」實體是代碼符號(類,方法,變量等)。它可以從程序集元數據中加載,它可以在源代碼中聲明,它可以隱式地來自源代碼。

您可以使用

var declarations = declaredElement.GetDeclarations() 

獲得其宣稱這一切AST元素(這可能對部分類返回多個聲明,例如)

然後,對於任何IDeclaration,您可以使用

var documentRange = declaration.GetDocumentRange() 
if (documentRange.IsValid()) 
    Console.WriteLine ("File: {0} Line:{1}", 
DocumentManager.GetInstance(declaration.GetSolution()).GetProjectFile(documentRange.Document).Name, 
documentRange.Document.GetCoordsByOffset(documentRange.TextRange.StartOffset).Line 
); 

順便說一下,您正在開發哪種測試框架擴展?

+0

感謝您的答覆。該框架位於:https://github.com/fschwiet/DreamNJasmine/。 –

+0

Evgeny I更新了這個問題,希望瞭解更多關於返回內容的更多細節。謝謝你的幫助。 –

0

IDeclaredElement會告訴我具體他們想要在 第48行運行嗎?

再一次:IDeclaredElement在文件中沒有位置。相反,它是聲明擁有它們。 對於每一個聲明(IDeclaration是一個常規的AST節點),文檔中有覆蓋範圍。在我之前的例子中,我使用了TextRange.StartOffset,儘管你可以使用TextRange.EndOffset。

如果您需要的文件更prcise位置,請遍歷AST樹,並檢查文件中的座標特異性表達/聲明

+0

謝謝Evgeny。我並不關心IDeclaredElement和GetDeclarations()返回的對象之間的區別,因爲我對整體能力更感興趣 - 是否可以在被單擊的委託中獲取特定元素。聽起來這將在AST中提供。我專注於線路號碼,但考慮到這一點,馬虎,因爲有人可能會把很多其他的東西放在同一條線上。總之,歡呼聲 –

相關問題