private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context) { var methodDeclaration = (MethodDeclarationSyntax)context.Node; BlockSyntax body = methodDeclaration.Body; if (body != null) { if (body.ContainsDirectives) { return; } BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(body); if (!analysis.Success) { return; } if (!context.IsAnalyzerSuppressed(AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine) && methodDeclaration.SyntaxTree.IsMultiLineSpan(methodDeclaration.HeaderSpan())) { return; } AnalyzeBlock(context, body, analysis); } else { ArrowExpressionClauseSyntax expressionBody = methodDeclaration.ExpressionBody; if (expressionBody?.ContainsDirectives == false) { if (!context.IsAnalyzerSuppressed(AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine) && methodDeclaration.SyntaxTree.IsMultiLineSpan(methodDeclaration.HeaderSpan())) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.ReportOnly.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine, expressionBody); return; } if (!context.IsAnalyzerSuppressed(AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine) && expressionBody.Expression?.IsMultiLine() == true) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.ReportOnly.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine, expressionBody); } } } }
private static void AnalyzeBlock(SyntaxNodeAnalysisContext context, BlockSyntax block, BlockExpressionAnalysis analysis) { if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine.IsEnabled(context) && analysis.Expression.IsMultiLine()) { return; } if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(block.OpenBraceToken)) { return; } if (!analysis.ReturnOrThrowKeyword.LeadingTrivia.IsEmptyOrWhitespace()) { return; } ReportDiagnostic(context, analysis.Block, analysis.Expression); }
private static void AnalyzeAccessorDeclarationBlock( SyntaxNodeAnalysisContext context, AccessorDeclarationSyntax accessor, BlockSyntax body) { if (body.ContainsDirectives) { return; } if (accessor.AttributeLists.Any()) { return; } bool isGetter = accessor.IsKind(SyntaxKind.GetAccessorDeclaration); BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(body, allowExpressionStatement: !isGetter); ExpressionSyntax expression = analysis.Expression; if (expression == null) { return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBody.IsEnabled(context)) { return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine.IsEnabled(context) && expression.IsMultiLine()) { return; } if (isGetter && accessor.Parent is AccessorListSyntax accessorList && accessorList.Accessors.Count == 1) { if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(accessorList.OpenBraceToken)) { return; } if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(accessor.Keyword)) { return; } if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(body.OpenBraceToken)) { return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine.IsEnabled(context)) { switch (accessorList.Parent.Kind()) { case SyntaxKind.PropertyDeclaration: { if (accessor.SyntaxTree.IsMultiLineSpan(((PropertyDeclarationSyntax)accessorList.Parent).HeaderSpan())) { return; } break; } case SyntaxKind.IndexerDeclaration: { if (accessor.SyntaxTree.IsMultiLineSpan(((IndexerDeclarationSyntax)accessorList.Parent).HeaderSpan())) { return; } break; } default: { Debug.Fail(accessorList.Parent.Kind().ToString()); break; } } return; } ReportDiagnostic(context, accessorList, expression); ReportFadeOut(context, accessor.Keyword, body); return; } if (!accessor.Keyword.TrailingTrivia.IsEmptyOrWhitespace()) { return; } if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(body.OpenBraceToken)) { return; } if (!accessor.Keyword.LeadingTrivia.IsEmptyOrWhitespace()) { return; } ReportDiagnostic(context, body, expression); }
private static void AnalyzeLocalFunctionStatement(SyntaxNodeAnalysisContext context) { if (!DiagnosticRules.ConvertBlockBodyToExpressionBodyOrViceVersa.IsEffective(context)) { return; } var localFunction = (LocalFunctionStatementSyntax)context.Node; BlockSyntax body = localFunction.Body; if (body != null) { if (body.ContainsDirectives) { return; } BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(body); if (!analysis.Success) { return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBody.IsEnabled(context)) { return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine.IsEnabled(context) && localFunction.SyntaxTree.IsMultiLineSpan(localFunction.HeaderSpan())) { return; } AnalyzeBlock(context, body, analysis); } else { ArrowExpressionClauseSyntax expressionBody = localFunction.ExpressionBody; if (expressionBody?.ContainsDirectives == false) { if (AnalyzerOptions.ConvertExpressionBodyToBlockBody.IsEnabled(context)) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.ReportOnly.ConvertExpressionBodyToBlockBody, expressionBody, AnalyzerOptions.ConvertExpressionBodyToBlockBody); return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine.IsEnabled(context) && localFunction.SyntaxTree.IsMultiLineSpan(localFunction.HeaderSpan())) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.ReportOnly.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine, expressionBody, AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenDeclarationIsMultiLine); return; } if (AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine.IsEnabled(context) && expressionBody.Expression?.IsMultiLine() == true) { DiagnosticHelpers.ReportDiagnostic(context, DiagnosticRules.ReportOnly.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine, expressionBody, AnalyzerOptions.ConvertExpressionBodyToBlockBodyWhenExpressionIsMultiLine); } } } }
private static void AnalyzeBlock(SyntaxNodeAnalysisContext context, BlockSyntax block, BlockExpressionAnalysis analysis, BodyStyle style) { if (style.UseBlockWhenExpressionIsMultiLine == true && analysis.Expression.IsMultiLine()) { return; } if (!style.UseExpression) return; if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(block.OpenBraceToken)) return; if (!analysis.ReturnOrThrowKeyword.LeadingTrivia.IsEmptyOrWhitespace()) return; ReportDiagnostic(context, analysis.Block); }
private static void AnalyzeMethodDeclaration(SyntaxNodeAnalysisContext context) { var methodDeclaration = (MethodDeclarationSyntax)context.Node; BlockSyntax body = methodDeclaration.Body; if (body != null) { if (body.ContainsDirectives) return; BodyStyle style = context.GetBodyStyle(); if (style.IsDefault) return; BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(body); if (!analysis.Success) return; if (!style.UseExpression) return; if (style.UseBlockWhenDeclarationIsMultiLine == true && methodDeclaration.SyntaxTree.IsMultiLineSpan(methodDeclaration.HeaderSpan())) { return; } AnalyzeBlock(context, body, analysis, style); } else { ArrowExpressionClauseSyntax expressionBody = methodDeclaration.ExpressionBody; if (expressionBody?.ContainsDirectives == false) { BodyStyle style = context.GetBodyStyle(); if (style.IsDefault) return; if (style.UseBlock) { ReportDiagnostic(context, expressionBody); return; } if (style.UseBlockWhenDeclarationIsMultiLine == true && methodDeclaration.SyntaxTree.IsMultiLineSpan(methodDeclaration.HeaderSpan())) { ReportDiagnostic(context, expressionBody); return; } if (style.UseBlockWhenExpressionIsMultiLine == true && expressionBody.Expression?.IsMultiLine() == true) { ReportDiagnostic(context, expressionBody); } } } }
private static void AnalyzeAccessorDeclarationBlock( SyntaxNodeAnalysisContext context, AccessorDeclarationSyntax accessor, BlockSyntax body) { if (body.ContainsDirectives) return; if (accessor.AttributeLists.Any()) return; BodyStyle style = context.GetBodyStyle(); if (style.IsDefault) return; bool isGetter = accessor.IsKind(SyntaxKind.GetAccessorDeclaration); BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(body, allowExpressionStatement: !isGetter); ExpressionSyntax expression = analysis.Expression; if (expression == null) return; if (!style.UseExpression) return; if (style.UseBlockWhenExpressionIsMultiLine == true && expression.IsMultiLine()) { return; } if (isGetter && accessor.Parent is AccessorListSyntax accessorList && accessorList.Accessors.Count == 1) { if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(accessorList.OpenBraceToken)) return; if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(accessor.Keyword)) return; if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(body.OpenBraceToken)) return; if (style.UseBlockWhenDeclarationIsMultiLine == true) { switch (accessorList.Parent.Kind()) { case SyntaxKind.PropertyDeclaration: { if (accessor.SyntaxTree.IsMultiLineSpan(((PropertyDeclarationSyntax)accessorList.Parent).HeaderSpan())) return; break; } case SyntaxKind.IndexerDeclaration: { if (accessor.SyntaxTree.IsMultiLineSpan(((IndexerDeclarationSyntax)accessorList.Parent).HeaderSpan())) return; break; } default: { SyntaxDebug.Fail(accessorList.Parent); break; } } return; } ReportDiagnostic(context, accessorList); return; } if (!accessor.Keyword.TrailingTrivia.IsEmptyOrWhitespace()) return; if (!SyntaxTriviaAnalysis.IsExteriorTriviaEmptyOrWhitespace(body.OpenBraceToken)) return; if (!accessor.Keyword.LeadingTrivia.IsEmptyOrWhitespace()) return; ReportDiagnostic(context, body); }