C# 如何在Roslyn推荐的符号中包含关键字和别名?
我正在使用Roslyn创建一个带有IntelliSense的C#脚本控件 我通常对我得到的结果非常满意,但是,推荐的符号不包括关键字,如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
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
(至少您应该能够)
您还可以查看(使用的)以了解他们是如何工作的。非常好,非常感谢!这正是我想要的。这很好,但是我们如何处理方法参数呢?当我使用完成服务时,它只返回方法上的方法名称,我们是应该使用反射来根据完成项的标记和属性检索所有其他内容,还是为了便于访问而将这些信息包含在其他地方?