Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function Get-RoslynVisitMethods {
- Add-Type -Path "C:\Program Files\Reference Assemblies\Microsoft\Roslyn\v1.0\Roslyn.Compilers.CSharp.dll"
- [Roslyn.Compilers.CSharp.SyntaxVisitor].GetMethods("NonPublic,Instance") |
- Where {$_.name -like 'Visit*'}
- }
- $code = @"
- using System;
- using System.Management.Automation;
- using Roslyn.Compilers.CSharp;
- public class PSRoslynWalker : SyntaxWalker
- {
- PSObject module;
- public PSRoslynWalker(PSObject module) {
- this.module = module;
- }
- $(
- Get-RoslynVisitMethods |
- ForEach {
- @"
- protected override void $($_.name) ($($_.GetParameters()[0].ParameterType.Name) node)
- {
- var method = module.Methods["$($_.name)"];
- if (method != null)
- {
- method.Invoke(node);
- }
- base.$($_.name)(node);
- }
- "@
- }
- )
- }
- "@
- $r = "C:\Program Files\Reference Assemblies\Microsoft\Roslyn\v1.0\Roslyn.Compilers.dll",
- "C:\Program Files\Reference Assemblies\Microsoft\Roslyn\v1.0\Roslyn.Compilers.CSharp.dll"
- Add-Type -TypeDefinition $Code -ReferencedAssemblies $r
- $m = New-Module -AsCustomObject {
- $script:classNames = @()
- function VisitClassDeclaration ($node) {
- $script:classNames += New-Object PSObject -Property @{
- Name = $node.Identifier.Value
- }
- }
- function GetClassName {$script:classNames}
- }
- cls
- $targetDirectory = "C:\downloads\NuGet\nuget_47b7cea8ff2a"
- dir $targetDirectory -Recurse *.cs | % {
- $fileName = $_.FullName
- $source = [IO.File]::ReadAllText($fileName)
- $tree = [Roslyn.Compilers.CSharp.SyntaxTree]::ParseCompilationUnit($source, "", $null, (New-Object System.Threading.CancellationToken) )
- $obj = New-Object PSRoslynWalker $m
- $obj.Visit($tree.Root)
- }
- $m.GetClassName() | Sort Name
Advertisement
Add Comment
Please, Sign In to add comment