﻿
{"id":4169,"date":"2016-04-25T23:26:59","date_gmt":"2016-04-25T23:26:59","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=4169"},"modified":"2016-04-25T23:27:07","modified_gmt":"2016-04-25T23:27:07","slug":"roslyn-syntax-tree-apisine-goz-atalim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/roslyn-syntax-tree-apisine-goz-atalim\/","title":{"rendered":"Roslyn Syntax Tree API&#8217;sine G\u00f6z Atal\u0131m"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu makalemizde .NET Framework Compiler&#8217;\u0131n\u0131n derinlerine ula\u015fmam\u0131z\u0131 sa\u011flayan Roslyn yap\u0131s\u0131ndaki Syntax Tree API&#8217;sine de\u011finece\u011fiz.<\/p>\n<p>.NET \u00e7at\u0131s\u0131 alt\u0131nda hangi dilde olursa olsun yazd\u0131\u011f\u0131m\u0131z kodlar \u00f6ncelikle derleyici taraf\u0131ndan ayr\u0131\u015ft\u0131r\u0131l\u0131r(parse) ard\u0131ndan bu i\u015flem neticesinde Syntax Tree(S\u00f6zdizimi A\u011fac\u0131) olu\u015fur. Bu a\u011fa\u00e7 i\u00e7erisinde, yazm\u0131\u015f oldu\u011fumuz kodla ilgili t\u00fcm bilgiler hiyerar\u015fik bir vaziyette tutulacakt\u0131r.<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m.jpg\" rel=\"attachment wp-att-4170\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4170 size-medium\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-300x263.jpg\" alt=\"Roslyn Syntax Tree API'sine G\u00f6z Atal\u0131m\" width=\"300\" height=\"263\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-300x263.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m.jpg 624w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Yukar\u0131daki g\u00f6r\u00fcnt\u00fcy\u00fc incelersek e\u011fer g\u00f6r\u00fcld\u00fc\u011f\u00fc gibi komutlar aras\u0131na yazd\u0131\u011f\u0131m\u0131z her \u015fey\u00a0bir anlam ifade etmektedir. Haliyle bu anlamlar\u0131 izah edebilmek i\u00e7in kar\u015f\u0131m\u0131za <em>Syntax Node<\/em>, <em>Syntax Token<\/em> ve <em>Syntax Trivia<\/em> terimleri gelmektedir.<\/p>\n<ul>\n<li><em><strong>Syntax Node<br \/>\n<\/strong><\/em>Kod i\u00e7erisindeki yap\u0131lar\u0131\u00a0ifade ederler. Class yap\u0131s\u0131, metod yap\u0131s\u0131, de\u011fi\u015fken yap\u0131s\u0131 vs&#8230; Roslyn&#8217;da her yap\u0131ya \u00f6zel bir SyntaxNode s\u0131n\u0131f\u0131 mevcuttur.<\/li>\n<li><em><strong>Syntax Token<br \/>\n<\/strong><\/em>Kod i\u00e7erisindeki komutlar\u0131 ifade eder.<\/li>\n<li><em><strong>Syntax Trivia<\/strong><\/em>(\u00d6nemsiz \u015eeyler &#8211; Iv\u0131r Z\u0131v\u0131r)<br \/>\nKod i\u00e7erisindeki yorumlar, bo\u015fluklar ve yap\u0131 isimleridir. Do\u011fal olarak Syntax Trivia&#8217;lar, Syntax Token&#8217;lara ba\u011fl\u0131d\u0131rlar. Her\u00a0Syntax Token&#8217;da bulunan LeadingTrivia ve TrailingTrivia koleksiyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla ilgili Token&#8217;a ba\u011fl\u0131 Trivia&#8217;lara eri\u015filebilir.<\/li>\n<\/ul>\n<p>Roslyn Syntax Tree API&#8217;sini kullanabilmek i\u00e7in\u00a0<em><strong>Microsoft.CodeAnalysis<\/strong><\/em> Nuget paketini projeye entegre etmeniz gerekmektedir.<\/p>\n<blockquote><p><span style=\"color: #0000ff;\"><strong><em>Install-Package Microsoft.CodeAnalysis -Version 1.2.1<\/em><\/strong><\/span><\/p><\/blockquote>\n<p>E\u011fer yukar\u0131daki kod \u00e7al\u0131\u015fmazsa \u00e7al\u0131\u015f\u0131r halini <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.CodeAnalysis\" target=\"_blank\">buradan<\/a> bulabilirsiniz.<\/p>\n<p>\u015eimdi Microsoft.CodeAnalysis&#8217;in entegrasyonunu varsayarak, \u00f6rnek bir kodun Syntax Tree&#8217;sini \u00e7\u0131karal\u0131m. Tabi bu i\u015flemler i\u00e7in \u00e7al\u0131\u015f\u0131rken ilgili kod sayfas\u0131na &#8216;<em>Microsoft.CodeAnalysis.CSharp<\/em>&#8216; ve &#8216;<em>Microsoft.CodeAnalysis<\/em>&#8216; k\u00fct\u00fcphanelerini using etti\u011fimize dikkatinizi \u00e7ekerim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Microsoft.CodeAnalysis.CSharp;\r\nusing Microsoft.CodeAnalysis;\r\n\r\nnamespace RoslynSyntaxTree\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            SyntaxTree Tree = CSharpSyntaxTree.ParseText\r\n                            (@&quot;class OrnekClass\r\n                                {\r\n                                    public int OrnekProperty { get; set; }\r\n                                    public void OrnekMetod()\r\n                                    {\r\n\r\n                                    }\r\n                                    public void OrnekMetod(int x)\r\n                                    {\r\n\r\n                                    }\r\n\r\n                                    public void OrnekMetod2()\r\n                                    {\r\n\r\n                                    }\r\n                                }&quot;);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Yukar\u0131daki g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi CSharpSyntaxTree.ParseText metodu i\u00e7erisine verilen komutlar\u0131n Syntax Tree&#8217;sini verecektir.<\/p>\n<p>Elde etti\u011fimiz bu Syntax Tree sayesinde istedi\u011fimiz elemanlara ula\u015fabilmekteyiz. Tabi burada a\u011fa\u00e7 \u00fczerinden elemanlara eri\u015febilece\u011fimiz i\u00e7in \u00f6ncelikle a\u011fac\u0131n ilk eleman\u0131 olan root&#8217;a ula\u015fmam\u0131z gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            SyntaxTree Tree = CSharpSyntaxTree.ParseText\r\n                            (@&quot;class OrnekClass\r\n                                {\r\n                                    public int OrnekProperty { get; set; }\r\n                                    public void OrnekMetod()\r\n                                    {\r\n\r\n                                    }\r\n                                    public void OrnekMetod(int x)\r\n                                    {\r\n\r\n                                    }\r\n\r\n                                    public void OrnekMetod2()\r\n                                    {\r\n\r\n                                    }\r\n                                }&quot;);\r\n\r\n            SyntaxNode Root = Tree.GetRoot();\r\n        }\r\n<\/pre>\n<p>Evet, root eleman\u0131na ula\u015ft\u0131ktan sonra bu root \u00fczerinden di\u011fer t\u00fcm elemanlara rahat\u00e7a ula\u015fabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            SyntaxTree Tree = CSharpSyntaxTree.ParseText\r\n                            (@&quot;class OrnekClass\r\n                                {\r\n                                    public int OrnekProperty { get; set; }\r\n                                    public void OrnekMetod()\r\n                                    {\r\n\r\n                                    }\r\n                                    public void OrnekMetod(int x)\r\n                                    {\r\n\r\n                                    }\r\n\r\n                                    public void OrnekMetod2()\r\n                                    {\r\n\r\n                                    }\r\n                                }&quot;);\r\n\r\n            SyntaxNode Root = Tree.GetRoot();\r\n            var Methods = Root.DescendantNodes().OfType&lt;MethodDeclarationSyntax&gt;();\r\n            var Propertys = Root.DescendantNodes().OfType&lt;PropertyDeclarationSyntax&gt;();\r\n            Console.WriteLine(&quot;Methods...&quot;);\r\n            foreach (var Method in Methods)\r\n            {\r\n                Console.WriteLine(Method.ToString());\r\n            }\r\n            Console.WriteLine(&quot;*********\\nPropertys...&quot;);\r\n            foreach (var Property in Propertys)\r\n            {\r\n                Console.WriteLine(Property.ToString());\r\n            }\r\n\r\n\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki \u00f6rnek kodu derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131z zaman a\u015fa\u011f\u0131daki sonucu vermektedir.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/roslyn-syntax-tree-apisine-goz-atalim\/roslyn-syntax-tree-apisine-goz-atalim-2\/\" rel=\"attachment wp-att-4176\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4176\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-1.jpg\" alt=\"Roslyn Syntax Tree API'sine G\u00f6z Atal\u0131m\" width=\"336\" height=\"302\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-1.jpg 336w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-1-300x270.jpg 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/a><br \/>\nBunlar\u0131n yan\u0131nda elemanlara filtre uygulayabilir s\u00f6z gelimi sadece parametresiz metodlara ula\u015fabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n            SyntaxNode Root = Tree.GetRoot();\r\n            var Methods = Root.DescendantNodes().OfType&lt;MethodDeclarationSyntax&gt;().Where(m =&gt; !m.ParameterList.Parameters.Any());\r\n            Console.WriteLine(&quot;Methods...&quot;);\r\n            foreach (var Method in Methods)\r\n            {\r\n                Console.WriteLine(Method.ToString());\r\n            }\r\n.\r\n.\r\n.\r\n<\/pre>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/roslyn-syntax-tree-apisine-goz-atalim\/roslyn-syntax-tree-apisine-goz-atalim-3\/\" rel=\"attachment wp-att-4178\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-4178\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-2.jpg\" alt=\"Roslyn Syntax Tree API'sine G\u00f6z Atal\u0131m\" width=\"312\" height=\"183\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-2.jpg 312w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Roslyn-Syntax-Tree-APIsine-G\u00f6z-Atal\u0131m-2-300x176.jpg 300w\" sizes=\"auto, (max-width: 312px) 100vw, 312px\" \/><\/a><\/p>\n<p>Yukar\u0131daki \u00f6rneklendirmelerimizde metodlar i\u00e7in &#8216;<em>MethodDeclarationSyntax<\/em>&#8216; tipini, propertyler i\u00e7inse &#8216;<em>PropertyDeclarationSyntax<\/em>&#8216; tipini kulland\u0131k. \u00d6rneklendirmede olan elemanlarla vermedi\u011fimiz di\u011fer elemanlar i\u00e7in bu tarz tipleri nereden biliyorsun(bilece\u011fim) diye sorarsan\u0131z e\u011fer <strong><em>Syntax Visualizer<\/em><\/strong> isimli ara\u00e7tan i\u015fimizi g\u00f6rmektedir.<\/p>\n<p>Syntax Visualizer arac\u0131n\u0131 Visual Studio platformunda kullanabilmek i\u00e7in .NET Compiler Platform SDK&#8217;s\u0131n\u0131 y\u00fcklememiz gerekmektedir. (<em>Bu i\u015flem i\u00e7in <a href=\"https:\/\/visualstudiogallery.msdn.microsoft.com\/2ddb7240-5249-4c8c-969e-5d05823bcb89\" target=\"_blank\">buraya<\/a> t\u0131klayarak ilgili SDK&#8217;y\u0131 indirip, kurabilirsiniz.<\/em>)<\/p>\n<p>Y\u00fckleme i\u015flemini yapt\u0131ktan sonra &#8220;View&#8221; -&gt; &#8220;Other Windows&#8221; -&gt; &#8220;Syntax Visualizer&#8221; kombinasyonuyla ilgili pencereyi a\u00e7abilirsiniz.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Syntax-Visualizer.jpg\" rel=\"attachment wp-att-4182\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-4182 size-medium\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Syntax-Visualizer-300x219.jpg\" alt=\"Syntax Visualizer\" width=\"300\" height=\"219\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Syntax-Visualizer-300x219.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2016\/04\/Syntax-Visualizer.jpg 645w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>A\u015fa\u011f\u0131daki videoda da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi Syntax Visualizer arac\u0131 sayesinde \u00fczerine t\u0131klad\u0131\u011f\u0131m\u0131z yap\u0131n\u0131n hangi tipten temsil edildi\u011fini ve bunun d\u0131\u015f\u0131nda i\u00e7inde hangi \u00f6zelliklerin bar\u0131nd\u0131\u011f\u0131n\u0131da net bir \u015fekilde analiz etmekteyiz.<\/p>\n<p><iframe loading=\"lazy\" width=\"300\" height=\"169\" src=\"https:\/\/www.youtube-nocookie.com\/embed\/0TVKO_Hmudk\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p>Bu yaz\u0131m\u0131z\u0131nda sonuna gelmi\u015f bulunmaktay\u0131z. 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, Bu makalemizde .NET Framework Compiler&#8217;\u0131n\u0131n derinlerine ula\u015fmam\u0131z\u0131 sa\u011flayan Roslyn yap\u0131s\u0131ndaki Syntax Tree API&#8217;sine de\u011finece\u011fiz. .NET \u00e7at\u0131s\u0131 alt\u0131nda hangi dilde olursa olsun yazd\u0131\u011f\u0131m\u0131z kodlar \u00f6ncelikle derleyici taraf\u0131ndan ayr\u0131\u015ft\u0131r\u0131l\u0131r(parse) ard\u0131ndan bu i\u015flem neticesinde Syntax Tree(S\u00f6zdizimi&#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":4170,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[1148,1151,1149,1150,1152,1141,1139,1143,1144,1145,1142,1140,1146,1153,1147],"class_list":["post-4169","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","tag-leadingtrivia","tag-methoddeclarationsyntax","tag-microsoft-codeanalysis","tag-microsoft-codeanalysis-csharp","tag-propertydeclarationsyntax","tag-roslyn","tag-roslyn-syntax-tree-api","tag-sozdizimi-agaci","tag-syntax-node","tag-syntax-token","tag-syntax-tree","tag-syntax-tree-api","tag-syntax-trivia","tag-syntax-visualizer","tag-syntaxnode"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4169","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=4169"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/4169\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/4170"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=4169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=4169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=4169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}