private async Task <Document> AddNewLineAfterUsingBlock(Document document, UsingDirectiveSyntax usingDirective, CancellationToken cancellationToken) { var newUsingDirective = usingDirective .WithTrailingTrivia( usingDirective.GetTrailingTrivia().Add(SyntaxFactory.EndOfLine(Environment.NewLine))); var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); root = root.ReplaceNode(usingDirective, newUsingDirective); return(document.WithSyntaxRoot(root)); }
private static void Analyze( SyntaxNodeAnalysisContext context, UsingDirectiveSyntax usingDirective, SyntaxToken nextToken) { SyntaxTriviaList trailingTrivia = usingDirective.GetTrailingTrivia(); if (!SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(triviaList: trailingTrivia)) { return; } SyntaxTriviaList.Enumerator en = nextToken.LeadingTrivia.GetEnumerator(); if (en.MoveNext()) { if (en.Current.IsWhitespaceTrivia() && !en.MoveNext()) { ReportDiagnostic(trailingTrivia.Last().SpanStart); } else { switch (en.Current.Kind()) { case SyntaxKind.SingleLineCommentTrivia: case SyntaxKind.SingleLineDocumentationCommentTrivia: case SyntaxKind.MultiLineDocumentationCommentTrivia: { ReportDiagnostic(trailingTrivia.Last().SpanStart); break; } } } } else { ReportDiagnostic(trailingTrivia.Last().SpanStart); } void ReportDiagnostic(int position) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.AddBlankLineAfterUsingDirectiveList, Location.Create(usingDirective.SyntaxTree, new TextSpan(position, 0))); } }
internal static SyntaxRemoveOptions GetRemoveOptions(UsingDirectiveSyntax usingDirective) { SyntaxRemoveOptions removeOptions = SyntaxRemoveOptions.KeepExteriorTrivia | SyntaxRemoveOptions.KeepUnbalancedDirectives; if (!usingDirective.HasLeadingTrivia) { removeOptions &= ~SyntaxRemoveOptions.KeepLeadingTrivia; } SyntaxTriviaList trailingTrivia = usingDirective.GetTrailingTrivia(); if (trailingTrivia.Count == 1 && trailingTrivia.First().IsEndOfLineTrivia()) { removeOptions &= ~SyntaxRemoveOptions.KeepTrailingTrivia; } return(removeOptions); }
private static UsingDirectiveSyntax RemoveLeadingAndTrailingCompilerDirectives(UsingDirectiveSyntax usingSyntax) { UsingDirectiveSyntax usingDirectiveToUse = usingSyntax; if (usingDirectiveToUse.HasLeadingTrivia) { if (usingDirectiveToUse.HasLeadingTrivia) { var newLeadingTrivia = RemoveCompilerDirectives(usingDirectiveToUse.GetLeadingTrivia()); usingDirectiveToUse = usingDirectiveToUse.WithLeadingTrivia(newLeadingTrivia); } if (usingDirectiveToUse.HasTrailingTrivia) { var newTrailingTrivia = RemoveCompilerDirectives(usingDirectiveToUse.GetTrailingTrivia()); usingDirectiveToUse = usingDirectiveToUse.WithTrailingTrivia(newTrailingTrivia); } } return(usingDirectiveToUse); }
private static void AnalyzeUsings(SyntaxNodeAnalysisContext context, SyntaxList <UsingDirectiveSyntax> usings) { int count = usings.Count; if (count <= 1) { return; } UsingDirectiveSyntax usingDirective1 = usings[0]; for (int i = 1; i < count; i++, usingDirective1 = usings[i - 1]) { if (usingDirective1.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective1.Alias != null) { return; } UsingDirectiveSyntax usingDirective2 = usings[i]; if (usingDirective2.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective2.Alias != null) { return; } SyntaxTriviaList trailingTrivia = usingDirective1.GetTrailingTrivia(); if (!SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(trailingTrivia)) { continue; } IdentifierNameSyntax rootNamespace1 = usingDirective1.GetRootNamespace(); if (rootNamespace1 == null) { continue; } IdentifierNameSyntax rootNamespace2 = usingDirective2.GetRootNamespace(); if (rootNamespace2 == null) { continue; } SyntaxTriviaList leadingTrivia = usingDirective2.GetLeadingTrivia(); bool isEmptyLine = SyntaxTriviaAnalysis.StartsWithOptionalWhitespaceThenEndOfLineTrivia(leadingTrivia); if (string.Equals(rootNamespace1.Identifier.ValueText, rootNamespace2.Identifier.ValueText, StringComparison.Ordinal)) { if (isEmptyLine) { DiagnosticHelpers.ReportDiagnosticIfNotSuppressed( context, DiagnosticDescriptors.RemoveEmptyLineBetweenUsingDirectivesWithSameRootNamespace, Location.Create(context.Node.SyntaxTree, leadingTrivia[0].Span.WithLength(0))); } } else if (!context.IsAnalyzerSuppressed(DiagnosticDescriptors.AddEmptyLineBetweenUsingDirectivesWithDifferentRootNamespaceOrViceVersa)) { if (isEmptyLine) { if (!context.IsAnalyzerSuppressed(AnalyzerOptions.RemoveEmptyLineBetweenUsingDirectivesWithDifferentRootNamespace)) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticDescriptors.ReportOnly.RemoveEmptyLineBetweenUsingDirectivesWithDifferentRootNamespace, Location.Create(context.Node.SyntaxTree, leadingTrivia[0].Span.WithLength(0)), properties: DiagnosticProperties.AnalyzerOption_Invert); } } else if (context.IsAnalyzerSuppressed(AnalyzerOptions.RemoveEmptyLineBetweenUsingDirectivesWithDifferentRootNamespace)) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticDescriptors.AddEmptyLineBetweenUsingDirectivesWithDifferentRootNamespaceOrViceVersa, Location.Create(context.Node.SyntaxTree, trailingTrivia.Last().Span.WithLength(0))); } } } }
private static void AnalyzeUsings(SyntaxNodeAnalysisContext context, SyntaxList <UsingDirectiveSyntax> usings) { int count = usings.Count; if (count <= 1) { return; } UsingDirectiveSyntax usingDirective1 = usings[0]; for (int i = 1; i < count; i++, usingDirective1 = usings[i - 1]) { if (usingDirective1.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective1.Alias != null) { return; } UsingDirectiveSyntax usingDirective2 = usings[i]; if (usingDirective2.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective2.Alias != null) { return; } SyntaxTriviaList trailingTrivia = usingDirective1.GetTrailingTrivia(); if (!SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(trailingTrivia)) { continue; } IdentifierNameSyntax rootNamespace1 = usingDirective1.GetRootNamespace(); if (rootNamespace1 == null) { continue; } IdentifierNameSyntax rootNamespace2 = usingDirective2.GetRootNamespace(); if (rootNamespace2 == null) { continue; } SyntaxTriviaList leadingTrivia = usingDirective2.GetLeadingTrivia(); bool isEmptyLine = SyntaxTriviaAnalysis.StartsWithOptionalWhitespaceThenEndOfLineTrivia(leadingTrivia); if (string.Equals(rootNamespace1.Identifier.ValueText, rootNamespace2.Identifier.ValueText, StringComparison.Ordinal)) { if (isEmptyLine) { if (DiagnosticRules.RemoveBlankLineBetweenUsingDirectivesWithSameRootNamespace.IsEffective(context)) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.RemoveBlankLineBetweenUsingDirectivesWithSameRootNamespace, Location.Create(context.Node.SyntaxTree, leadingTrivia[0].Span.WithLength(0))); } if (DiagnosticRules.BlankLineBetweenUsingDirectives.IsEffective(context) && context.GetBlankLineBetweenUsingDirectives() == UsingDirectiveBlankLineStyle.Never) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.BlankLineBetweenUsingDirectives, Location.Create(context.Node.SyntaxTree, leadingTrivia[0].Span.WithLength(0)), properties: DiagnosticProperties.AnalyzerOption_Invert, "Remove"); } } } else if (DiagnosticRules.BlankLineBetweenUsingDirectives.IsEffective(context)) { UsingDirectiveBlankLineStyle style = context.GetBlankLineBetweenUsingDirectives(); if (isEmptyLine) { if (style == UsingDirectiveBlankLineStyle.Never) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.BlankLineBetweenUsingDirectives, Location.Create(context.Node.SyntaxTree, leadingTrivia[0].Span.WithLength(0)), properties: DiagnosticProperties.AnalyzerOption_Invert, "Remove"); } } else if (style == UsingDirectiveBlankLineStyle.SeparateGroups) { DiagnosticHelpers.ReportDiagnostic( context, DiagnosticRules.BlankLineBetweenUsingDirectives, Location.Create(context.Node.SyntaxTree, trailingTrivia.Last().Span.WithLength(0)), "Add"); } } } }
private static void AnalyzeUsings(SyntaxNodeAnalysisContext context, SyntaxList <UsingDirectiveSyntax> usings) { int count = usings.Count; if (count <= 1) { return; } UsingDirectiveSyntax usingDirective1 = usings[0]; for (int i = 1; i < count; i++, usingDirective1 = usings[i - 1]) { if (usingDirective1.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective1.Alias != null) { return; } UsingDirectiveSyntax usingDirective2 = usings[i]; if (usingDirective2.StaticKeyword.IsKind(SyntaxKind.StaticKeyword)) { return; } if (usingDirective2.Alias != null) { return; } SyntaxTriviaList trailingTrivia = usingDirective1.GetTrailingTrivia(); if (!SyntaxTriviaAnalysis.IsOptionalWhitespaceThenOptionalSingleLineCommentThenEndOfLineTrivia(trailingTrivia)) { continue; } IdentifierNameSyntax rootNamespace1 = usingDirective1.GetRootNamespace(); if (rootNamespace1 == null) { continue; } IdentifierNameSyntax rootNamespace2 = usingDirective2.GetRootNamespace(); if (rootNamespace2 == null) { continue; } SyntaxTriviaList leadingTrivia = usingDirective2.GetLeadingTrivia(); bool isEmptyLine = SyntaxTriviaAnalysis.StartsWithOptionalWhitespaceThenEndOfLineTrivia(leadingTrivia); if (string.Equals(rootNamespace1.Identifier.ValueText, rootNamespace2.Identifier.ValueText, StringComparison.Ordinal)) { if (isEmptyLine) { ReportDiagnostic( context, DiagnosticDescriptors.RemoveEmptyLineBetweenUsingDirectivesWithSameRootNamespace, leadingTrivia[0]); } } else if (isEmptyLine) { ReportDiagnostic( context, DiagnosticDescriptors.RemoveEmptyLineBetweenUsingDirectivesWithDifferentRootNamespace, leadingTrivia[0]); } else { ReportDiagnostic( context, DiagnosticDescriptors.AddEmptyLineBetweenUsingDirectivesWithDifferentRootNamespace, trailingTrivia.Last()); } } }
private UsingDirectiveSyntax SingleTrailingTrivia(UsingDirectiveSyntax usingDirectiveSyntax) { if (usingDirectiveSyntax.HasTrailingTrivia) { return(usingDirectiveSyntax.WithoutLeadingTrivia().WithTrailingTrivia(usingDirectiveSyntax.GetTrailingTrivia()[0])); } if (usingDirectiveSyntax.HasLeadingTrivia) { return(usingDirectiveSyntax.WithoutLeadingTrivia()); } return(usingDirectiveSyntax); }