/// <summary> /// Read the given file and apply the CSharp Syntax Walker on the resulting syntactic tree. /// </summary> /// <param name="file">The file to parse.</param> /// <param name="walker">The walker to apply.</param> public static void Read(string file, CSharpSyntaxWalker walker) { if (walker == null) { throw new ArgumentNullException(nameof(walker), $"The argument {nameof(walker)} was null."); } walker.Visit(Parse(file).GetRoot()); }
private static bool VisitDeclaringReferences(INamedTypeSymbol namedType, CSharpSyntaxWalker visitor) { foreach (var reference in namedType.DeclaringSyntaxReferences) { if (!visitor.SafeVisit(reference.GetSyntax())) { return(false); } } return(true); }
private static void VisitContent(CSharpSyntaxWalker visitor, SyntaxList <MemberDeclarationSyntax> members, IEnumerable <SyntaxTrivia> trivias) { var comments = trivias.Where(trivia => trivia.IsAnyKind(SyntaxKind.SingleLineDocumentationCommentTrivia, SyntaxKind.MultiLineDocumentationCommentTrivia)); foreach (var member in members) { visitor.SafeVisit(member); } foreach (var comment in comments.Where(x => x.HasStructure)) { visitor.SafeVisit(comment.GetStructure()); } }
public static bool SafeVisit(this CSharpSyntaxWalker syntaxWalker, SyntaxNode syntaxNode) { try { syntaxWalker.Visit(syntaxNode); return(true); } catch (InsufficientExecutionStackException) { // Roslyn walker overflows the stack when the depth of the call is around 2050. // See https://github.com/SonarSource/sonar-dotnet/issues/2115 return(false); } }
private static bool VisitDeclaringReferences(INamedTypeSymbol namedType, CSharpSyntaxWalker visitor, Compilation compilation) { foreach (var reference in namedType.DeclaringSyntaxReferences.Where(r => !IsGenerated(r))) { if (!visitor.SafeVisit(reference.GetSyntax())) { return(false); } } return(true); bool IsGenerated(SyntaxReference syntaxReference) => syntaxReference.SyntaxTree.IsGenerated(compilation); }
private static bool VisitDeclaringReferences(INamedTypeSymbol namedType, CSharpSyntaxWalker visitor, Compilation compilation, bool includeGeneratedFile) { var syntaxReferencesToVisit = includeGeneratedFile ? namedType.DeclaringSyntaxReferences : namedType.DeclaringSyntaxReferences.Where(r => !IsGenerated(r)); foreach (var reference in syntaxReferencesToVisit) { if (!visitor.SafeVisit(reference.GetSyntax())) { return(false); } } return(true); bool IsGenerated(SyntaxReference syntaxReference) => syntaxReference.SyntaxTree.IsGenerated(CSharpGeneratedCodeRecognizer.Instance, compilation); }