如何在 Roslyn 推荐的符号中包含关键字和别名?

rbr*_*ren 5 c# keyword type-alias roslyn roslyn-code-analysis

我正在使用 Roslyn 创建一个带有 IntelliSense 的 C# 脚本控件。

我通常对得到的结果非常满意,但是,推荐的符号不包含诸如forif等关键字,也不包含类型别名,例如int, 当它包含Int32.

更具体地说,我正在使用Microsoft.CodeAnalysis.Recommendations,即:

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);
Run Code Online (Sandbox Code Playgroud)

我的SemanticModel对象是从 C# 编译获得的,它mscorlib.dll至少总是有一个引用。

在我的脚本中的所有位置,推荐的完成总是正确的。但是,我认为他们是不完整的,如果缺少关键字,如ifelsefor等。

我可以看到,手动将常见类型别名包含在我的 IntelliSense 中对我来说很容易。也就是说,如果Int32可能完成,那么我可以手动添加int.

但是,在给定的范围内,if语句或for语句甚至is/何时as合适就不太明显了。

以这种方式获取推荐符号时,是否可以包含这些关键字?

还有一种方法可以自动包含类型别名吗?

Dud*_*eti 3

似乎Recommender.GetRecommendedSymbolsAtPositionAsync只提供符号补全。这意味着方法、类型等(ISymbol实现)。

如果您想要keywordssnippets完成,您可以使用Microsoft.CodeAnalysis.Completion.CompletionService

void CompletionExample()
{
    var code = @"using System;

namespace NewConsoleApp
{
class NewClass
{
    void Method()
    {
fo // I want to get 'for' completion for this
    }
}
}";

    var completionIndex = code.LastIndexOf("fo") + 2;
    // Assume you have a method that create a workspace for you
    var workspace = CreateWorkspace("newSln", "newProj", code);
    var doc = workspace.CurrentSolution.Projects.First().Documents.First();

    var service = CompletionService.GetService(doc);
    var completionItems = service.GetCompletionsAsync(doc, completionIndex).Result.Items;

    foreach (var result in completionItems)
    {
        Console.WriteLine(result.DisplayText);
        Console.WriteLine(string.Join(",", result.Tags));
        Console.WriteLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以尝试弄清楚如何根据您的需求(规则、过滤器)对其进行自定义。

请注意,每个结果都来自特定的完成提供程序 ( item.Properties["Provider"]),并且您可以创建自定义CompletionProvider(至少您应该能够)。

您还可以查看C# for VS 代码(由OmniSharp提供支持)以了解他们是如何完成工作的。