/// <summary>
        /// Given <paramref name="document" /> returns <see cref="Statistic"/> about it
        /// </summary>
        /// <param name="document">Document to return stats about</param>
        /// <param name="cancellationToken">Cancellation token</param>
        /// <returns>Statistics about given document</returns>
        private static async Task <Statistic> GetAnalyzerStatisticsAsync(Document document, CancellationToken cancellationToken)
        {
            var tree = await document.GetSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);

            var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false);

            var numberOfTokens = root.DescendantTokens(descendIntoTrivia: true).Count();
            var numberOfTrivia = root.DescendantTrivia(descendIntoTrivia: true).Count();
            var nodes          = root.DescendantNodesAndSelf(descendIntoTrivia: true).ToArray();

            var numberOfNodes               = nodes.Length;
            var numberOfMemberAccesses      = nodes.Count(n => n.IsKind(SyntaxKind.SimpleMemberAccessExpression));
            var numberOfConditionalAccesses = nodes.Count(n => n.IsKind(SyntaxKind.ConditionalAccessExpression));
            var numberOfInvocations         = nodes.Count(n => n.IsKind(SyntaxKind.InvocationExpression));
            var numberOfElementAccesses     = nodes.Count(n => n.IsKind(SyntaxKind.ElementAccessExpression));
            var numberOfIdentifierNames     = nodes.Count(n => n.IsKind(SyntaxKind.IdentifierName));
            var numberOfObjectCreations     = nodes.Count(n => n.IsKind(SyntaxKind.ObjectCreationExpression));
            var numberOfClassDeclarations   = nodes.Count(n => n.IsKind(SyntaxKind.ClassDeclaration));

            var nodesStats = new NodesStatistic(
                numberOfNodes,
                numberOfMemberAccesses,
                numberOfConditionalAccesses,
                numberOfInvocations,
                numberOfElementAccesses,
                numberOfIdentifierNames,
                numberOfObjectCreations,
                numberOfClassDeclarations);

            return(new Statistic(nodesStats, numberOfTokens, numberOfTrivia));
        }
Beispiel #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Statistic"/> struct.
 /// </summary>
 /// <param name="nodesStatistic">Detailed stats about nodes</param>
 /// <param name="numberOfTokens">Number of tokens</param>
 /// <param name="numberOfTrivia">Number of trivia</param>
 public Statistic(NodesStatistic nodesStatistic, int numberOfTokens, int numberOfTrivia)
 {
     NodesStatistic = nodesStatistic;
     NumberOfTokens = numberOfTokens;
     NumberOfTrivia = numberOfTrivia;
 }