• 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; }

      

  • 相关阅读:
    [BZOJ1666][Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏
    [BZOJ1692][Usaco2007 Dec]队列变换
    [BZOJ1599][Usaco2008 Oct]笨重的石子
    [BZOJ1603][Usaco2008 Oct]打谷机
    [BZOJ1614][Usaco2007 Jan]Telephone Lines架设电话线
    [BZOJ1617][Usaco2008 Mar]River Crossing渡河问题
    [BZOJ1612][Usaco2008 Jan]Cow Contest奶牛的比赛
    [BZOJ1600][Usaco2008 Oct]建造栅栏
    [BZOJ1230][Usaco2008 Nov]lites 开关灯
    hdu 2199 Can you solve this equation? 二分
  • 原文地址:https://www.cnblogs.com/congqiandehoulai/p/15254753.html
Copyright © 2020-2023  润新知