Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用roslyn悬停在源树符号的数据上_C#_Intellisense_Roslyn - Fatal编程技术网

C# 使用roslyn悬停在源树符号的数据上

C# 使用roslyn悬停在源树符号的数据上,c#,intellisense,roslyn,C#,Intellisense,Roslyn,问题: 如何将我的个人文档提供者应用于源代码树符号?这是我使用SymbolFinder.findssymbolatposition()时得到的符号类型 具体来说,我想重写GetDocumentationForSymbol()函数。我已经为我的自动完成符号覆盖了它,但不是我从悬停中得到的符号 背景: 嗨,我正在使用roslyn为我正在创建的文本编辑器收集intellisense。我需要做的事情之一是快速信息或工具提示。我有它的自动完成建议工作。通过使用如下所示的代码段 compilation

问题: 如何将我的个人文档提供者应用于源代码树符号?这是我使用SymbolFinder.findssymbolatposition()时得到的符号类型

具体来说,我想重写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));
这使用了我自己的个人DotNetDocumentationProvider,它以我需要的方式解析XML和文档。这适用于使用Recommender.GetRecommendedSymbolsAtPosition()时使用的部件符号类型

编辑:只是想提供更多背景:)

我用两种不同的方式得到符号

1) 一种方法是当我打电话的时候

var symbols = Recommender.GetRecommendedSymbolsAtPosition(semanticModel, offset, solution.Workspace);
当用户要求自动完成信息时,我使用此选项 有了这些符号,我就可以通过每一个电话:

var information = symbol.GetDocumentationCommentXml();
这将最终调用我从类DocumentationProvider重写的函数:

protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken = default(CancellationToken))
2) 第二种方法是当用户将鼠标悬停在

var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, offset, workspace, cancellationToken);
我调用了完全相同的函数(实际上是从同一行代码中调用的,保留它) (干燥)

但这不会调用我的重写GetDocumentationCommentXml(),而是调用默认的Roslyn

谢谢

我问的另一个问题是,当我解决这个问题时,它解决了我在这里遇到的问题。 问题是我认为

_workspace.CurrentSolution.AddMetadataReferences(_currentProject.Id,_compilation.References);
更新了我工作的工作区。但它不会返回添加了引用的解决方案。我需要使用

_workspace.TryApplyChanges(referenceSolution);
为了拯救它。
感谢Jason回答我在链接中找到的其他问题。如果您在此处发布,我会将其标记为答案。

标准提供程序有什么问题?哪些符号失败?我们希望通过编辑器intellisense中的quickinfo公开文档。问题在于,我们的源代码是从模板化语言(如ASP.NET)动态生成的,因此包含大量合成名称空间、类名和其他内容,这些内容不应向针对原始模板化源代码进行编码的最终用户公开。
_workspace.TryApplyChanges(referenceSolution);