使用 roslyn 将鼠标悬停在源树符号的数据上
Using roslyn for hover over data for source tree symbols
问题:
如何将我的个人 DocumentationProvider 应用于源代码树符号?这是我使用 SymbolFinder.FindSymbolAtPosition()
时得到的符号类型
具体来说,我想覆盖 GetDocumentationForSymbol() 函数。我为我的自动完成符号覆盖了它,但没有覆盖我从悬停上获得的符号。
背景:
您好,我正在使用 roslyn 为我正在创建的文本编辑器收集智能感知。我需要做的一件事是快速信息或工具提示。我让它为自动完成建议工作。通过使用看起来像这样的片段
compilation = CSharpCompilation.Create(
"MyIntellisense",
new[] { CSharpSyntaxTree.ParseText(dotNetCode) },
assemblies
.Select(i => MetadataReference
.CreateFromFile(i.Location, MetadataReferenceProperties.Assembly,
new DotNetDocumentationProvider(
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
这使用我自己的个人 DotNetDocumentationProvider,它按照我需要的方式解析 XML 和文档。这适用于汇编符号,这些符号是我使用 Recommender.GetRecommendedSymbolsAtPosition() 时所拥有的符号类型。
编辑:只是想提供更多背景知识:)
我以两种不同的方式获取符号。
1) 一种方法是当我调用
var symbols = Recommender.GetRecommendedSymbolsAtPosition(semanticModel, offset, solution.Workspace);
我在用户要求自动完成信息时使用它
使用这些符号,我可以通过每个调用:
var information = symbol.GetDocumentationCommentXml();
这最终调用了我从 class DocumentationProvider 覆盖的函数:
protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken = default(CancellationToken))
2) 第二种方式是当用户将鼠标悬停在
上时
var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, offset, workspace, cancellationToken);
我调用了完全相同的函数(实际上来自同一行代码,保留它
干)
var information = symbol.GetDocumentationCommentXml();
但这不会调用我覆盖的 GetDocumentationCommentXml(),而是调用默认的 Roslyn。
谢谢!
我问的另一个问题,当我解决这个问题时,它就解决了我在这里遇到的问题。
问题是我认为
_workspace.CurrentSolution.AddMetadataReferences(_currentProject.Id,_compilation.References);
更新了我工作的工作区。但它不是 returns 添加了引用的解决方案。我需要使用
_workspace.TryApplyChanges(referenceSolution);
保存它。
感谢 Jason 回答我在 link 上发现的其他问题。如果你在这里 post 我会把它标记为答案。
问题: 如何将我的个人 DocumentationProvider 应用于源代码树符号?这是我使用 SymbolFinder.FindSymbolAtPosition()
时得到的符号类型具体来说,我想覆盖 GetDocumentationForSymbol() 函数。我为我的自动完成符号覆盖了它,但没有覆盖我从悬停上获得的符号。
背景:
您好,我正在使用 roslyn 为我正在创建的文本编辑器收集智能感知。我需要做的一件事是快速信息或工具提示。我让它为自动完成建议工作。通过使用看起来像这样的片段
compilation = CSharpCompilation.Create(
"MyIntellisense",
new[] { CSharpSyntaxTree.ParseText(dotNetCode) },
assemblies
.Select(i => MetadataReference
.CreateFromFile(i.Location, MetadataReferenceProperties.Assembly,
new DotNetDocumentationProvider(
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
这使用我自己的个人 DotNetDocumentationProvider,它按照我需要的方式解析 XML 和文档。这适用于汇编符号,这些符号是我使用 Recommender.GetRecommendedSymbolsAtPosition() 时所拥有的符号类型。
编辑:只是想提供更多背景知识:)
我以两种不同的方式获取符号。
1) 一种方法是当我调用
var symbols = Recommender.GetRecommendedSymbolsAtPosition(semanticModel, offset, solution.Workspace);
我在用户要求自动完成信息时使用它 使用这些符号,我可以通过每个调用:
var information = symbol.GetDocumentationCommentXml();
这最终调用了我从 class DocumentationProvider 覆盖的函数:
protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken = default(CancellationToken))
2) 第二种方式是当用户将鼠标悬停在
上时var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, offset, workspace, cancellationToken);
我调用了完全相同的函数(实际上来自同一行代码,保留它 干)
var information = symbol.GetDocumentationCommentXml();
但这不会调用我覆盖的 GetDocumentationCommentXml(),而是调用默认的 Roslyn。
谢谢!
我问的另一个问题,当我解决这个问题时,它就解决了我在这里遇到的问题。 问题是我认为
_workspace.CurrentSolution.AddMetadataReferences(_currentProject.Id,_compilation.References);
更新了我工作的工作区。但它不是 returns 添加了引用的解决方案。我需要使用
_workspace.TryApplyChanges(referenceSolution);
保存它。 感谢 Jason 回答我在 link 上发现的其他问题。如果你在这里 post 我会把它标记为答案。