rbr*_*ren 5 c# keyword type-alias roslyn roslyn-code-analysis
我正在使用 Roslyn 创建一个带有 IntelliSense 的 C# 脚本控件。
我通常对得到的结果非常满意,但是,推荐的符号不包含诸如for和if等关键字,也不包含类型别名,例如int, 当它包含Int32.
更具体地说,我正在使用Microsoft.CodeAnalysis.Recommendations,即:
Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);
Run Code Online (Sandbox Code Playgroud)
我的SemanticModel对象是从 C# 编译获得的,它mscorlib.dll至少总是有一个引用。
在我的脚本中的所有位置,推荐的完成总是正确的。但是,我认为他们是不完整的,如果缺少关键字,如if,else和for等。
我可以看到,手动将常见类型别名包含在我的 IntelliSense 中对我来说很容易。也就是说,如果Int32可能完成,那么我可以手动添加int.
但是,在给定的范围内,if语句或for语句甚至is/何时as合适就不太明显了。
以这种方式获取推荐符号时,是否可以包含这些关键字?
还有一种方法可以自动包含类型别名吗?
似乎Recommender.GetRecommendedSymbolsAtPositionAsync只提供符号补全。这意味着方法、类型等(ISymbol实现)。
如果您想要keywords或snippets完成,您可以使用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提供支持)以了解他们是如何完成工作的。