C# 如何将其他文件添加到特别的Roslyn工作区,以将其公开给分析器
我正在创建一些Roslyn分析器,它们使用C# 如何将其他文件添加到特别的Roslyn工作区,以将其公开给分析器,c#,roslyn,C#,Roslyn,我正在创建一些Roslyn分析器,它们使用AdditionFiles功能访问设置文件。我正在尝试测试分析仪是否正确使用此选项 我有一种方法可以设置一个临时测试工作区,我尝试通过两种途径添加其他文档: private static Project CreateProject(IEnumerable<string> sources) { var projectId = ProjectId.CreateNewId(TestProjectName); var solutio
AdditionFiles
功能访问设置文件。我正在尝试测试分析仪是否正确使用此选项
我有一种方法可以设置一个临时测试工作区,我尝试通过两种途径添加其他文档:
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);
}
private static Project CreateProject(IEnumerable sources)
{
var projectId=projectId.CreateNewId(TestProjectName);
var solution=new AdhocWorkspace()
.当前解决方案
.AddProject(projectId、TestProjectName、TestProjectName、LanguageNames.CSharp)
.AddMetadataReference(projectId,CorlibReference)
.AddMetadataReference(projectId,SystemCoreReference)
.AddAdditionalDocument(DocumentInfo.Create(DocumentId.CreateNewId(projectId)),
“阿诺利泽,亚马尔”,
文件路径:@“.\..\arnolyzer.yaml”);
var计数=0;
foreach(源中的var源)
{
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(设置文件ID,“arnolyzer.yaml”,SourceText.From(@.\..\arnolyzer.yaml));
返回解决方案.GetProject(projectId);
}
通过检查项目
实例,我可以看到添加了两个附加文档
但是,在检查AnalysisContext.Options.AdditionalFiles
中的compilestartananalysiscontext.registercompilestartaction
操作时,AdditionalFiles
为空
有人知道这种方法是否有效,以及我在哪里出了问题吗?或者,添加到
项目中的附加文档是否与AditionalFiles
功能无关 这不会直接回答您的问题,但您提到您正在尝试测试分析器是否使用附加文件。下面是我们解决这个问题的方法:
var compilationWithAnalyzer = compilation.WithAnalyzers(
diagnosticAnalyzers,
new AnalyzerOptions(ImmutableArray.Create<AdditionalText>(new AnalyzerAdditionalFile(configuration.Path))),
tokenSource.Token);
var diagnostics = await compilationWithAnalyzer.GetAnalyzerDiagnosticsAsync();
回答您的简单问题:是的,AdditionalDocument与编译器AdditionalFiles功能相匹配。看起来你要添加两次文件?另外,我不确定我们是否支持文件名中的相对路径,如果您将其更改为完整路径呢?@JasonMalinowski。我通过两种方法添加文件两次,以测试一种方法是否有效,另一种方法是否有效。我尝试了完整的路径,但不幸的是,没有什么不同。塔马斯在回答中使用的方法对我来说很有效,所以我会使用它。谢谢。不过你可能还是希望在上提交一个bug;要么这样做不应该失败,要么至少需要一些更新过的文档。@JasonMalinowski,好主意,Jason,我将尝试构建一个最小的项目来演示这个问题,并将其作为bug提交。谢谢。这似乎是这个问题:谢谢塔马斯,这个方法对我来说是正确的。我的问题现在解决了。但是我采取的奇怪的方法没有奏效。
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));
}
}