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())); // } //} }
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); }
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); }