ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-01 09:55:20  阅读:353  来源: 互联网

标签:c keyword roslyn roslyn-code-analysis type-alias


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

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

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

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);

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

在我的脚本中的所有位置,建议的完成始终是正确的.但是,如果他们缺少if,else和for等关键字,我认为它们是不完整的.

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

但是,当if语句或for语句甚至是/在给定范围内适当时,它就不那么明显了.

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

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

解决方法:

似乎Recommender.GetRecommendedSymbolsAtPositionAsync仅提供符号完成.这意味着,方法,类型等(ISymbol实现).

如果要完成关键字或代码段,可以使用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为动力),看看他们是如何完成这项工作的.

标签:c,keyword,roslyn,roslyn-code-analysis,type-alias
来源: https://codeday.me/bug/20190701/1345635.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有