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

问题描述 投票:4回答:1

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

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

更具体地说,我使用的是Microsoft.CodeAnalysis.Recommendations,即:

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);

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

在我的脚本中的所有位置,建议的完成始终是正确的。但是,如果他们缺少ifelsefor等关键词,我认为它们是不完整的。

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

然而,当if声明或for声明甚至is / as在给定范围内适当时,它就不那么明显了。

有没有办法在以这种方式获得推荐符号时包含这些关键字?

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

c# roslyn keyword roslyn-code-analysis type-alias
1个回答
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驱动)来看看他们是如何完成这项工作的。

© www.soinside.com 2019 - 2024. All rights reserved.