public void DetectBlockingAsyncCallers(MethodDeclarationSyntax node) { var symbol = SemanticModel.GetDeclaredSymbol(node); if (symbol != null) { foreach (var refs in SymbolFinder.FindReferencesAsync(symbol, SourceFile.Project.Solution).Result) { foreach (var loc in refs.Locations) { var textSpan = loc.Location.SourceSpan; var callerNode = loc.Document.GetSyntaxRootAsync().Result.DescendantNodes(textSpan).FirstOrDefault(n => textSpan.Contains(n.Span)); var callerText = loc.Document.GetTextAsync().Result.Lines.ElementAt(loc.Location.GetLineSpan().StartLinePosition.Line).ToString(); if (callerText.Contains(".Wait()")) // caller.Contains(".Result") { Logs.TempLog5.Info("Blocking Caller Name: " + callerText.Trim() + " from this file: " + loc.Document.FilePath); var temp = callerNode != null ? callerNode.Ancestors().OfType<MethodDeclarationSyntax>().FirstOrDefault() : null; if (temp != null) { Logs.TempLog5.Info("Blocking Caller Method Node: " + temp.ToLog()); if (temp.IsAsync()) { Logs.TempLog5.Info("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"); } } Logs.TempLog5.Info("Async method Callee from this file " + SourceFile.FilePath + node.ToLog()+ Logs.Break); } } } } }
public override void VisitMethodDeclaration(MethodDeclarationSyntax node) { if (!node.HasAsyncModifier()) { base.VisitMethodDeclaration(node); return; } if (node.ToString().Contains("await")) { Result.asyncAwaitResults.NumAsyncMethods++; Logs.TempLog.Info(@"{0}{1}**********************************************", Document.FilePath, node.ToLog()); if (!node.ReturnType.ToString().Equals("void")) { Result.asyncAwaitResults.NumAsyncTaskMethods++; } if (IsFireForget(node)) Result.StoreDetectedAsyncMisuse(1, Document, node); if (IsUnnecessaryAsyncAwait(node)) Result.StoreDetectedAsyncMisuse(2, Document, node); if (IsThereLongRunning(node)) Result.StoreDetectedAsyncMisuse(3, Document, node); if (IsUnnecessarilyCaptureContext(node, 0)) Result.StoreDetectedAsyncMisuse(4, Document, node); //var symbol = SemanticModel.GetDeclaredSymbol(node); //if (symbol != null) //{ // foreach (var refs in SymbolFinder.FindReferencesAsync(symbol, Document.Project.Solution).Result) // { // foreach (var loc in refs.Locations) // { // var caller = loc.Document.GetTextAsync().Result.Lines.ElementAt(loc.Location.GetLineSpan().StartLinePosition.Line).ToString(); // if (caller.Contains(".Result") || caller.Contains(".Wait")) // Logs.TempLog5.Info("{0}{1}{2}{3}************************************", // System.Environment.NewLine + "Blocking Caller: '" + caller.Trim() + "' from this file: " + loc.Document.FilePath + System.Environment.NewLine, // System.Environment.NewLine + "Async method Callee: " + System.Environment.NewLine, // node.ToLog(), // "From this file: " + Document.FilePath + System.Environment.NewLine + System.Environment.NewLine); // } // } //} } else Logs.AsyncMisuse.Info(@"{0} - {1}{2}**********************************************", Document.FilePath, "No Await", node.ToLog()); base.VisitMethodDeclaration(node); }
internal void StoreDetectedAsyncMisuse(int type, Microsoft.CodeAnalysis.Document Document, MethodDeclarationSyntax node) { string name=""; switch(type) { case 1: name = "fireforget"; asyncAwaitResults.NumFireForget++; break; case 2: name = "unnecessaryasync"; asyncAwaitResults.NumUnnecessaryAsync++; break; case 3: name = "longrunning"; asyncAwaitResults.NumLongRunning++; break; case 4: name = "unnecessarycontext"; asyncAwaitResults.NumUnnecessaryContext++; break; } Logs.AsyncMisuse.Info(@"{0} - {1}{2}**********************************************", Document.FilePath, name, node.ToLog()); }