{"id":18009850,"url":"https://github.com/kekyo/microsoft.codeanalysis.activepatterns","last_synced_at":"2025-03-26T14:31:29.765Z","repository":{"id":65488714,"uuid":"76661630","full_name":"kekyo/Microsoft.CodeAnalysis.ActivePatterns","owner":"kekyo","description":"F# Active pattern library for Roslyn Compiler Platform (C#, VB)","archived":false,"fork":false,"pushed_at":"2022-12-07T14:38:35.000Z","size":1271,"stargazers_count":29,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-21T23:22:02.103Z","etag":null,"topics":["csharp","fsharp","roslyn"],"latest_commit_sha":null,"homepage":"","language":"F#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kekyo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-12-16T14:53:49.000Z","updated_at":"2023-06-14T12:16:20.000Z","dependencies_parsed_at":"2023-01-25T16:35:11.297Z","dependency_job_id":null,"html_url":"https://github.com/kekyo/Microsoft.CodeAnalysis.ActivePatterns","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekyo%2FMicrosoft.CodeAnalysis.ActivePatterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekyo%2FMicrosoft.CodeAnalysis.ActivePatterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekyo%2FMicrosoft.CodeAnalysis.ActivePatterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kekyo%2FMicrosoft.CodeAnalysis.ActivePatterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kekyo","download_url":"https://codeload.github.com/kekyo/Microsoft.CodeAnalysis.ActivePatterns/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245670724,"owners_count":20653410,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","fsharp","roslyn"],"created_at":"2024-10-30T02:11:16.201Z","updated_at":"2025-03-26T14:31:29.414Z","avatar_url":"https://github.com/kekyo.png","language":"F#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# F# Active pattern library for Roslyn Compiler Platform (C#, VB)\n\n\"Microsoft.CodeAnalysis.ActivePatterns\" is a F#'s active pattern functions library for [The .NET Compiler Platform (\"Roslyn\")](https://github.com/dotnet/roslyn) compiler platform.\nThis library auguments for Roslyn AST (Abstract syntax tree nodes) types by F# active pattern functions.\n\n* This library still under construction...\n\n## Status\n\n| Title | Status |\n|:----|:----|\n| NuGet | [![NuGet](https://img.shields.io/nuget/v/Microsoft.CodeAnalysis.ActivePatterns.svg?style=flat)](https://www.nuget.org/packages/Microsoft.CodeAnalysis.ActivePatterns) |\n\n## Code example\n\n### This code fragment for Roslyn analysis target:\n\n```csharp\nusing System.Collections.Generic;\n\nnamespace SampleNamespace\n{\n    public sealed class SampleClass\n    {\n        public SampleClass()\n        {\n            this.Value = System.DateTime.Now.Tick;\n        }\n\n        public long Value\n        {\n            get;\n            set;\n        }\n    }\n}\n```\n\n### This code fragment for Roslyn using C#:\n\n```csharp\nusing System.IO;\nusing System.Linq;\nusing System.Reflection;\nusing System.Text;\nusing Microsoft.CodeAnalysis.CSharp;\nusing Microsoft.CodeAnalysis.CSharp.Syntax;\n\n/// Code fragments are how to analysis by Roslyn and C#.\n/// (These are not better and rough codes, but maybe longer analysis codes by using C#...)\nnamespace csharp_sample\n{\n    static class Program\n    {\n        private static string ReadSampleCode()\n        {\n            using (var fs = Assembly.GetEntryAssembly().GetManifestResourceStream(\"csharp_standard_usage_sample.Sample.cs\"))\n            {\n                var tr = new StreamReader(fs, Encoding.UTF8);\n                return tr.ReadToEnd();\n            }\n        }\n\n        private static string TraverseNameSyntax(NameSyntax name)\n        {\n            if (name is IdentifierNameSyntax idName)\n            {\n                return idName.Identifier.Text;\n            }\n\n            if (name is QualifiedNameSyntax qName)\n            {\n                return TraverseNameSyntax(qName.Left) + \".\" + TraverseNameSyntax(qName.Right);\n            }\n\n            return string.Empty;\n        }\n\n        static void Main(string[] args)\n        {\n            var sampleCode = ReadSampleCode();\n\n            var tree = (CSharpSyntaxTree) CSharpSyntaxTree.ParseText(sampleCode);\n            var root = (CompilationUnitSyntax)tree.GetRoot();\n\n            // Too complex if we have to analyze roslyn AST using C#...\n\n            if (root.Usings.Any(u =\u003e\n            {\n                var name = TraverseNameSyntax(u.Name);\n                return name == \"System.Collections.Generic\";\n            }))\n            {\n                if (root.Members.Any(m =\u003e\n                {\n                    if (m is NamespaceDeclarationSyntax nameDecl)\n                    {\n                        if (nameDecl.Name is IdentifierNameSyntax name)\n                        {\n                            if (name.Identifier.Text == \"SampleNamespace\")\n                            {\n                                if (nameDecl.Members.Any(m2 =\u003e\n                                {\n                                    if (m2 is ClassDeclarationSyntax classDecl)\n                                    {\n                                        var name2 = classDecl.Identifier.Text;\n                                        if (name2 == \"SampleClass\")\n                                        {\n                                            return true;\n                                        }\n                                    }\n                                    return false;\n                                }))\n                                {\n                                    // ...\n                                }\n                            }\n                        }\n                    }\n                    return false;\n                }))\n                {\n                    // ...\n                }\n            }\n        }\n    }\n}\n```\n\n### If you are using for F# and this library:\n\n```fsharp\nopen System\nopen System.IO\nopen System.Reflection\nopen System.Text\n\nopen Microsoft.CodeAnalysis\nopen Microsoft.CodeAnalysis.CSharp\n\n// This is a namespace for active pattern functions.\nopen Microsoft.CodeAnalysis.CSharp.Strict\n\n[\u003cEntryPoint\u003e]\nlet main argv =\n    let sampleCode =\n        use fs = Assembly.GetEntryAssembly().GetManifestResourceStream \"Sample.cs\"\n        let tr = new StreamReader(fs, Encoding.UTF8)\n        tr.ReadToEnd()\n\n    let tree = CSharpSyntaxTree.ParseText sampleCode\n    let root = tree.GetRoot() :?\u003e CSharpSyntaxNode\n        \n    // Roslyn C# AST can handle by F#'s pattern matching.\n    // AST types deconstructs by this library's active pattern functions.\n    // And syntax node pattern naming is shorter.\n\n    match root with\n    | CompilationUnit\n       (_, [ UsingDirective(_, _, _, Identifier([\"System\";\"Collections\";\"Generic\"]), _)], _,\n         [ NamespaceDeclaration(_,\n            Identifier([\"SampleNamespace\"]), _, _, _,\n            [ ClassDeclaration(decl,\n                _, Text(\"SampleClass\"), _, _, _, _,\n                memberDecls,\n                _, _)],\n            _, _) ],\n         _) -\u003e\n            memberDecls\n            |\u003e Seq.choose (function\n              | PropertyDeclaration(_, typeSyntax, _, Text(id), _, _, _, _) -\u003e\n                 Some (typeSyntax, id)\n              | _ -\u003e None)\n            |\u003e Seq.iter (printf \"%A\")\n            \n    | _ -\u003e ()\n    0\n```\n\n## Platform\n\n* .NET 7, 6, 5\n* .NET Standard 2.1, 2.0\n* .NET Core 3.1\n* .NET Framework 4.8, 4.6.1\n* Roslyn (based 4.4.0).\n\n## Additional resources\n\n* [\"You will be assimilated. Resistance is futile.\" - NGK2016B conference (12.17.2016) session slide.](http://www.slideshare.net/kekyo/documents-you-will-be-assimilated-resistance-is-futile)\n  * This is a joke session ;)\n\n## License\n\n* Copyright (c) Kouji Matsui\n* Under Apache v2 http://www.apache.org/licenses/LICENSE-2.0\n\n## TODO:\n\n* Improvement auto generator for better output.\n* Add additional custom functions.\n\n## History\n\n* 0.9.0:\n  * Updated for using Roslyn 4.4.0 and .NET 7 SDK.\n* 0.8.20:\n  * Fixed NamespaceDeclaration matcher.\n* 0.8.10:\n  * Upgraded Roslyn to 3.6.0.\n* 0.8.1:\n  * More shorter SyntaxNode related names (ex: CompilationUnitSyntax --\u003e CompilationUnit).\n  * Support strict and loose active patterns.\n* 0.7.1:\n  * Support .NET Standard, .NET Core 2 and F# 4.5 (4.5.2), based Roslyn 2.8.2.\n* 0.5.1:\n  * Initial packaged release.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkekyo%2Fmicrosoft.codeanalysis.activepatterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkekyo%2Fmicrosoft.codeanalysis.activepatterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkekyo%2Fmicrosoft.codeanalysis.activepatterns/lists"}