﻿
{"id":4767,"date":"2016-07-14T16:41:05","date_gmt":"2016-07-14T16:41:05","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4767"},"modified":"2016-07-14T16:41:05","modified_gmt":"2016-07-14T16:41:05","slug":"roslyn-csharpsyntaxwalker-ile-syntax-tree-calismasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/roslyn-csharpsyntaxwalker-ile-syntax-tree-calismasi\/","title":{"rendered":"Roslyn CSharpSyntaxWalker \u0130le Syntax Tree \u00c7al\u0131\u015fmas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n\u00d6nceki yaz\u0131lar\u0131mdan <a href=\"http:\/\/www.gencayyildiz.com\/blog\/roslyn-syntax-tree-apisine-goz-atalim\/\" target=\"_blank\">Roslyn Syntax Tree API\u2019sine G\u00f6z Atal\u0131m<\/a> ba\u015fl\u0131kl\u0131 yaz\u0131mda SyntaxTree s\u0131n\u0131f\u0131 ile Syntax Tree \u00fczerinde gezinmi\u015ftik. Bu i\u00e7eri\u011fimizde ise CSharpSyntaxWalker abstract s\u0131n\u0131f\u0131n\u0131 kullanarak ayn\u0131 i\u015flemleri ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle a\u015fa\u011f\u0131daki NuGet paketini projenize entegre ediniz.<\/p>\n<pre class=\"brush: plain; title: ; notranslate\" title=\"\">\r\nInstall-Package Microsoft.CodeAnalysis -Version 1.3.2\r\n<\/pre>\n<p>SyntaxWalker, otomatik olarak Syntax Tree i\u00e7erisinde gezmemizi sa\u011flayan bir yap\u0131d\u0131r. CSharpSyntaxWalker, SyntaxWalker&#8217;\u0131n \u00f6zelle\u015ftirilmi\u015f hali olan bir abstracy yap\u0131daki s\u0131n\u0131ft\u0131r. Biz CSharpSyntaxWalker s\u0131n\u0131f\u0131 ile yazm\u0131\u015f oldu\u011fumuz kodlar\u0131n t\u00fcm bilgilerine eri\u015fecek, k\u0131saca Syntax Tree i\u00e7erisinde i\u015flemlerimizi net bir \u015fekilde ger\u00e7ekle\u015ftirece\u011fiz. Tabi soyut(abstract) bir s\u0131n\u0131f oldu\u011fu i\u00e7in \u00f6ncelikle bu s\u0131n\u0131f\u0131 uygulayacak Concrete olu\u015fturmam\u0131z gerekecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class SyntaxTreeWalker : CSharpSyntaxWalker\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>\u0130\u015fte bu &#8220;SyntaxTreeWalker.cs&#8221; ismini verdi\u011fim(<em>ki siz istedi\u011finiz ismi verebilirsiniz<\/em>) s\u0131n\u0131f bizim Syntax Walker&#8217;\u0131m\u0131z olacakt\u0131r.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4772 size-full\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-1.png\" alt=\"Roslyn CSharpSyntaxWalker \u0130le Syntax Tree \u00c7al\u0131\u015fmas\u0131\" width=\"673\" height=\"224\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-1.png 673w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-1-300x100.png 300w\" sizes=\"auto, (max-width: 673px) 100vw, 673px\" \/><\/a><\/p>\n<p>Ekranda da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi CSharpSyntaxWalker s\u0131n\u0131f\u0131n\u0131 uygulad\u0131\u011f\u0131m\u0131z SyntaxTreeWalker isimli s\u0131n\u0131f\u0131m\u0131zda bir\u00e7ok override \u015fans\u0131m\u0131z bulunmaktad\u0131r. Syntax Walker arac\u0131n\u0131z\u0131 buradaki override edebilece\u011finiz metodlarla modifike edebilir ve istedi\u011finiz donan\u0131m\u0131 kazand\u0131rabilirsiniz.<\/p>\n<p>Mesela biz metod isimlerine \u00f6zel bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirecek Syntax Walker arac\u0131 olu\u015ftural\u0131m. Bu ara\u00e7, metod isimlerinin &#8220;x&#8221; de\u011feri ile ba\u015flay\u0131p ba\u015flamad\u0131\u011f\u0131n\u0131 kontrol etsin ve bunlarla ilgili bizlere bilgi versin.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class SyntaxTreeWalker : CSharpSyntaxWalker\r\n    {\r\n        public List&lt;string&gt; Aciklama = new List&lt;string&gt;();\r\n        public override void VisitMethodDeclaration(MethodDeclarationSyntax node)\r\n        {\r\n            if (node.Identifier.ValueText&#x5B;0] == 'x')\r\n                Aciklama.Add(node.Identifier.ValueText + &quot; metodunun ad\u0131 x ile ba\u015flamaktad\u0131r.&quot;);\r\n            else\r\n                Aciklama.Add(node.Identifier.ValueText + &quot; metodunun ad\u0131 x ile ba\u015flamamaktad\u0131r.&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Syntax Walker arac\u0131m\u0131z metodlar\u0131 kontrol edece\u011finden dolay\u0131 &#8220;VisitMethodDeclaration&#8221; metodunu override ediyoruz. Varsayal\u0131m s\u0131n\u0131flar\u0131 kontrol edecek olsayd\u0131k &#8220;VisitClassDeclaration&#8221; metodunu override edebilirdik. Siz ihtiyac\u0131n\u0131za d\u00f6n\u00fck metodu g\u00f6z atarak belirleyiniz.<\/p>\n<p>&#8220;VisitMethodDeclaration&#8221; metodu i\u00e7erisinde mevcut nodelar \u00fczerinde hangi kontrol\u00fc yapacaksak ayarl\u0131yoruz.<\/p>\n<p>Yukar\u0131da haz\u0131rlam\u0131\u015f oldu\u011fumuz Syntax Walker arac\u0131m\u0131z\u0131 a\u015fa\u011f\u0131daki gibi kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            var tree = CSharpSyntaxTree.ParseText\r\n                (@&quot;\r\n                    class OrnekClass\r\n                    {\r\n                        public void xA() { }\r\n                        public void xB() { }\r\n                        public void C() { }\r\n                        public void xD() { }\r\n                        public void E() { }\r\n                    }\r\n                &quot;);\r\n\r\n            SyntaxTreeWalker stw = new SyntaxTreeWalker();\r\n            stw.Visit(tree.GetRoot());\r\n            stw.Aciklama.ForEach(a =&gt; Console.WriteLine(a));\r\n            Console.Read();\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-2.png\" alt=\"Roslyn CSharpSyntaxWalker \u0130le Syntax Tree \u00c7al\u0131\u015fmas\u0131\" width=\"336\" height=\"122\" class=\"aligncenter size-full wp-image-4778\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-2.png 336w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/07\/Roslyn-CSharpSyntaxWalker-\u0130le-Syntax-Tree-\u00c7al\u0131\u015fmas\u0131-2-300x109.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi CSharpSyntaxWalker s\u0131n\u0131f\u0131 ile olu\u015fturdu\u011fumuz Syntax Walker arac\u0131 ile elimizdeki kodlar\u0131n Syntax Tree&#8217;sine detayl\u0131 kontrollerle bakabilmekteyiz.<\/p>\n<p>Okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, \u00d6nceki yaz\u0131lar\u0131mdan Roslyn Syntax Tree API\u2019sine G\u00f6z Atal\u0131m ba\u015fl\u0131kl\u0131 yaz\u0131mda SyntaxTree s\u0131n\u0131f\u0131 ile Syntax Tree \u00fczerinde gezinmi\u015ftik. Bu i\u00e7eri\u011fimizde ise CSharpSyntaxWalker abstract s\u0131n\u0131f\u0131n\u0131 kullanarak ayn\u0131 i\u015flemleri ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z. \u00d6ncelikle a\u015fa\u011f\u0131daki NuGet paketini projenize&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1384,1141,1388,1142,1387,1385,1386,1391,1390,1389],"class_list":["post-4767","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-csharpsyntaxwalker","tag-roslyn","tag-syntax","tag-syntax-tree","tag-syntax-walker","tag-syntaxtree","tag-syntaxwalker","tag-visitclassdeclaration","tag-visitmethoddeclaration","tag-walker"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=4767"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4767\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}