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

C# 如何在Roslyn推荐的符号中包含关键字和别名?,c#,roslyn,keyword,roslyn-code-analysis,type-alias,C#,Roslyn,Keyword,Roslyn Code Analysis,Type Alias,我正在使用Roslyn创建一个带有IntelliSense的C#脚本控件 我通常对我得到的结果非常满意,但是,推荐的符号不包括关键字,如for和if等,也不包含类型别名,如int,当它包括Int32时 更具体地说,我使用的是Microsoft.CodeAnalysis.Recommensions,即: Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace

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

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

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

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);
我的
SemanticModel
对象是从一个C#编译中获得的,它至少总是引用
mscorlib.dll

在我的脚本中的所有位置,建议的补全总是正确的。然而,我认为,如果它们缺少关键字,例如
if
else
for
等,则它们是不完整的

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

然而,当
if
语句或
for
语句或甚至
/
时,它就不那么明显了,因为
在给定的范围内是合适的

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


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

似乎
推荐程序.GetRecommendedSymbolsAtPositionAsync
只提供符号完成。这意味着,方法、类型等(
ISymbol
implementation)

如果您想要
关键字
代码段
完成,可以使用
Microsoft.codesanalysis.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
(至少您应该能够)


您还可以查看(使用的)以了解他们是如何工作的。

非常好,非常感谢!这正是我想要的。这很好,但是我们如何处理方法参数呢?当我使用完成服务时,它只返回方法上的方法名称,我们是应该使用反射来根据完成项的标记和属性检索所有其他内容,还是为了便于访问而将这些信息包含在其他地方?