private static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { var switchStatement = (SwitchStatementSyntax)context.Node; SyntaxList <SwitchSectionSyntax> sections = switchStatement.Sections; SyntaxList <SwitchSectionSyntax> .Enumerator en = sections.GetEnumerator(); if (!en.MoveNext()) { return; } SwitchSectionSyntax previousSection = en.Current; while (en.MoveNext()) { SyntaxTriviaList leadingTrivia = en.Current.Labels[0].GetLeadingTrivia(); if (SyntaxTriviaAnalysis.IsEmptyOrSingleWhitespaceTrivia(leadingTrivia)) { SyntaxTriviaList trailingTrivia = previousSection.GetTrailingTrivia(); if (SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(trailingTrivia)) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticDescriptors.AddEmptyLineBetweenSwitchSections, Location.Create(switchStatement.SyntaxTree, trailingTrivia.Last().Span.WithLength(0))); } } previousSection = en.Current; } }
private static SwitchStatementSyntax GetNewSwitchStatement(SwitchSectionSyntax switchSection, SwitchStatementSyntax switchStatement) { if (switchSection.GetLeadingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia())) { int index = switchStatement.Sections.IndexOf(switchSection); if (index > 0) { SwitchSectionSyntax previousSection = switchStatement.Sections[index - 1]; if (previousSection.GetTrailingTrivia().All(f => f.IsWhitespaceOrEndOfLineTrivia())) { SwitchStatementSyntax newSwitchStatement = switchStatement.RemoveNode( switchSection, SyntaxRemoveOptions.KeepNoTrivia); previousSection = newSwitchStatement.Sections[index - 1]; return(newSwitchStatement.ReplaceNode( previousSection, previousSection.WithTrailingTrivia(switchSection.GetTrailingTrivia()))); } } else { SyntaxToken openBrace = switchStatement.OpenBraceToken; if (!openBrace.IsMissing && openBrace.TrailingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia())) { return(switchStatement .RemoveNode(switchSection, SyntaxRemoveOptions.KeepNoTrivia) .WithOpenBraceToken(openBrace.WithTrailingTrivia(switchSection.GetTrailingTrivia()))); } } } return(switchStatement.RemoveNode(switchSection, SyntaxRemoveOptions.KeepExteriorTrivia)); }
private static SwitchSectionSyntax CreateSectionWithoutStatements(SwitchSectionSyntax section) { SwitchSectionSyntax newSection = section.WithStatements(List <StatementSyntax>()); SyntaxTriviaList x = newSection.GetTrailingTrivia(); if (newSection .GetTrailingTrivia() .All(f => f.IsWhitespaceTrivia())) { newSection = newSection.WithoutTrailingTrivia(); } if (section .SyntaxTree .IsSingleLineSpan(TextSpan.FromBounds(section.Labels.Last().SpanStart, section.Span.End))) { newSection = newSection.AppendToTrailingTrivia(section.GetTrailingTrivia()); } return(newSection); }
public static void Analyze(SyntaxNodeAnalysisContext context, SwitchStatementSyntax switchStatement) { SyntaxList <SwitchSectionSyntax> sections = switchStatement.Sections; if (sections.Any()) { AnalyzeStart(context, sections.First(), switchStatement.OpenBraceToken); AnalyzeEnd(context, sections.Last(), switchStatement.CloseBraceToken); if (sections.Count > 1) { SwitchSectionSyntax prevSection = sections.First(); for (int i = 1; i < sections.Count; i++) { if (prevSection.Statements.LastOrDefault()?.IsKind(SyntaxKind.Block) == true) { SwitchSectionSyntax section = sections[i]; SyntaxTriviaList trailingTrivia = prevSection.GetTrailingTrivia(); SyntaxTriviaList leadingTrivia = section.GetLeadingTrivia(); if (!IsStandardTriviaBetweenSections(trailingTrivia, leadingTrivia) && switchStatement .SyntaxTree .GetLineSpan(TextSpan.FromBounds(prevSection.Span.End, section.Span.Start), context.CancellationToken) .GetLineCount() == 3) { SyntaxTrivia trivia = leadingTrivia .SkipWhile(f => f.IsWhitespaceTrivia()) .FirstOrDefault(); if (trivia.IsEndOfLineTrivia() && trailingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia()) && leadingTrivia.All(f => f.IsWhitespaceOrEndOfLineTrivia())) { context.ReportDiagnostic( DiagnosticDescriptors.RemoveRedundantEmptyLine, Location.Create(switchStatement.SyntaxTree, TextSpan.FromBounds(section.FullSpan.Start, trivia.Span.End))); } } } prevSection = sections[i]; } } } }
public override SyntaxNode VisitSwitchSection(SwitchSectionSyntax node) { node = (SwitchSectionSyntax)base.VisitSwitchSection(node); var oldStatements = node.Statements; if (oldStatements.Count == 0) //empty case - used for fall-through { return(node); } var caseTrailing = node.GetTrailingTrivia(); var caseLeading = node.GetLeadingTrivia(); var trueBlock = ToBlockSyntax(oldStatements, caseLeading, caseTrailing); node = node.WithStatements(trueBlock); return(node); }
private static void AnalyzeSwitchStatement(SyntaxNodeAnalysisContext context) { var switchStatement = (SwitchStatementSyntax)context.Node; SyntaxList <SwitchSectionSyntax> sections = switchStatement.Sections; SyntaxList <SwitchSectionSyntax> .Enumerator en = sections.GetEnumerator(); if (!en.MoveNext()) { return; } SwitchSectionSyntax previousSection = en.Current; var previousBlock = previousSection.Statements.SingleOrDefault(shouldThrow: false) as BlockSyntax; while (en.MoveNext()) { SyntaxTriviaList leadingTrivia = en.Current.Labels[0].GetLeadingTrivia(); if (SyntaxTriviaAnalysis.IsEmptyOrSingleWhitespaceTrivia(leadingTrivia)) { SyntaxTriviaList trailingTrivia = previousSection.GetTrailingTrivia(); if (SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(trailingTrivia) && (context.GetBlankLineBetweenClosingBraceAndSwitchSection() != false || previousBlock == null)) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.AddBlankLineBetweenSwitchSections, Location.Create(switchStatement.SyntaxTree, trailingTrivia.Last().Span.WithLength(0))); } } previousSection = en.Current; previousBlock = en.Current.Statements.SingleOrDefault(shouldThrow: false) as BlockSyntax; } }