public static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) { if (context.Node.ContainsDiagnostics) { return; } var ifStatement = (IfStatementSyntax)context.Node; if (!ifStatement.IsSimpleIf()) { StatementsInfo statementsInfo = SyntaxInfo.StatementsInfo(ifStatement); if (statementsInfo.Success) { int index = statementsInfo.Statements.IndexOf(ifStatement); ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index); if (returnStatement?.ContainsDiagnostics == false) { ExpressionSyntax expression = returnStatement.Expression; if (expression != null && !ifStatement.SpanOrTrailingTriviaContainsDirectives() && !returnStatement.SpanOrLeadingTriviaContainsDirectives()) { SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Node, semanticModel, cancellationToken) && ifStatement .GetChain() .All(ifOrElse => IsSymbolAssignedInLastStatement(ifOrElse, symbol, semanticModel, cancellationToken))) { context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, ifStatement); } } } } } }
public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { if (context.Node.ContainsDiagnostics) { return; } var switchStatement = (SwitchStatementSyntax)context.Node; StatementContainer container; if (StatementContainer.TryCreate(switchStatement, out container)) { int index = container.Statements.IndexOf(switchStatement); ReturnStatementSyntax returnStatement = FindReturnStatementBelow(container.Statements, index); if (returnStatement != null) { ExpressionSyntax expression = returnStatement.Expression; if (expression?.ContainsDiagnostics == false && !switchStatement.SpanOrTrailingTriviaContainsDirectives() && !returnStatement.SpanOrLeadingTriviaContainsDirectives()) { SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, container.Node, semanticModel, cancellationToken) && switchStatement .Sections .All(section => IsValueAssignedInLastStatement(section, symbol, semanticModel, cancellationToken))) { context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement); } } } } }
public static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) { if (context.Node.ContainsDiagnostics) { return; } var ifStatement = (IfStatementSyntax)context.Node; if (ifStatement.IsSimpleIf()) { return; } StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(ifStatement); if (!statementsInfo.Success) { return; } int index = statementsInfo.IndexOf(ifStatement); ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index); if (returnStatement == null) { return; } if (returnStatement.ContainsDiagnostics) { return; } ExpressionSyntax expression = returnStatement.Expression; if (expression == null) { return; } if (ifStatement.SpanOrTrailingTriviaContainsDirectives()) { return; } if (returnStatement.SpanOrLeadingTriviaContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken)) { return; } foreach (IfStatementOrElseClause ifOrElse in ifStatement.AsCascade()) { if (!IsSymbolAssignedInLastStatement(ifOrElse, symbol, semanticModel, cancellationToken)) { return; } } context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, ifStatement); }
public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { if (context.Node.ContainsDiagnostics) { return; } var switchStatement = (SwitchStatementSyntax)context.Node; StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement); if (!statementsInfo.Success) { return; } int index = statementsInfo.IndexOf(switchStatement); ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, index); if (returnStatement == null) { return; } ExpressionSyntax expression = returnStatement.Expression; if (expression == null) { return; } if (expression.ContainsDiagnostics) { return; } if (switchStatement.SpanOrTrailingTriviaContainsDirectives()) { return; } if (returnStatement.SpanOrLeadingTriviaContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken)) { return; } if (!switchStatement .Sections .All(section => IsValueAssignedInLastStatement(section, symbol, semanticModel, cancellationToken))) { return; } context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement); }
public static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { var switchStatement = (SwitchStatementSyntax)context.Node; StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement); if (!statementsInfo.Success) { return; } ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, switchStatement); ExpressionSyntax expression = returnStatement?.Expression; if (expression == null) { return; } if (switchStatement.SpanOrTrailingTriviaContainsDirectives()) { return; } if (returnStatement.SpanOrLeadingTriviaContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (symbol == null) { return; } if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken)) { return; } foreach (SwitchSectionSyntax section in switchStatement.Sections) { SyntaxList <StatementSyntax> statements = section.GetStatements(); if (statements.Count <= 1) { return; } if (!statements.Last().IsKind(SyntaxKind.BreakStatement)) { return; } if (!IsSymbolAssignedInStatement(symbol, statements[statements.Count - 2], semanticModel, cancellationToken)) { return; } } context.ReportDiagnostic(DiagnosticDescriptors.UseReturnInsteadOfAssignment, switchStatement); }
private static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { var switchStatement = (SwitchStatementSyntax)context.Node; StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(switchStatement); if (!statementsInfo.Success) { return; } ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, switchStatement); ExpressionSyntax expression = returnStatement?.Expression; if (expression == null) { return; } if (switchStatement.SpanOrTrailingTriviaContainsDirectives()) { return; } if (returnStatement.SpanOrLeadingTriviaContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (symbol == null) { return; } if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken)) { return; } foreach (SwitchSectionSyntax section in switchStatement.Sections) { SyntaxList <StatementSyntax> statements = section.GetStatements(); if (!statements.Any()) { return; } switch (statements.Last().Kind()) { case SyntaxKind.ThrowStatement: { continue; } case SyntaxKind.BreakStatement: { if (statements.Count == 1 || !IsSymbolAssignedInStatement(symbol, statements.LastButOne(), semanticModel, cancellationToken)) { return; } break; } default: { return; } } } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UnnecessaryAssignment, switchStatement); }
private static void AnalyzeIfStatement(SyntaxNodeAnalysisContext context) { var ifStatement = (IfStatementSyntax)context.Node; if (ifStatement.IsSimpleIf()) { return; } StatementListInfo statementsInfo = SyntaxInfo.StatementListInfo(ifStatement); if (!statementsInfo.Success) { return; } ReturnStatementSyntax returnStatement = FindReturnStatementBelow(statementsInfo.Statements, ifStatement); ExpressionSyntax expression = returnStatement?.Expression; if (expression == null) { return; } if (ifStatement.SpanOrTrailingTriviaContainsDirectives()) { return; } if (returnStatement.SpanOrLeadingTriviaContainsDirectives()) { return; } SemanticModel semanticModel = context.SemanticModel; CancellationToken cancellationToken = context.CancellationToken; ISymbol symbol = semanticModel.GetSymbol(expression, cancellationToken); if (symbol == null) { return; } if (!IsLocalDeclaredInScopeOrNonRefOrOutParameterOfEnclosingSymbol(symbol, statementsInfo.Parent, semanticModel, cancellationToken)) { return; } foreach (IfStatementOrElseClause ifOrElse in ifStatement.AsCascade()) { StatementSyntax statement = ifOrElse.Statement; if (statement.IsKind(SyntaxKind.Block)) { statement = ((BlockSyntax)statement).Statements.LastOrDefault(); } if (!statement.IsKind(SyntaxKind.ThrowStatement) && !IsSymbolAssignedInStatement(symbol, statement, semanticModel, cancellationToken)) { return; } } DiagnosticHelpers.ReportDiagnostic(context, DiagnosticDescriptors.UnnecessaryAssignment, ifStatement); }