2015-12-02 43 views
2

我正在創建一些Roslyn分析器,它們使用AdditionFiles功能來訪問設置文件。我試圖測試分析儀正確使用它。如何將附加文件添加到臨時Roslyn工作區以將其展示給分析器

我有設立一個特設測試工作區的方法,我嘗試了通過兩種途徑增加額外的文件:

private static Project CreateProject(IEnumerable<string> sources) 
{ 
    var projectId = ProjectId.CreateNewId(TestProjectName); 

    var solution = new AdhocWorkspace() 
     .CurrentSolution 
     .AddProject(projectId, TestProjectName, TestProjectName, LanguageNames.CSharp) 
     .AddMetadataReference(projectId, CorlibReference) 
     .AddMetadataReference(projectId, SystemCoreReference) 
     .AddAdditionalDocument(DocumentInfo.Create(DocumentId.CreateNewId(projectId), 
                "arnolyzer.yaml", 
                filePath: @"..\..\arnolyzer.yaml")); 

    var count = 0; 
    foreach (var source in sources) 
    { 
     var newFileName = $"{DefaultFilePathPrefix}{count++}.{CSharpDefaultFileExt}"; 
     var documentId = DocumentId.CreateNewId(projectId, newFileName); 
     solution = solution.AddDocument(documentId, newFileName, SourceText.From(source)); 
    } 
    var settingsFileId = DocumentId.CreateNewId(projectId, "arnolyzer.yaml"); 
    solution = solution.AddAdditionalDocument(settingsFileId, "arnolyzer.yaml", SourceText.From(@"..\..\arnolyzer.yaml")); 
    return solution.GetProject(projectId); 
} 

審視Project例如,我可以看到兩個額外的文件已經添加。

但是,在AnalysisContext.RegisterCompilationStartAction動作中檢查CompilationStartAnalysisContext.Options.AdditionalFiles時,AdditionalFiles爲空。

有誰知道這種方法是否應該起作用,從而確定我在某處出錯了嗎?或者是否將其他文檔添加到與AditionalFiles功能無關的Project

+1

要回答你的問題很簡單:是的,AdditionalDocument就是編譯器AdditionalFiles特徵匹配。它看起來像你正在兩次添加文件?另外,我不確定我們是否支持文件名中的相對路徑,如果將其更改爲完整路徑,該怎麼辦? –

+0

@JasonMalinowski。我通過兩種方式添加文件兩次,以測試其中一種是否有效,另一種則沒有。我嘗試了完整的道路,但不幸的是沒有任何區別。 Tamas在他的答案中使用的方法適用於我,儘管如此我會使用它。謝謝。 –

+0

你仍然可能希望在https://github.com/dotnet/roslyn上提供一個錯誤;要麼這不應該失敗,要麼至少需要一些更新的文檔。 –

回答

4

這不會直接回答你的問題,但你提到你正試圖測試分析儀,如果他們使用額外的文件或沒有。所以,這裏是我們如何解決:

var compilationWithAnalyzer = compilation.WithAnalyzers(
    diagnosticAnalyzers, 
    new AnalyzerOptions(ImmutableArray.Create<AdditionalText>(new AnalyzerAdditionalFile(configuration.Path))), 
    tokenSource.Token); 
var diagnostics = await compilationWithAnalyzer.GetAnalyzerDiagnosticsAsync(); 

其中AnalyzerAdditionalFile只是擴展AdditionalText

public sealed class AnalyzerAdditionalFile : AdditionalText 
{ 
    private readonly string path; 

    public AnalyzerAdditionalFile(string path) 
    { 
    this.path = path; 
    } 

    public override string Path => path; 

    public override SourceText GetText(CancellationToken cancellationToken) 
    { 
    return SourceText.From(File.ReadAllText(path)); 
    } 
} 
+0

感謝Tamas,這種方法對我來說是正確的。我的問題現在已經解決了。奇怪的是我採取的方法並沒有奏效。 –

相關問題