Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Roslyn CSharpSyntaxWalker İle Syntax Tree Çalışması

Merhaba,
Önceki yazılarımdan Roslyn Syntax Tree API’sine Göz Atalım başlıklı yazımda SyntaxTree sınıfı ile Syntax Tree üzerinde gezinmiştik. Bu içeriğimizde ise CSharpSyntaxWalker abstract sınıfını kullanarak aynı işlemleri gerçekleştiriyor olacağız.

Öncelikle aşağıdaki NuGet paketini projenize entegre ediniz.

Install-Package Microsoft.CodeAnalysis -Version 1.3.2

SyntaxWalker, otomatik olarak Syntax Tree içerisinde gezmemizi sağlayan bir yapıdır. CSharpSyntaxWalker, SyntaxWalker’ın özelleştirilmiş hali olan bir abstracy yapıdaki sınıftır. Biz CSharpSyntaxWalker sınıfı ile yazmış olduğumuz kodların tüm bilgilerine erişecek, kısaca Syntax Tree içerisinde işlemlerimizi net bir şekilde gerçekleştireceğiz. Tabi soyut(abstract) bir sınıf olduğu için öncelikle bu sınıfı uygulayacak Concrete oluşturmamız gerekecektir.

    class SyntaxTreeWalker : CSharpSyntaxWalker
    {

    }

İşte bu “SyntaxTreeWalker.cs” ismini verdiğim(ki siz istediğiniz ismi verebilirsiniz) sınıf bizim Syntax Walker’ımız olacaktır.

Roslyn CSharpSyntaxWalker İle Syntax Tree Çalışması

Ekranda da gördüğünüz gibi CSharpSyntaxWalker sınıfını uyguladığımız SyntaxTreeWalker isimli sınıfımızda birçok override şansımız bulunmaktadır. Syntax Walker aracınızı buradaki override edebileceğiniz metodlarla modifike edebilir ve istediğiniz donanımı kazandırabilirsiniz.

Mesela biz metod isimlerine özel bir çalışma gerçekleştirecek Syntax Walker aracı oluşturalım. Bu araç, metod isimlerinin “x” değeri ile başlayıp başlamadığını kontrol etsin ve bunlarla ilgili bizlere bilgi versin.

    class SyntaxTreeWalker : CSharpSyntaxWalker
    {
        public List<string> Aciklama = new List<string>();
        public override void VisitMethodDeclaration(MethodDeclarationSyntax node)
        {
            if (node.Identifier.ValueText[0] == 'x')
                Aciklama.Add(node.Identifier.ValueText + " metodunun adı x ile başlamaktadır.");
            else
                Aciklama.Add(node.Identifier.ValueText + " metodunun adı x ile başlamamaktadır.");
        }
    }

Gördüğünüz gibi Syntax Walker aracımız metodları kontrol edeceğinden dolayı “VisitMethodDeclaration” metodunu override ediyoruz. Varsayalım sınıfları kontrol edecek olsaydık “VisitClassDeclaration” metodunu override edebilirdik. Siz ihtiyacınıza dönük metodu göz atarak belirleyiniz.

“VisitMethodDeclaration” metodu içerisinde mevcut nodelar üzerinde hangi kontrolü yapacaksak ayarlıyoruz.

Yukarıda hazırlamış olduğumuz Syntax Walker aracımızı aşağıdaki gibi kullanabiliriz.

    class Program
    {
        static void Main(string[] args)
        {
            var tree = CSharpSyntaxTree.ParseText
                (@"
                    class OrnekClass
                    {
                        public void xA() { }
                        public void xB() { }
                        public void C() { }
                        public void xD() { }
                        public void E() { }
                    }
                ");

            SyntaxTreeWalker stw = new SyntaxTreeWalker();
            stw.Visit(tree.GetRoot());
            stw.Aciklama.ForEach(a => Console.WriteLine(a));
            Console.Read();
        }
    }

Roslyn CSharpSyntaxWalker İle Syntax Tree Çalışması

Gördüğünüz gibi CSharpSyntaxWalker sınıfı ile oluşturduğumuz Syntax Walker aracı ile elimizdeki kodların Syntax Tree’sine detaylı kontrollerle bakabilmekteyiz.

Okuduğunuz için teşekkür ederim…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir