開源實現的 C# 和 Visual Basic 編譯器,具備完整的程式碼分析 API
Roslyn 打破了傳統編譯器的「黑盒子」模式,將編譯器轉變為平台。過去,原始碼進入編譯器,經過複雜處理後產生目的碼,但編譯過程中建立的深度知識隨即被遺忘。
現在,Roslyn 開放這些資訊,讓工具和開發者能夠利用編譯器對程式碼的深刻理解,實現 IntelliSense、重構、智慧重新命名、「尋找所有參考」等功能。
C# 14.0 進行中的功能:
field 關鍵字在屬性中將原始碼轉換為標記 (Token) 序列
根據語言文法建立語法樹
分析宣告並形成符號表
將識別碼與符號匹配
執行類型檢查和語意驗證
將高階結構轉換為低階形式
生成 IL 位元組碼
Compilation 物件是不可變且可重用的。透過 AddSyntaxTrees()、RemoveSyntaxTrees()、ReplaceSyntaxTree() 進行增量變更。
使用 InternalSyntax 命名空間進行效能關鍵的解析,避免 LINQ 和 foreach(對於沒有 struct enumerator 的集合)。
支援增量語法樹更新和符號重新計算,提供快速的 IDE 體驗。
src/Compilers/
Core/Portable/ - 語言無關的編譯器基礎設施CSharp/Portable/ - C# 編譯器實現VisualBasic/Portable/ - VB 編譯器實現Test/ - 編譯器測試套件using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
// 建立語法樹
var tree = CSharpSyntaxTree.ParseText(@"
public class MyClass {
public void MyMethod() {
System.Console.WriteLine(""Hello"");
}
}
");
// 建立編譯
var compilation = CSharpCompilation.Create("MyAssembly")
.AddReferences(MetadataReference.CreateFromFile(
typeof(object).Assembly.Location))
.AddSyntaxTrees(tree);
// 執行語意分析
var diagnostics = compilation.GetDiagnostics();
src/Workspaces/
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.MSBuild;
// 開啟工作區
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync("MySolution.sln");
// 取得專案
var project = solution.Projects.First();
// 取得文件
var document = project.Documents.First();
// 取得語法樹
var tree = await document.GetSyntaxTreeAsync();
// 修改文件
var newDocument = document.WithText(newText);
src/Features/
src/EditorFeatures/
src/VisualStudio/
src/LanguageServer/
完整的語法樹表示,包含所有原始碼資訊(包括空白和註解)。支援不可變操作和高效的增量更新。
豐富的語意資訊 API,包括符號解析、類型資訊、資料流分析和控制流分析。
在編譯時生成程式碼的強大機制,支援增量生成器以獲得最佳效能。
可擴展的診斷系統,允許自訂分析器和程式碼修復。與 MSBuild 和 IDE 深度整合。
完整的重構基礎設施,支援安全的程式碼轉換和重新命名操作。
專為大型程式碼庫設計,採用增量編譯、物件池和結構化列舉器等技術。
精確的語法分類和語意著色,提供豐富的編輯器體驗。
強大的程式碼完成和建議系統,提供上下文感知的智慧提示。
# Windows
.\Build.cmd
# Linux / macOS
./build.sh
# 只建置編譯器
dotnet build Compilers.slnf
# 只建置 IDE 功能
dotnet build Ide.slnf
# 執行所有測試
.\Test.cmd
./test.sh
# 執行特定測試專案
dotnet test src/Compilers/CSharp/Test/Syntax/
# 執行特定測試
dotnet test --filter "FullyQualifiedName~MyTestClass"
# 格式化空白
dotnet format whitespace --folder . --include path/to/file.cs
# 驗證程式碼格式
.\eng\validate-code-formatting.ps1
# 更新本地化檔案 (.xlf)
dotnet msbuild path/to/project.csproj /t:UpdateXlf
# 使用 Visual Studio
1. 開啟 Roslyn.sln
2. 設定 csc 或 vbc 專案為啟動專案
3. 設定命令列參數
4. F5 開始除錯
# 使用 VS Code
1. 開啟 .vscode/launch.json
2. 選擇設定
3. F5 開始除錯
PooledObjects)Debug.Assert() 進行內部驗證CSharpTestBase 或 VisualBasicTestBase[Fact] 和 [Theory] 屬性[UseExportProvider] 進行 MEF 測試尋找標有「help wanted」或「good first issue」的議題
在開始編碼前,先在議題中討論你的方案
Fork repository 並複製到本地
實現功能或修復,並添加測試
提交 Pull Request 並等待審核