/// <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());
        }
예제 #2
0
        private static bool VisitDeclaringReferences(INamedTypeSymbol namedType, CSharpSyntaxWalker visitor)
        {
            foreach (var reference in namedType.DeclaringSyntaxReferences)
            {
                if (!visitor.SafeVisit(reference.GetSyntax()))
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #3
0
        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);
     }
 }
예제 #5
0
        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);
        }
예제 #6
0
        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);
        }