diff --git a/src/Workspaces/CSharp/Portable/Formatting/Engine/Trivia/TriviaDataFactory.ComplexTrivia.cs b/src/Workspaces/CSharp/Portable/Formatting/Engine/Trivia/TriviaDataFactory.ComplexTrivia.cs index bd5a31894e281e980ba7bf461e4976c78ad898e6..2bbe8cdda691d20c6abf6bef0dfdc307735b4b70 100644 --- a/src/Workspaces/CSharp/Portable/Formatting/Engine/Trivia/TriviaDataFactory.ComplexTrivia.cs +++ b/src/Workspaces/CSharp/Portable/Formatting/Engine/Trivia/TriviaDataFactory.ComplexTrivia.cs @@ -74,7 +74,8 @@ private bool ShouldFormat(FormattingContext context) var commonToken1 = this.Token1; var commonToken2 = this.Token2; - var span = TextSpan.FromBounds(commonToken1.Span.End, commonToken2.Span.Start); + var formatSpanEnd = commonToken2.Kind() == SyntaxKind.None ? commonToken1.Span.End : commonToken2.Span.Start; + var span = TextSpan.FromBounds(commonToken1.Span.End, formatSpanEnd); if (context.IsSpacingSuppressed(span)) { return false; diff --git a/src/Workspaces/CSharpTest/Formatting/FormattingTriviaTests.cs b/src/Workspaces/CSharpTest/Formatting/FormattingTriviaTests.cs index 7bd0ac85dc3e4695ac47b8e1b4252f814df7a754..e26cfc8d5a3f1aeb1d21f216b14fb0f70c0d5fb9 100644 --- a/src/Workspaces/CSharpTest/Formatting/FormattingTriviaTests.cs +++ b/src/Workspaces/CSharpTest/Formatting/FormattingTriviaTests.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Linq; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Test.Utilities; using Microsoft.CodeAnalysis.Formatting; -using Microsoft.CodeAnalysis.Options; using Roslyn.Test.Utilities; using Xunit; @@ -1723,5 +1720,45 @@ public void NewLineOptions_LineFeedOnly() Assert.Equal(expected, actual); } + + [WorkItem(4019, "https://github.com/dotnet/roslyn/issues/4019")] + [Fact, Trait(Traits.Feature, Traits.Features.Formatting)] + public void FormatWithTabs() + { + + var code = @"#region Assembly mscorlib +// C:\ +#endregion + +using System.Collections; + +class F +{ + string s; +}"; + var expected = @"#region Assembly mscorlib +// C:\ +#endregion + +using System.Collections; + +class F +{ + string s; +}"; + var tree = SyntaxFactory.ParseCompilationUnit(code); + + var newLineText = SyntaxFactory.ElasticEndOfLine(DefaultWorkspace.Options.GetOption(FormattingOptions.NewLine, LanguageNames.CSharp)); + + tree = tree.ReplaceTokens(tree.DescendantTokens(descendIntoTrivia: true) + .Where(tr => tr.IsKind(SyntaxKind.EndOfDirectiveToken)), (o, r) => o.WithTrailingTrivia(o.LeadingTrivia.Add(newLineText)) + .WithLeadingTrivia(SyntaxFactory.TriviaList()) + .WithAdditionalAnnotations(SyntaxAnnotation.ElasticAnnotation)); + + var formatted = Formatter.Format(tree, DefaultWorkspace, DefaultWorkspace.Options.WithChangedOption(FormattingOptions.UseTabs, LanguageNames.CSharp, true)); + + var actual = formatted.ToFullString(); + Assert.Equal(expected, actual); + } } }