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

时间:2019-02-08 11:50:50

标签: c# roslyn keyword roslyn-code-analysis type-alias

我正在使用Roslyn通过IntelliSense创建C#脚本控件。

我通常对我得到的结果感到非常满意,但是,推荐的符号不包含诸如forif等的关键字,也不包含诸如此类的类型别名。 int(包括Int32)。

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

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);

我的SemanticModel对象是从C#编译中获得的,而C#编译至少总是引用mscorlib.dll

在脚本的所有位置,建议的补全总是正确的。但是,我认为如果缺少ifelsefor等关键字,它们是不完整的。

我可以看到,对我而言,在我的IntelliSense中手动添加常见类型别名很容易。也就是说,如果Int32是可能的补全,那么我可以手动添加int

但是,在给定范围内,何时使用if语句,for语句甚至is / as语句并不那么明显。

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

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

1 个答案:

答案 0 :(得分:2)

似乎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();
    }
}

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

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

您还可以查看C# for VS code(带有OmniSharp的设备)以了解他们的工作方式。