我無法理解 Roslyn 檔案并將其與我在使用增量源生成器時看到的內容相匹配。

據我了解,語法樹是 Parser 作業的結果(對嗎?)。我可以通過 IncrementalGeneratorInitializationContext.SyntaxProvider 訪問語法樹。讓我感到困惑的是 GeneratorSyntaxContext 有一個名為 SemanticModel 的屬性,它似乎允許訪問符號。我認為符號是編譯的產物,在處理語法時不應該可用。
這讓我想到另一個問題。Compiler Pipeline 的哪一部分對應于編譯?是粘合劑嗎?
uj5u.com熱心網友回復:
增量生成器和管道沒有直接關聯。老實說,該圖實際上應該更多地表述為:
- 決議器生成 SyntaxTree 物件。(那是深綠色的盒子。)
- 可以將多個 SyntaxTree 物件粘在一起以形成一個 Compilation 物件,該物件可以訪問符號(灰色框。)
- 給定一個 Compilation 和 SyntaxTree,您可以獲得一個 SemanticModel 在那里提出更多問題(淺綠色框)。
- 編譯有一個可以使用的發射 API(即淺綠色框。)
與其將其視為管道,不如將其視為指向其他事物的資料結構,并且您在生成器中說明了您依賴的資料結構。這個想法是你可以更精確,它讓我們在 IDE 中更快,所以我們可以在下次擊鍵時減少重新運行。
在 IDE 中,實際發生的是擊鍵,我們為您編輯的檔案生成了一個新的語法樹,但我們擁有您沒有更改的所有現有樹。我們產生一個新的編譯,并可能重新運行生成器。我們將首先運行增量語法提供程式的“謂詞”部分來查找已編輯樹中的節點,但我們仍然知道先前運行生成器的其他樹中的節點。這樣您就不必重新分析未更改的部分。然后,我們讓您有機會再次使用語意查看節點,這會更昂貴。
這樣做的真正目標是“遍歷每個語法樹并找到所有看起來像特定模式的節點”是昂貴的,所以這讓我們可以將快取放在中間,以降低從一次運行到下一次運行的成本。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/450029.html
標籤:。网 罗斯林 roslyn 代码分析 csharp 源生成器
上一篇:將Style-Resource系結到StackPanel項
下一篇:通過物件串列中的多個引數過濾查詢
