Roslyn中的简单代码完成示例

 手机用户2502903761 发布于 2023-02-11 17:06

我想开始在Roslyn中完成代码,但找不到任何简单的示例来说明如何完成代码.

什么是一个很好的例子来完成这个代码,以便我可以获得所有可能的完成项目(AKA智能感知或CTRL +空间完成)caretIndex

static void Main(string[] args)
{
    var code = @"
    using System;
    public class Test
    {
        public void TestMethod()
        {
            var now = DateTime.Now;
            now.
        }
    }";
    Console.WriteLine(code);

    var st = SyntaxTree.ParseText(code);
    var caretIndex = code.IndexOf("now.") + 4;

    //how to get possible code completions at caret index? (Intellisense)
}

Trillian.. 15

Roslyn确实通过ICompletionServiceICompletionProvider接口提供代码完成服务,但它们似乎主要是内部的,并且意味着在Visual Studio中托管时可以访问.但是,如ScriptCS Pad项目所示,可以使用几个反射黑客来获取C#代码完成类型.如果你可以让它工作,我希望你应该得到VS级代码完成.

或者,您可以使用Roslyn提供的公共API"手动"执行此操作.我并不熟悉它们,但以下内容应该让您开始列出成员访问点左侧的表达式成员.请注意,它忽略了扩展方法和可见性规则,没有错误处理,并且可能在许多其他方面存在缺陷.但是,可靠地执行此操作可能不符合"简单"代码完成的要求.

var code = @"
    using System;
    public class Test
    {
        public void TestMethod()
        {
            var now = DateTime.Now;
            now.
        }
    }";
Console.WriteLine(code);

var syntaxTree = CSharpSyntaxTree.ParseText(code);
var compilation = CSharpCompilation.Create("foo")
    .AddReferences(MetadataReference.CreateAssemblyReference(typeof(DateTime).Assembly.FullName))
    .AddSyntaxTrees(syntaxTree);
var semanticModel = compilation.GetSemanticModel(syntaxTree);

var dotTextSpan = new TextSpan(code.IndexOf("now.") + 3, 1);
var memberAccessNode = (MemberAccessExpressionSyntax)syntaxTree.GetRoot().DescendantNodes(dotTextSpan).Last();

var lhsType = semanticModel.GetTypeInfo(memberAccessNode.Expression).Type;

foreach (var symbol in lhsType.GetMembers())
{
    if (!symbol.CanBeReferencedByName
        || symbol.DeclaredAccessibility != Accessibility.Public
        || symbol.IsStatic)
        continue;

    Console.WriteLine(symbol.Name);
}

编辑:请注意,这个答案可能已被新的Roslyn位淘汰.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有