ROSLYN 查看C#方法执行次数

roslyn
SyntaxTree 句法树 lexical词汇的
每一个tree包含-
1.SyntaxNodes--每一个有parent和child属性,有DescendantNodes方法来获取子节点
2.Syntax tokens -最小片段,无子节点,包含keywords, identifiers标识符, literals, and punctuation标点符号
3.Syntax trivia细节。token的LeadingTrivia 和trailingTrivia

每个node、token、trivia都有kind属性
semantic语法上的


MSBuildLocator.RegisterDefaults(); var workspace = MSBuildWorkspace.Create(); workspace.SkipUnrecognizedProjects = true; workspace.LoadMetadataForReferencedProjects = false; workspace.WorkspaceFailed += Workspace_WorkspaceFailed; var solution = workspace.OpenSolutionAsync(@"xxx.sln").Result; private static void ParseMethod(Solution solution, string projectName, string csFileName, string methodName,string methodParListString, int logCodeIndex,int instruIdIndex,int instrNameIndex,int logLevelIndex,int userIndex, List<WriteLogInDbMethodReferenceInfo> allInfos,string className1="") { var machineMgrProj = solution.Projects.FirstOrDefault(x => x.Name == projectName); var sysLogDoc = machineMgrProj.Documents.FirstOrDefault(x => x.Name == csFileName); var semanticModel2 = sysLogDoc.GetSemanticModelAsync().Result; var rootNode2 = sysLogDoc.GetSyntaxRootAsync().Result; var nodeClass = rootNode2.DescendantNodes().OfType<ClassDeclarationSyntax>() .FirstOrDefault(x => x.Identifier.ToString() == className1); var nodeMethod = nodeClass.DescendantNodes() .OfType<MethodDeclarationSyntax>().FirstOrDefault(x => x.Identifier.ToString() == methodName&&x.ParameterList.ToString()==methodParListString); var invocationList = rootNode2.DescendantNodes().OfType<InvocationExpressionSyntax>(); var sampleMethodSymbol1 = semanticModel2.GetDeclaredSymbol(nodeMethod); var referencesToSampleMethod2 = SymbolFinder.FindReferencesAsync(sampleMethodSymbol1, solution).Result; foreach (var rrr in referencesToSampleMethod2) { var sss = rrr.Locations; foreach (var location in sss) { //文件名 var fileName = location.Document.Name; //syntex tree var syntaxTree = location.Location.SourceTree; var root = syntaxTree.GetRoot(); //class node var cc1c = root.DescendantNodes().OfType<ClassDeclarationSyntax>().First(); //类名 var className = cc1c.Identifier.ValueText; if (!fileName.Contains(".cs")) { } //location node-inovation node var nodeFind = syntaxTree.GetRoot().FindNode(location.Location.SourceSpan); //method node var parentMethod = GetParentMethod<MethodDeclarationSyntax>(nodeFind); //方法名 var methodName1 = parentMethod.Identifier.ValueText; //方法注释 //method token var t1 = parentMethod.DescendantTokens(); var t2 = t1 .Where(x => x.IsKind(SyntaxKind.PrivateKeyword) || x.IsKind(SyntaxKind.PublicKeyword) || x.IsKind(SyntaxKind.ProtectedKeyword)).FirstOrDefault(); //token的细节信息 var trivia = t2.LeadingTrivia.Where(x => x.IsKind(SyntaxKind.SingleLineDocumentationCommentTrivia) || x.IsKind(SyntaxKind.MultiLineCommentTrivia)) .FirstOrDefault(); var comment = GetComment(trivia); //参数 var invocation = GetParentMethod<InvocationExpressionSyntax>(nodeFind); var parameter = invocation.DescendantNodes().OfType<ArgumentListSyntax>() .Where(x => x.Span.Start >= nodeFind.Span.End).First(); var argumentss = parameter.DescendantNodes().OfType<ArgumentSyntax>().ToList(); string[] parList = new string[5]; for (var index = 0; index < argumentss.Count; index++) { var pp = argumentss[index]; var str = pp.Expression.ToString(); //int logCodeIndex,int instruIdIndex,int instrNameIndex,int logLevelIndex,int userIndex, if (index==logCodeIndex) { parList[0] = str; } if(index== instruIdIndex) { parList[1] = str; } if(index==instrNameIndex) { parList[2] = str; } if(index==logLevelIndex) { parList[3] = str; } if(index==userIndex) { parList[4] = str; } } allInfos.Add(new WriteLogInDbMethodReferenceInfo(csFileName+"*"+methodName,fileName, className, methodName1, comment, parList[0], parList[1], parList[2], parList[3], parList[4])); } } } private static string GetComment(in SyntaxTrivia trivia) { //< summary > /// 开始备份 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> var str = trivia.ToString(); str = str.Replace("///", ""); var begin = str.IndexOf("<summary>"); var end = str.IndexOf("</summary>"); if (begin < 0 || end < 0) { return str; } var result = str.Substring(begin + 9, end - begin - 9); return result.Trim(' ', ' ', ' ', ' '); } private static T GetParentMethod<T>(SyntaxNode nodeFind) where T : class { if (nodeFind.Parent == null) { return null; } if (nodeFind.Parent is T mm) { return mm; } else { return GetParentMethod<T>(nodeFind.Parent); } } private static void Workspace_WorkspaceFailed(object sender, Microsoft.CodeAnalysis.WorkspaceDiagnosticEventArgs e) { var x = e.Diagnostic.Message; }

  

原文地址:https://www.cnblogs.com/congqiandehoulai/p/15254753.html