我正在使用Roslyn通过IntelliSense创建C#脚本控件。
我通常对我得到的结果感到非常满意,但是,推荐的符号不包含诸如for
和if
等的关键字,也不包含诸如此类的类型别名。 int
(包括Int32
)。
更具体地说,我正在使用Microsoft.CodeAnalysis.Recommendations
,即:
Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);
我的SemanticModel
对象是从C#编译中获得的,而C#编译至少总是引用mscorlib.dll
。
在脚本的所有位置,建议的补全总是正确的。但是,我认为如果缺少if
,else
和for
等关键字,它们是不完整的。
我可以看到,对我而言,在我的IntelliSense中手动添加常见类型别名很容易。也就是说,如果Int32
是可能的补全,那么我可以手动添加int
。
但是,在给定范围内,何时使用if
语句,for
语句甚至is
/ as
语句并不那么明显。
以这种方式获取推荐符号时,是否可以包含这些关键字?
还有一种自动包含类型别名的方法吗?
答案 0 :(得分:2)
似乎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();
}
}
您可以尝试弄清楚如何根据需要(规则,过滤器)对其进行自定义。
请注意,每个结果都来自特定的完成提供者(item.Properties["Provider"]
),您可以创建自定义的CompletionProvider
(至少应该可以)。
您还可以查看C# for VS code(带有OmniSharp的设备)以了解他们的工作方式。