• 基于roslyn实现函数与函数之间的依赖关系


    样本:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Threading.Tasks;
     5 
     6 namespace Student_mangent
     7 {
     8     public class Test
     9     {
    10         public static void Test_1(string val)
    11         {
    12             Console.WriteLine(val + "1");
    13         }
    14         public static void Test_2(string val)
    15         {
    16             Console.WriteLine(val + "2");
    17         }
    18         public static void Test_main()
    19         {
    20             string val = "3";
    21             Test_2(val);
    22             Test_1(val);
    23             Console.WriteLine(val + "2");
    24         }
    25     }
    26 }

    识别代码:

      1 using Microsoft.Build.Locator;
      2 using Microsoft.CodeAnalysis;
      3 using Microsoft.CodeAnalysis.CSharp;
      4 using Microsoft.CodeAnalysis.CSharp.Symbols;
      5 using Microsoft.CodeAnalysis.CSharp.Syntax;
      6 using Microsoft.CodeAnalysis.MSBuild;
      7 using Microsoft.CodeAnalysis.Text;
      8 using System;
      9 using System.Collections.Generic;
     10 using System.IO;
     11 using System.Linq;
     12 using System.Text;
     13 using System.Threading.Tasks;
     14 using Newtonsoft.Json;
     15 
     16 namespace Test_Roslyn
     17 {
     18     class Program
     19     {
     20         static async Task Main(string[] args)
     21         {
     22             var file = @"E:VS2017WorkSpaceLearnStudent_mangentStudent_mangentTest.cs";
     23             var programText = File.ReadAllText(file);
     24             // 构建语法树
     25             SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
     26             CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
     27             CSharpCompilation Compilation = CSharpCompilation
     28                             .Create("test")
     29                             .AddSyntaxTrees(tree)
     30                             .AddReferences(MetadataReference.CreateFromFile(typeof(object).Assembly.Location));
     31             //添加语义模型
     32             SemanticModel model = Compilation.GetSemanticModel(tree);
     33             var Value_methods = from methodDeclaration in root.DescendantNodes()
     34                                        .OfType<MethodDeclarationSyntax>()
     35                                 select methodDeclaration;
     36             List<JsonModel> json_data = new List<JsonModel>();
     37             foreach (var method in Value_methods)
     38             {//构建字典
     39                 Console.WriteLine("*************************");
     40                 IMethodSymbol Symbol_method = model.GetDeclaredSymbol(method);
     41                 Console.WriteLine(Symbol_method);
     42                 Console.WriteLine(Symbol_method.Locations.Single());
     43                 var nodes = from methodDeclaration in root.DescendantNodes()
     44                                 .OfType<InvocationExpressionSyntax>()
     45                                 where methodDeclaration.Parent.Parent.Parent== method
     46                             select methodDeclaration;
     47                 foreach (var node in nodes.Distinct())
     48                 {
     49                     Console.WriteLine("&&&&&&&&&&&&&&&&&&&");
     50                     Console.WriteLine($"To=>{node}");
     51                     IMethodSymbol Symbol_node = (IMethodSymbol)model.GetSymbolInfo(node).Symbol;
     52                     Console.WriteLine(Symbol_node);
     53                     Console.WriteLine(Symbol_node.Locations.Single());
     54                     //进行
     55 
     56 
     57                     //json制造
     58                     //JsonModel JsonValue = new JsonModel();
     59                     //JsonValue.Source = method.Identifier.ValueText;
     60                     //JsonValue.Target = node + "";
     61                     //json_data.Add(JsonValue);
     62                 }
     63             }
     64             /*json制造
     65             string json = JsonConvert.SerializeObject(json_data);
     66             Console.WriteLine(json);
     67             // 获取当前程序所在路径,并将要创建的文件命名为info.json 
     68             string fp = "E:/VS2017/WorkSpace/Learn/Roslyn/Test_Roslyn/Test_Roslyn/data/info.json";
     69             Save_json(fp,json);
     70             */
     71         }
     72         public static IEnumerable<InvocationExpressionSyntax> Get_SescendantNodes(string Text_code)
     73         {
     74             
     75             var Tree = CSharpSyntaxTree.ParseText(Text_code);
     76             CompilationUnitSyntax Root = Tree.GetCompilationUnitRoot();
     77             var Nodes = Root.DescendantNodes()
     78                     .OfType<InvocationExpressionSyntax>();
     79             return Nodes;
     80         }
     81         public static Boolean Save_json(string Path,string value)
     82         {
     83             if (!File.Exists(Path))  // 判断是否已有相同文件 
     84             {
     85                 FileStream fs1 = new FileStream(Path, FileMode.Create, FileAccess.ReadWrite);
     86                 fs1.Close();
     87             }
     88             File.WriteAllText(Path, value);
     89             return true;
     90         }
     91         public static object Read_json(string Path)
     92         {
     93             Object obji = JsonConvert.DeserializeObject<Object>(File.ReadAllText(Path));  // 尖括号<>中填入对象的类名 
     94             return obji;
     95         }
     96         public static void Get_syntax()
     97         {
     98             var file = @"E:VS2017WorkSpaceLearnRoslynDataStartup.cs";
     99             var programText = File.ReadAllText(file);
    100             // 构建语法树
    101             SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
    102             CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
    103             var Value_methods = from methodDeclaration in root.DescendantNodes()
    104                                        .OfType<MethodDeclarationSyntax>()
    105                                     //where methodDeclaration.Identifier.ValueText == "ConfigureServices"
    106                                     //select methodDeclaration.Identifier.ValueText+"__==__"+methodDeclaration.Body.ToFullString();
    107                                 select methodDeclaration;
    108             foreach (var method in Value_methods)
    109             {//构建字典
    110                 Console.WriteLine("*************************");
    111                 Console.WriteLine(method.Identifier.ValueText);
    112                 Console.WriteLine(method.ParameterList);
    113                 //Console.WriteLine(method.Body.ToFullString());
    114                 SyntaxTree tree_method = CSharpSyntaxTree.ParseText(method.Body.ToFullString());
    115                 CompilationUnitSyntax root_method = tree_method.GetCompilationUnitRoot();
    116                 var nodes = from methodDeclaration in root_method.DescendantNodes()
    117                              .OfType<ExpressionStatementSyntax>()
    118                             select methodDeclaration;
    119                 nodes.Distinct().ToList().ForEach(s => Console.WriteLine(s));
    120                 foreach (var node in nodes)
    121                 {
    122                     //Console.WriteLine(node);
    123                 }
    124 
    125             }
    126         }
    127 
    128         public static void Just_test()
    129         {
    130             var file = @"E:VS2017WorkSpaceLearnRoslynDataStartup.cs";
    131             var programText = File.ReadAllText(file);
    132             // 构建语法树
    133             SyntaxTree tree = CSharpSyntaxTree.ParseText(programText);
    134             CompilationUnitSyntax root = tree.GetCompilationUnitRoot();
    135             //添加引用类型=>String,Console
    136             var compilation = CSharpCompilation.Create("Starup")
    137                     .AddReferences(MetadataReference.CreateFromFile(
    138                         typeof(string).Assembly.Location))
    139                     .AddSyntaxTrees(tree);
    140 
    141             //添加语义模型
    142             SemanticModel model = compilation.GetSemanticModel(tree);
    143 
    144             var helloWorldStrings = root.DescendantNodes()
    145                 .OfType<MethodDeclarationSyntax>();
    146 
    147             foreach (var helloWorldString in helloWorldStrings)
    148             {
    149                 Console.WriteLine("HHHHH");
    150                 Console.WriteLine(helloWorldString.Identifier.ValueText);
    151                 // Use the semantic model for type information:
    152                 TypeInfo literalInfo = model.GetTypeInfo(helloWorldString);
    153                 var stringTypeSymbol = (INamedTypeSymbol)literalInfo.Type;
    154                 Console.WriteLine(stringTypeSymbol);
    155                 //进行查询
    156                 var allMembers = stringTypeSymbol.GetMembers();
    157                 Console.WriteLine(allMembers);
    158                 var methods = allMembers.OfType<IMethodSymbol>();
    159                 var publicStringReturningMethods = methods
    160                     .Where(m => m.DeclaredAccessibility == Accessibility.Public);
    161                 //删除重载
    162                 var distinctMethods = publicStringReturningMethods.Select(m => m.Name).Distinct();
    163                 foreach (var me in distinctMethods)
    164                 {
    165                     Console.WriteLine(me);
    166                 }
    167             }
    168         }
    169     }
    170 }
    依赖关系抽取

    效果:

  • 相关阅读:
    自定义dialog
    利用jquery实现自动登录
    文件的上传
    一些想法
    利用ajax实现分页效果
    自动化构建工具gulp的基础了解
    javascript模块化---requirejs
    交互ajax
    聊聊javascript的事件
    谈谈bootstrap在实践中的应用
  • 原文地址:https://www.cnblogs.com/smartisn/p/15035985.html
Copyright © 2020-2023  润新知