C#罗斯林TextSpan

时间:2019-07-27 12:19:26

标签: c# roslyn

尝试使用Roslyn分析此代码。

public class MyClass
{
    #region FirstRegion
    public void MyMethod()
    {
    }
    #endregion

    #region SecondRegion

    public void MyMethod1()
    {
    }

    private static void MyMethod3()
    {
    }

    #endregion
}

首先,我想在区域上将其断开,然后查看每个区域中声明了什么函数。

var syntaxRoot = tree.GetRoot();

var regions = syntaxRoot.GetRegions();

foreach (var item in regions)
{
    var publicFunctions = syntaxRoot.GetFunctions(item.FullSpan, Modificators.Public);
}

我认为可以通过指定TextSpan

来完成
Region region = new Region();
region.Identifier = rawRegions[i].GetText().ToString();
region.FullSpan = new TextSpan(rawRegions[i].FullSpan.Start, rawRegions[i + 1].FullSpan.End - rawRegions[i].FullSpan.Start);
regions.Add(region);

但是最后我得到第一个区域包含两个公共方法,第二个区域仅包含一个公共方法。在我看来,TextSpan是错误的,但是为什么呢?该如何解决?

Program.cs

public class Modificators
{
    public const string Public = "public";
    public const string Private = "private";
    public const string Protected = "protected";
}

public class Region
{
    public string Identifier { get; set; }

    public TextSpan FullSpan { get; set; }
}

public static class SyntaxExtensions
{
    public static List<MethodDeclarationSyntax> GetFunctions(this SyntaxNode syntaxNode, TextSpan textSpan, string modifiers)
    {
        return syntaxNode.DescendantNodes(textSpan, null, false)
            .OfType<MethodDeclarationSyntax>()
            .Where(modificator => modificator.Modifiers.Any(x => x.Text.Contains(modifiers.ToString())))
            .ToList();
    }

    public static List<Region> GetRegions(this SyntaxNode syntaxNode)
    {
        List<Region> regions = new List<Region>();

        var rawRegions = syntaxNode.DescendantNodes(null, true).Where(x => x.RawKind == 8552 || x.RawKind == 8553).ToList();

        for (int i = 0; i < rawRegions.Count; i = i + 2)
        {
            Region region = new Region();
            region.Identifier = rawRegions[i].GetText().ToString();
            region.FullSpan = new TextSpan(rawRegions[i].FullSpan.Start, rawRegions[i + 1].FullSpan.End - rawRegions[i].FullSpan.Start);
            regions.Add(region);
        }

        return regions;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var tree = CSharpSyntaxTree.ParseText(@"
        public class MyClass
        {
            #region FirstRegion
            public void MyMethod()
            {
            }
            #endregion

            #region SecondRegion

            public void MyMethod1()
            {
            }

            private static void MyMethod3()
            {
            }

            #endregion
        }");

        var syntaxRoot = tree.GetRoot();

        var regions = syntaxRoot.GetRegions();

        foreach (var item in regions)
        {
            var publicFunctions = syntaxRoot.GetFunctions(item.FullSpan, Modificators.Public);
        }
    }
}

0 个答案:

没有答案