diff --git a/src/EditorFeatures/CSharp/BlockCommentEditing/BlockCommentEditingCommandHandler.cs b/src/EditorFeatures/CSharp/BlockCommentEditing/BlockCommentEditingCommandHandler.cs index f69be48b621220367b5c62d08e8f6ea0952ec0a5..c6d12c1248cf122a4e3da4b6b941602a19394543 100644 --- a/src/EditorFeatures/CSharp/BlockCommentEditing/BlockCommentEditingCommandHandler.cs +++ b/src/EditorFeatures/CSharp/BlockCommentEditing/BlockCommentEditingCommandHandler.cs @@ -2,9 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +#nullable enable + using System; using System.ComponentModel.Composition; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Threading; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Editor.Shared.Extensions; @@ -88,7 +91,7 @@ private Span GetReplacementSpan(SnapshotPoint caretPosition) return Span.FromBounds(start, end); } - private string GetTextToInsert(SnapshotPoint caretPosition) + private string? GetTextToInsert(SnapshotPoint caretPosition) { var currentLine = caretPosition.GetContainingLine(); var firstNonWhitespacePosition = currentLine.GetFirstNonWhitespacePosition() ?? -1; @@ -128,7 +131,7 @@ private string GetTextToInsert(SnapshotPoint caretPosition) var newLine = options.GetOption(FormattingOptions.NewLine, LanguageNames.CSharp); return newLine + exteriorText; - string GetExteriorText() + string? GetExteriorText() { if (startsWithBlockCommentStartString) { @@ -231,7 +234,8 @@ private static bool BlockCommentEndsRightAfterCaret(SnapshotPoint caretPosition) } public static bool IsCaretInsideBlockCommentSyntax( - SnapshotPoint caretPosition, out Document document, out SyntaxTrivia trivia) + SnapshotPoint caretPosition, + [NotNullWhen(true)] out Document? document, out SyntaxTrivia trivia) { trivia = default; @@ -240,7 +244,7 @@ private static bool BlockCommentEndsRightAfterCaret(SnapshotPoint caretPosition) if (document == null) return false; - var syntaxTree = document.GetSyntaxTreeSynchronously(CancellationToken.None); + var syntaxTree = document.GetRequiredSyntaxTreeSynchronously(CancellationToken.None); trivia = syntaxTree.FindTriviaAndAdjustForEndOfFile(caretPosition, CancellationToken.None); var isBlockComment = trivia.IsKind(SyntaxKind.MultiLineCommentTrivia) || trivia.IsKind(SyntaxKind.MultiLineDocumentationCommentTrivia); diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/DocumentExtensions.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/DocumentExtensions.cs index 9c189e5a3f15c42e0f8df1799ed77f4dac7d6ce6..5e501a3d94168910e2ec8dd31440c3c0cd9e490a 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/DocumentExtensions.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Extensions/DocumentExtensions.cs @@ -41,6 +41,12 @@ public static async Task GetRequiredSyntaxTreeAsync(this Document do return syntaxTree ?? throw new InvalidOperationException(string.Format(WorkspaceExtensionsResources.SyntaxTree_is_required_to_accomplish_the_task_but_is_not_supported_by_document_0, document.Name)); } + public static SyntaxTree GetRequiredSyntaxTreeSynchronously(this Document document, CancellationToken cancellationToken) + { + var syntaxTree = document.GetSyntaxTreeSynchronously(cancellationToken); + return syntaxTree ?? throw new InvalidOperationException(string.Format(WorkspaceExtensionsResources.SyntaxTree_is_required_to_accomplish_the_task_but_is_not_supported_by_document_0, document.Name)); + } + public static async Task GetRequiredSyntaxRootAsync(this Document document, CancellationToken cancellationToken) { var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);