Rec*_*Dan 5 c# intellisense roslyn
问题:如何将我的个人DocumentationProvider应用于源树符号?当我使用SymbolFinder.FindSymbolAtPosition()时,我得到的符号类型是什么
具体来说,我想覆盖GetDocumentationForSymbol()函数.我为自动完成符号覆盖了它,但不是我悬停在上面的符号.
背景:
嗨,我正在使用roslyn为我正在创建的文本编辑器收集intellisense.我需要做的一件事是快速信息或工具提示.我有它为自动完成建议工作.通过使用看起来像这样的片段
compilation = CSharpCompilation.Create(
"MyIntellisense",
new[] { CSharpSyntaxTree.ParseText(dotNetCode) },
assemblies
.Select(i => MetadataReference
.CreateFromFile(i.Location, MetadataReferenceProperties.Assembly,
new DotNetDocumentationProvider(
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
Run Code Online (Sandbox Code Playgroud)
这使用我自己的个人DotNetDocumentationProvider,它以我需要的方式解析XML和文档.这适用于汇编符号,这是我使用Recommender.GetRecommendedSymbolsAtPosition()时所具有的符号类型.
编辑:只是想给更多的背景:)
我用两种不同的方式得到符号.
1)一种方式是我打电话
var symbols = Recommender.GetRecommendedSymbolsAtPosition(semanticModel, offset, solution.Workspace);
Run Code Online (Sandbox Code Playgroud)
当用户要求提供自动完成信息时,我会使用此信息.通过这些符号,我可以查看每个电话:
var information = symbol.GetDocumentationCommentXml();
Run Code Online (Sandbox Code Playgroud)
这最终调用了一个我从类DocumentationProvider中重写的函数:
protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken = default(CancellationToken))
Run Code Online (Sandbox Code Playgroud)
2)第二种方式是当用户盘旋时
var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, offset, workspace, cancellationToken);
Run Code Online (Sandbox Code Playgroud)
我调用完全相同的函数(实际上来自同一行代码,保持干燥)
var information = symbol.GetDocumentationCommentXml();
Run Code Online (Sandbox Code Playgroud)
但是这不会调用我重写的GetDocumentationCommentXml(),而是调用默认的Roslyn.
谢谢!
没有找到我需要的所有符号,如何使用 Roslyn API 查找更多符号
我问的另一个问题,当我解决这个问题时,它就解决了我在这里遇到的问题。问题是我认为
_workspace.CurrentSolution.AddMetadataReferences(_currentProject.Id,_compilation.References);
Run Code Online (Sandbox Code Playgroud)
更新了我正在工作的工作区。但它没有返回添加了引用的解决方案。我需要使用
_workspace.TryApplyChanges(referenceSolution);
Run Code Online (Sandbox Code Playgroud)
来保存它。感谢杰森回答我在链接中找到的其他问题。如果您在这里发帖,我会将其标记为答案。