예제 #1
0
        private void AnalyzeInvocation(SyntaxNodeAnalysisContext context)
        {
            var invocationExpressionSyntax = (InvocationExpressionSyntax)context.Node;

            CommonInterest.InspectMemberAccess(
                context,
                invocationExpressionSyntax.Expression as MemberAccessExpressionSyntax,
                Descriptor,
                CommonInterest.SyncBlockingMethods);

            //if (CommonInterest.ShouldIgnoreContext(context))
            //{
            //    return;
            //}

            //var node = (InvocationExpressionSyntax)context.Node;
            //var invokeMethod = context.SemanticModel.GetSymbolInfo(context.Node).Symbol as IMethodSymbol;
            //if (invokeMethod != null)
            //{
            //    var taskType = context.SemanticModel.Compilation.GetTypeByMetadataName(typeof(Task).FullName);
            //    if (string.Equals(invokeMethod.Name, nameof(Task.Wait), StringComparison.Ordinal)
            //        && Utils.IsEqualToOrDerivedFrom(invokeMethod.ContainingType, taskType))
            //    {
            //        context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Node.GetLocation()));
            //    }
            //    else if (string.Equals(invokeMethod.Name, "GetResult", StringComparison.Ordinal)
            //        && invokeMethod.ContainingType.Name.EndsWith("Awaiter", StringComparison.Ordinal))
            //    {
            //        context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Node.GetLocation()));
            //    }
            //}
        }
예제 #2
0
        private void AnalyzeMemberAccess(SyntaxNodeAnalysisContext context)
        {
            var memberAccessSyntax = (MemberAccessExpressionSyntax)context.Node;

            CommonInterest.InspectMemberAccess(
                context,
                memberAccessSyntax,
                Descriptor,
                CommonInterest.SyncBlockingProperties);

            //if (CommonInterest.ShouldIgnoreContext(context))
            //{
            //    return;
            //}

            //if (Utils.IsWithinNameOf(context.Node as ExpressionSyntax))
            //{
            //    // We do not consider arguments to nameof( ) because they do not represent invocations of code.
            //    return;
            //}

            //var property = context.SemanticModel.GetSymbolInfo(context.Node).Symbol as IPropertySymbol;
            //if (property != null)
            //{
            //    var taskType = context.SemanticModel.Compilation.GetTypeByMetadataName(typeof(Task).FullName);
            //    if (string.Equals(property.Name, nameof(Task<object>.Result), StringComparison.Ordinal)
            //        && Utils.IsEqualToOrDerivedFrom(property.ContainingType, taskType))
            //    {
            //        context.ReportDiagnostic(Diagnostic.Create(Descriptor, context.Node.GetLocation()));
            //    }
            //}
        }
        private void AnalyzeMemberAccess(SyntaxNodeAnalysisContext context)
        {
            var memberAccessSyntax = (MemberAccessExpressionSyntax)context.Node;

            CommonInterest.InspectMemberAccess(
                context,
                memberAccessSyntax,
                Descriptor,
                CommonInterest.SyncBlockingProperties);
        }
        private void AnalyzeInvocation(SyntaxNodeAnalysisContext context)
        {
            var invocationExpressionSyntax = (InvocationExpressionSyntax)context.Node;

            CommonInterest.InspectMemberAccess(
                context,
                invocationExpressionSyntax.Expression as MemberAccessExpressionSyntax,
                Descriptor,
                CommonInterest.ProblematicSyncBlockingMethods);
        }
예제 #5
0
            internal void AnalyzeInvocation(SyntaxNodeAnalysisContext context)
            {
                var invocationExpressionSyntax = (InvocationExpressionSyntax)context.Node;

                CommonInterest.InspectMemberAccess(
                    context,
                    invocationExpressionSyntax.Expression as MemberAccessExpressionSyntax,
                    Descriptor,
                    CommonInterest.JTFSyncBlockers,
                    ignoreIfInsideAnonymousDelegate: true);
            }
        private void InspectMemberAccess(
            SyntaxNodeAnalysisContext context,
            MemberAccessExpressionSyntax memberAccessSyntax,
            IEnumerable <CommonInterest.SyncBlockingMethod> problematicMethods,
            INamedTypeSymbol taskSymbol)
        {
            if (memberAccessSyntax == null)
            {
                return;
            }

            // Are we in the context of an anonymous function that is passed directly in as an argument to another method?
            var anonymousFunctionSyntax     = context.Node.FirstAncestorOrSelf <AnonymousFunctionExpressionSyntax>();
            var anonFuncAsArgument          = anonymousFunctionSyntax?.Parent as ArgumentSyntax;
            var invocationPassingExpression = anonFuncAsArgument?.Parent?.Parent as InvocationExpressionSyntax;
            var invokedMemberAccess         = invocationPassingExpression?.Expression as MemberAccessExpressionSyntax;

            if (invokedMemberAccess?.Name != null)
            {
                // Does the anonymous function appear as the first argument to Task.ContinueWith?
                var invokedMemberSymbol = context.SemanticModel.GetSymbolInfo(invokedMemberAccess.Name).Symbol as IMethodSymbol;
                if (invokedMemberSymbol?.Name == nameof(Task.ContinueWith) &&
                    Utils.IsEqualToOrDerivedFrom(invokedMemberSymbol?.ContainingType, taskSymbol) &&
                    invocationPassingExpression?.ArgumentList?.Arguments.FirstOrDefault() == anonFuncAsArgument)
                {
                    // Does the member access being analyzed belong to the Task that just completed?
                    var firstParameter = GetFirstParameter(anonymousFunctionSyntax);
                    if (firstParameter != null)
                    {
                        // Are we accessing a member of the completed task?
                        ISymbol          invokedObjectSymbol = context.SemanticModel.GetSymbolInfo(memberAccessSyntax.Expression).Symbol;
                        IParameterSymbol completedTask       = context.SemanticModel.GetDeclaredSymbol(firstParameter);
                        if (EqualityComparer <ISymbol> .Default.Equals(invokedObjectSymbol, completedTask))
                        {
                            // Skip analysis since Task.Result (et. al) of a completed Task is fair game.
                            return;
                        }
                    }
                }
            }

            CommonInterest.InspectMemberAccess(context, memberAccessSyntax, Descriptor, problematicMethods);
        }