diff --git a/eng/Versions.props b/eng/Versions.props
index c5065fec0f5..2f16cc862c3 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -125,7 +125,7 @@
1.0.15
4.16.0
2.7.74
- 0.18.1
+ 0.19.4
1.37.13
2.8.21
3.3.2
diff --git a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/CompletionListSerializationBenchmark.cs b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/CompletionListSerializationBenchmark.cs
index ed8aa905dc4..c569ff0f4d4 100644
--- a/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/CompletionListSerializationBenchmark.cs
+++ b/src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/CompletionListSerializationBenchmark.cs
@@ -6,7 +6,7 @@
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.LanguageServer.Completion;
using Microsoft.CodeAnalysis.Razor.Completion;
-using Microsoft.CodeAnalysis.Razor.Serialization;
+using Microsoft.AspNetCore.Razor.LanguageServer.Serialization;
using Microsoft.VisualStudio.Editor.Razor;
using Newtonsoft.Json;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
@@ -30,9 +30,12 @@ public CompletionListSerializationBenchmark()
CompletionList = GenerateCompletionList(documentContent, queryIndex, tagHelperCompletionProvider);
_completionListBuffer = GenerateBuffer(CompletionList);
- Serializer.Instance.JsonSerializer.Converters.Add(TagHelperDescriptorJsonConverter.Instance);
+ Serializer = new LspSerializer();
+ Serializer.RegisterRazorConverters();
}
+ private LspSerializer Serializer { get; }
+
private CompletionList CompletionList { get; }
[Benchmark(Description = "Component Completion List Roundtrip Serialization")]
@@ -43,7 +46,7 @@ public void ComponentElement_CompletionList_Serialization_RoundTrip()
using (originalStream = new MemoryStream())
using (var writer = new StreamWriter(originalStream, Encoding.UTF8, bufferSize: 4096))
{
- Serializer.Instance.JsonSerializer.Serialize(writer, CompletionList);
+ Serializer.JsonSerializer.Serialize(writer, CompletionList);
}
CompletionList deserializedCompletions;
@@ -51,7 +54,7 @@ public void ComponentElement_CompletionList_Serialization_RoundTrip()
using (stream)
using (var reader = new JsonTextReader(new StreamReader(stream)))
{
- deserializedCompletions = Serializer.Instance.JsonSerializer.Deserialize(reader);
+ deserializedCompletions = Serializer.JsonSerializer.Deserialize(reader);
}
}
@@ -60,7 +63,7 @@ public void ComponentElement_CompletionList_Serialization()
{
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream, Encoding.UTF8, bufferSize: 4096);
- Serializer.Instance.JsonSerializer.Serialize(writer, CompletionList);
+ Serializer.JsonSerializer.Serialize(writer, CompletionList);
}
[Benchmark(Description = "Component Completion List Deserialization")]
@@ -70,7 +73,7 @@ public void ComponentElement_CompletionList_Deserialization()
using var stream = new MemoryStream(_completionListBuffer);
using var reader = new JsonTextReader(new StreamReader(stream));
CompletionList deserializedCompletions;
- deserializedCompletions = Serializer.Instance.JsonSerializer.Deserialize(reader);
+ deserializedCompletions = Serializer.JsonSerializer.Deserialize(reader);
}
private CompletionList GenerateCompletionList(string documentContent, int queryIndex, TagHelperCompletionProvider componentCompletionProvider)
@@ -98,11 +101,11 @@ private CompletionList GenerateCompletionList(string documentContent, int queryI
return completionList;
}
- private static byte[] GenerateBuffer(CompletionList completionList)
+ private byte[] GenerateBuffer(CompletionList completionList)
{
using var stream = new MemoryStream();
using var writer = new StreamWriter(stream, Encoding.UTF8, bufferSize: 4096);
- Serializer.Instance.JsonSerializer.Serialize(writer, completionList);
+ Serializer.JsonSerializer.Serialize(writer, completionList);
var buffer = stream.GetBuffer();
return buffer;
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer.Common/Serialization/JsonConverterCollectionExtensions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer.Common/Serialization/JsonConverterCollectionExtensions.cs
index 02bf87a25a9..95c8a1ac7d0 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer.Common/Serialization/JsonConverterCollectionExtensions.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer.Common/Serialization/JsonConverterCollectionExtensions.cs
@@ -21,7 +21,7 @@ internal static class JsonConverterCollectionExtensions
ProjectSnapshotJsonConverter.Instance,
};
- public static void RegisterRazorConverters(this JsonConverterCollection collection)
+ public static void RegisterRazorConverters(this IList collection)
{
if (collection == null)
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs
index 14becc900d4..b5ee8519452 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/AddUsingsCodeActionResolver.cs
@@ -83,11 +83,11 @@ public override async Task ResolveAsync(JObject data, Cancellatio
return null;
}
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier() { Uri = actionParams.Uri };
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier() { Uri = actionParams.Uri };
return CreateAddUsingWorkspaceEdit(actionParams.Namespace, codeDocument, codeDocumentIdentifier);
}
- internal static WorkspaceEdit CreateAddUsingWorkspaceEdit(string @namespace, RazorCodeDocument codeDocument, VersionedTextDocumentIdentifier codeDocumentIdentifier)
+ internal static WorkspaceEdit CreateAddUsingWorkspaceEdit(string @namespace, RazorCodeDocument codeDocument, OptionalVersionedTextDocumentIdentifier codeDocumentIdentifier)
{
/* The heuristic is as follows:
*
@@ -127,7 +127,7 @@ internal static WorkspaceEdit CreateAddUsingWorkspaceEdit(string @namespace, Raz
private static WorkspaceEditDocumentChange GenerateSingleUsingEditsInterpolated(
RazorCodeDocument codeDocument,
- VersionedTextDocumentIdentifier codeDocumentIdentifier,
+ OptionalVersionedTextDocumentIdentifier codeDocumentIdentifier,
string newUsingNamespace,
List existingUsingDirectives)
{
@@ -172,7 +172,7 @@ private static WorkspaceEditDocumentChange GenerateSingleUsingEditsInterpolated(
private static WorkspaceEditDocumentChange GenerateSingleUsingEditsAtTop(
RazorCodeDocument codeDocument,
- VersionedTextDocumentIdentifier codeDocumentIdentifier,
+ OptionalVersionedTextDocumentIdentifier codeDocumentIdentifier,
string newUsingNamespace)
{
var head = new Position(0, 0);
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/AddUsingsCSharpCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/AddUsingsCSharpCodeActionResolver.cs
index c22307d20fa..c8cd478ac9c 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/AddUsingsCSharpCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/AddUsingsCSharpCodeActionResolver.cs
@@ -115,13 +115,14 @@ public async override Task ResolveAsync(
return version;
}, cancellationToken).ConfigureAwait(false);
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier()
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier()
{
Uri = csharpParams.RazorFileUri,
Version = documentVersion.Value
};
- resolvedCodeAction.Edit = AddUsingsCodeActionResolver.CreateAddUsingWorkspaceEdit(@namespace, codeDocument, codeDocumentIdentifier);
+ var edit = AddUsingsCodeActionResolver.CreateAddUsingWorkspaceEdit(@namespace, codeDocument, codeDocumentIdentifier);
+ resolvedCodeAction = resolvedCodeAction with { Edit = edit };
return resolvedCodeAction;
}
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/DefaultCSharpCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/DefaultCSharpCodeActionResolver.cs
index d7a06ff7044..637c865dd63 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/DefaultCSharpCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/DefaultCSharpCodeActionResolver.cs
@@ -140,22 +140,23 @@ public async override Task ResolveAsync(
return version;
}, cancellationToken).ConfigureAwait(false);
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier()
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier()
{
Uri = csharpParams.RazorFileUri,
Version = documentVersion.Value
};
-
- resolvedCodeAction.Edit = new WorkspaceEdit()
+ resolvedCodeAction = resolvedCodeAction with
{
- DocumentChanges = new[] {
- new WorkspaceEditDocumentChange(
- new TextDocumentEdit()
- {
- TextDocument = codeDocumentIdentifier,
- Edits = formattedEdits,
- }
- )
+ Edit = new WorkspaceEdit()
+ {
+ DocumentChanges = new[] {
+ new WorkspaceEditDocumentChange(
+ new TextDocumentEdit()
+ {
+ TextDocument = codeDocumentIdentifier,
+ Edits = formattedEdits,
+ })
+ }
}
};
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs
index 36fa575690b..6b14c1808c2 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/TypeAccessibilityCodeActionProvider.cs
@@ -191,8 +191,8 @@ private static IEnumerable ProcessCodeActionsVS(
else if (codeAction.Name.Equals(RazorPredefinedCodeFixProviderNames.AddImport, StringComparison.Ordinal) &&
AddUsingsCodeActionProviderFactory.TryExtractNamespace(codeAction.Title, out var @namespace))
{
- codeAction.Title = $"@using {@namespace}";
- typeAccessibilityCodeActions.Add(codeAction.WrapResolvableCSharpCodeAction(context, LanguageServerConstants.CodeActions.AddUsing));
+ var newCodeAction = codeAction with { Title = $"@using {@namespace}" };
+ typeAccessibilityCodeActions.Add(newCodeAction.WrapResolvableCSharpCodeAction(context, LanguageServerConstants.CodeActions.AddUsing));
}
// Not a type accessibility code action
else
@@ -234,7 +234,7 @@ private static RazorCodeAction CreateFQNCodeAction(
RazorCodeAction codeAction,
string fullyQualifiedName)
{
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier() { Uri = context.Request.TextDocument.Uri };
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier() { Uri = context.Request.TextDocument.Uri };
var fqnTextEdit = new TextEdit()
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/UnformattedRemappingCSharpCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/UnformattedRemappingCSharpCodeActionResolver.cs
index ec51cac1a67..2f4f87b5f13 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/UnformattedRemappingCSharpCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CSharp/UnformattedRemappingCSharpCodeActionResolver.cs
@@ -111,25 +111,27 @@ public async override Task ResolveAsync(
return codeAction;
}
- textEdit.Range = originalRange;
+ textEdit = textEdit with { Range = originalRange };
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier()
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier()
{
Uri = csharpParams.RazorFileUri,
Version = documentVersion
};
- resolvedCodeAction.Edit = new WorkspaceEdit()
+ resolvedCodeAction = resolvedCodeAction with
{
- DocumentChanges = new[] {
+ Edit = new WorkspaceEdit()
+ {
+ DocumentChanges = new[] {
new WorkspaceEditDocumentChange(
new TextDocumentEdit()
{
TextDocument = codeDocumentIdentifier,
Edits = new[] { textEdit },
- }
- )
+ })
}
+ },
};
return resolvedCodeAction;
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionEndpoint.cs
index e43cafba73c..1361539cc0a 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionEndpoint.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionEndpoint.cs
@@ -16,11 +16,12 @@
using Microsoft.CodeAnalysis.Razor.Workspaces;
using Microsoft.CodeAnalysis.Text;
using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
+using OmniSharp.Extensions.LanguageServer.Protocol.Document;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions
{
- internal class CodeActionEndpoint : IRazorCodeActionHandler
+ internal class CodeActionEndpoint : ICodeActionHandler
{
private readonly RazorDocumentMappingService _documentMappingService;
private readonly IEnumerable _razorCodeActionProviders;
@@ -56,8 +57,10 @@ public CodeActionEndpoint(
_allAvailableCodeActionNames = GetAllAvailableCodeActionNames();
}
- public CodeActionRegistrationOptions GetRegistrationOptions()
+ public CodeActionRegistrationOptions GetRegistrationOptions(CodeActionCapability capability, ClientCapabilities clientCapabilities)
{
+ _capability = capability;
+ _supportsCodeActionResolve = _capability.ResolveSupport != null;
return new CodeActionRegistrationOptions()
{
DocumentSelector = RazorDefaults.Selector,
@@ -70,14 +73,7 @@ public CodeActionRegistrationOptions GetRegistrationOptions()
};
}
- public void SetCapability(CodeActionCapability capability)
- {
- _capability = capability;
-
- _supportsCodeActionResolve = _capability.ResolveSupport != null;
- }
-
- public async Task Handle(RazorCodeActionParams request, CancellationToken cancellationToken)
+ public async Task Handle(CodeActionParams request, CancellationToken cancellationToken)
{
if (request is null)
{
@@ -119,7 +115,7 @@ public async Task Handle(RazorCodeActionParams req
}
// internal for testing
- internal async Task GenerateRazorCodeActionContextAsync(RazorCodeActionParams request, CancellationToken cancellationToken)
+ internal async Task GenerateRazorCodeActionContextAsync(CodeActionParams request, CancellationToken cancellationToken)
{
var documentSnapshot = await _projectSnapshotManagerDispatcher.RunOnDispatcherThreadAsync(() =>
{
@@ -148,16 +144,12 @@ internal async Task GenerateRazorCodeActionContextAsync(
// context.
//
// Note: VS Code doesn't provide a `SelectionRange`.
- if (request.Context.SelectionRange != null)
+ var vsCodeActionContext = (OmniSharpVSCodeActionContext)request.Context;
+ if (vsCodeActionContext.SelectionRange != null)
{
- request.Range = request.Context.SelectionRange;
+ request = request with { Range = vsCodeActionContext.SelectionRange };
}
- // We hide `CodeActionParams.CodeActionContext` in order to capture
- // `RazorCodeActionParams.ExtendedCodeActionContext`, we must
- // restore this context to access diagnostics.
- (request as CodeActionParams).Context = request.Context;
-
var linePosition = new LinePosition(
request.Range.Start.Line,
request.Range.Start.Character);
@@ -255,11 +247,11 @@ internal async Task> GetCSharpCodeActionsFromLangua
return Array.Empty();
}
- context.Request.Range = projectedRange;
+ var newRequest = context.Request with { Range = projectedRange };
cancellationToken.ThrowIfCancellationRequested();
- var response = await _languageServer.SendRequestAsync(LanguageServerConstants.RazorProvideCodeActionsEndpoint, context.Request);
+ var response = await _languageServer.SendRequestAsync(LanguageServerConstants.RazorProvideCodeActionsEndpoint, newRequest);
return await response.Returning(cancellationToken);
}
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionResolutionEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionResolutionEndpoint.cs
index c92b0990f37..3a6075c00ba 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionResolutionEndpoint.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/CodeActionResolutionEndpoint.cs
@@ -68,7 +68,7 @@ public async Task Handle(CodeAction request, CancellationToken cance
// as it does not support Command.Edit based code actions anymore.
if (resolutionParams.Action == LanguageServerConstants.CodeActions.EditBasedCodeActionCommand)
{
- request.Edit = (resolutionParams.Data as JObject)?.ToObject();
+ request = request with { Edit = (resolutionParams.Data as JObject)?.ToObject() };
return request;
}
@@ -101,8 +101,8 @@ internal async Task ResolveRazorCodeActionAsync(
Debug.Fail($"No resolver registered for {GetCodeActionId(resolutionParams)}.");
return codeAction;
}
-
- codeAction.Edit = await resolver.ResolveAsync(resolutionParams.Data as JObject, cancellationToken).ConfigureAwait(false);
+ var edit = await resolver.ResolveAsync(resolutionParams.Data as JObject, cancellationToken).ConfigureAwait(false);
+ codeAction = codeAction with { Edit = edit };
return codeAction;
}
@@ -119,7 +119,7 @@ internal async Task ResolveCSharpCodeActionAsync(
}
var csharpParams = csharpParamsObj.ToObject();
- codeAction.Data = csharpParams.Data as JToken;
+ codeAction = codeAction with { Data = csharpParams.Data as JToken };
if (!_csharpCodeActionResolvers.TryGetValue(resolutionParams.Action, out var resolver))
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/IRazorCodeActionHandler.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/IRazorCodeActionHandler.cs
deleted file mode 100644
index bb1c319de26..00000000000
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/IRazorCodeActionHandler.cs
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the MIT license. See License.txt in the project root for license information.
-
-using OmniSharp.Extensions.JsonRpc;
-using OmniSharp.Extensions.LanguageServer.Protocol.Models;
-using Microsoft.AspNetCore.Razor.LanguageServer.CodeActions.Models;
-using OmniSharp.Extensions.LanguageServer.Protocol;
-using OmniSharp.Extensions.LanguageServer.Protocol.Client.Capabilities;
-
-namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions
-{
- [Parallel, Method("textDocument/codeAction", Direction.ClientToServer)]
- internal interface IRazorCodeActionHandler :
- IJsonRpcRequestHandler,
- IRegistration,
- ICapability
- {
- }
-}
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/CodeActionExtensions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/CodeActionExtensions.cs
index fc9b42b7f65..e22f6310e22 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/CodeActionExtensions.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/CodeActionExtensions.cs
@@ -68,7 +68,7 @@ public static RazorCodeAction WrapResolvableCSharpCodeAction(
Language = LanguageServerConstants.CodeActions.Languages.CSharp,
Data = csharpParams
};
- razorCodeAction.Data = JToken.FromObject(resolutionParams);
+ razorCodeAction = razorCodeAction with { Data = JToken.FromObject(resolutionParams) };
if (razorCodeAction.Children?.Length != 0)
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/ExtendedCodeActionContext.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/OmniSharpVSCodeActionContext.cs
similarity index 65%
rename from src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/ExtendedCodeActionContext.cs
rename to src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/OmniSharpVSCodeActionContext.cs
index be438a89ad3..3e1ee7ce489 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/ExtendedCodeActionContext.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/OmniSharpVSCodeActionContext.cs
@@ -1,14 +1,17 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the MIT license. See License.txt in the project root for license information.
+using Microsoft.AspNetCore.Razor.LanguageServer.Serialization;
using Newtonsoft.Json;
using OmniSharp.Extensions.LanguageServer.Protocol.Models;
using OmniSharp.Extensions.LanguageServer.Protocol.Serialization;
namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions.Models
{
- internal class ExtendedCodeActionContext : CodeActionContext
+ internal record OmniSharpVSCodeActionContext : CodeActionContext
{
+ public static readonly PlatformExtensionConverter JsonConverter = new();
+
[Optional]
[JsonProperty("_vs_selectionRange")]
public Range SelectionRange { get; set; }
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeAction.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeAction.cs
index f3b24fdd5ab..33852ead7bc 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeAction.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeAction.cs
@@ -10,7 +10,7 @@
namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions.Models
{
[DebuggerDisplay("{Title,nq}")]
- internal class RazorCodeAction : CodeAction, IRequest, IBaseRequest
+ internal record RazorCodeAction : CodeAction, IRequest, IBaseRequest
{
///
/// Typically null, only present in VS scenarios.
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeActionParams.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeActionParams.cs
deleted file mode 100644
index b6de73b5ac7..00000000000
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Models/RazorCodeActionParams.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the MIT license. See License.txt in the project root for license information.
-
-using OmniSharp.Extensions.LanguageServer.Protocol.Models;
-
-namespace Microsoft.AspNetCore.Razor.LanguageServer.CodeActions.Models
-{
- internal class RazorCodeActionParams : CodeActionParams
- {
- public new ExtendedCodeActionContext Context { get; set; }
- }
-}
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ComponentAccessibilityCodeActionProvider.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ComponentAccessibilityCodeActionProvider.cs
index 48899f3e08b..b8815a6055c 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ComponentAccessibilityCodeActionProvider.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ComponentAccessibilityCodeActionProvider.cs
@@ -200,7 +200,7 @@ private Dictionary FindMatchingTagHelpers(RazorCodeAction
private static WorkspaceEdit CreateRenameTagEdit(RazorCodeActionContext context, MarkupStartTagSyntax startTag, string newTagName)
{
var textEdits = new List();
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier() { Uri = context.Request.TextDocument.Uri };
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier() { Uri = context.Request.TextDocument.Uri };
var startTagTextEdit = new TextEdit
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/CreateComponentCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/CreateComponentCodeActionResolver.cs
index dd5632c91bd..b070a182f43 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/CreateComponentCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/CreateComponentCodeActionResolver.cs
@@ -106,7 +106,7 @@ private static void TryAddNamespaceDirective(RazorCodeDocument codeDocument, Uri
if (namespaceDirective != null)
{
- var documentIdentifier = new VersionedTextDocumentIdentifier { Uri = newComponentUri };
+ var documentIdentifier = new OptionalVersionedTextDocumentIdentifier { Uri = newComponentUri };
documentChanges.Add(new WorkspaceEditDocumentChange(new TextDocumentEdit
{
TextDocument = documentIdentifier,
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs
index 5eb932f9eff..0a3d222d032 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/CodeActions/Razor/ExtractToCodeBehindCodeActionResolver.cs
@@ -104,8 +104,8 @@ public override async Task ResolveAsync(JObject data, Cancellatio
new Position(start.LineIndex, start.CharacterIndex),
new Position(end.LineIndex, end.CharacterIndex));
- var codeDocumentIdentifier = new VersionedTextDocumentIdentifier { Uri = actionParams.Uri };
- var codeBehindDocumentIdentifier = new VersionedTextDocumentIdentifier { Uri = codeBehindUri };
+ var codeDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier { Uri = actionParams.Uri };
+ var codeBehindDocumentIdentifier = new OptionalVersionedTextDocumentIdentifier { Uri = codeBehindUri };
var documentChanges = new List
{
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/CompletionItemExtensions.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/CompletionItemExtensions.cs
index f5dfd8e20fc..b99f9188fb2 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/CompletionItemExtensions.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/CompletionItemExtensions.cs
@@ -11,16 +11,17 @@ internal static class CompletionItemExtensions
{
private const string ResultIdKey = "_resultId";
- public static void SetCompletionListResultId(this CompletionItem completion, long resultId)
+ public static CompletionItem CreateWithCompletionListResultId(this CompletionItem completionItem, long resultId)
{
- if (completion is null)
+ if (completionItem is null)
{
- throw new ArgumentNullException(nameof(completion));
+ throw new ArgumentNullException(nameof(completionItem));
}
- var data = completion.Data ?? new JObject();
+ var data = completionItem.Data ?? new JObject();
data[ResultIdKey] = resultId;
- completion.Data = data;
+ completionItem = completionItem with { Data = data };
+ return completionItem;
}
public static bool TryGetCompletionListResultId(this CompletionItem completion, out int resultId)
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/OmniSharpVSCompletionContext.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/OmniSharpVSCompletionContext.cs
index 43edfb671a9..27633b16ae7 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/OmniSharpVSCompletionContext.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/OmniSharpVSCompletionContext.cs
@@ -7,7 +7,7 @@
namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
{
- internal class OmniSharpVSCompletionContext : CompletionContext
+ internal record OmniSharpVSCompletionContext : CompletionContext
{
public static readonly PlatformExtensionConverter JsonConverter = new PlatformExtensionConverter();
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs
index 0008a2d2bec..e4d8e607886 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/RazorCompletionEndpoint.cs
@@ -23,7 +23,6 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
{
internal class RazorCompletionEndpoint : ICompletionHandler, ICompletionResolveHandler
{
- private PlatformAgnosticCompletionCapability _capability;
private readonly ILogger _logger;
private readonly ProjectSnapshotManagerDispatcher _projectSnapshotManagerDispatcher;
private readonly DocumentResolver _documentResolver;
@@ -37,9 +36,12 @@ internal class RazorCompletionEndpoint : ICompletionHandler, ICompletionResolveH
Name = "editor.action.triggerSuggest",
Title = RazorLS.Resources.ReTrigger_Completions_Title,
};
-
+ private PlatformAgnosticCompletionCapability _capability;
private IReadOnlyList _supportedItemKinds;
+ // Guid is magically generated and doesn't mean anything. O# magic.
+ public Guid Id => new Guid("011c77cc-f90e-4f2e-b32c-dafc6587ccd6");
+
public RazorCompletionEndpoint(
ProjectSnapshotManagerDispatcher projectSnapshotManagerDispatcher,
DocumentResolver documentResolver,
@@ -94,10 +96,24 @@ public RazorCompletionEndpoint(
_completionListCache = new CompletionListCache();
}
- public void SetCapability(CompletionCapability capability)
+ public void SetCapability(CompletionCapability capability, ClientCapabilities clientCapabilities)
+ {
+ }
+
+ public CompletionRegistrationOptions GetRegistrationOptions(CompletionCapability capability, ClientCapabilities clientCapabilities)
{
_capability = (PlatformAgnosticCompletionCapability)capability;
_supportedItemKinds = _capability.CompletionItemKind.ValueSet.Cast().ToList();
+ return new CompletionRegistrationOptions()
+ {
+ DocumentSelector = RazorDefaults.Selector,
+ ResolveProvider = true,
+ TriggerCharacters = new Container("@", "<", ":"),
+
+ // NOTE: This property is *NOT* processed in O# versions < 0.16
+ // https://github.com/OmniSharp/csharp-language-server-protocol/blame/bdec4c73240be52fbb25a81f6ad7d409f77b5215/src/Protocol/Server/Capabilities/CompletionOptions.cs#L35-L44
+ AllCommitCharacters = new Container(":", ">", " ", "="),
+ };
}
public async Task Handle(CompletionParams request, CancellationToken cancellationToken)
@@ -149,20 +165,6 @@ public async Task Handle(CompletionParams request, CancellationT
return completionList;
}
- public CompletionRegistrationOptions GetRegistrationOptions()
- {
- return new CompletionRegistrationOptions()
- {
- DocumentSelector = RazorDefaults.Selector,
- ResolveProvider = true,
- TriggerCharacters = new Container("@", "<", ":"),
-
- // NOTE: This property is *NOT* processed in O# versions < 0.16
- // https://github.com/OmniSharp/csharp-language-server-protocol/blame/bdec4c73240be52fbb25a81f6ad7d409f77b5215/src/Protocol/Server/Capabilities/CompletionOptions.cs#L35-L44
- AllCommitCharacters = new Container(":", ">", " ", "="),
- };
- }
-
public Task Handle(CompletionItem completionItem, CancellationToken cancellationToken)
{
if (!completionItem.TryGetCompletionListResultId(out var resultId))
@@ -196,13 +198,13 @@ public Task Handle(CompletionItem completionItem, CancellationTo
case RazorCompletionItemKind.Directive:
{
var descriptionInfo = associatedRazorCompletion.GetDirectiveCompletionDescription();
- completionItem.Documentation = descriptionInfo.Description;
+ completionItem = completionItem with { Documentation = descriptionInfo.Description };
break;
}
case RazorCompletionItemKind.MarkupTransition:
{
var descriptionInfo = associatedRazorCompletion.GetMarkupTransitionCompletionDescription();
- completionItem.Documentation = descriptionInfo.Description;
+ completionItem = completionItem with { Documentation = descriptionInfo.Description };
break;
}
case RazorCompletionItemKind.DirectiveAttribute:
@@ -240,13 +242,13 @@ public Task Handle(CompletionItem completionItem, CancellationTo
if (tagHelperMarkupTooltip != null)
{
var documentation = new StringOrMarkupContent(tagHelperMarkupTooltip);
- completionItem.Documentation = documentation;
+ completionItem = completionItem with { Documentation = documentation };
}
if (tagHelperClassifiedTextTooltip != null)
{
var vsCompletionItem = completionItem.ToVSCompletionItem();
- vsCompletionItem.Documentation = string.Empty;
+ completionItem = completionItem with { Documentation = string.Empty };
vsCompletionItem.Description = tagHelperClassifiedTextTooltip;
return Task.FromResult(vsCompletionItem);
}
@@ -291,7 +293,7 @@ internal static CompletionList CreateLSPCompletionList(
if (TryConvert(razorCompletionItem, supportedItemKinds, out var completionItem))
{
// The completion items are cached and can be retrieved via this result id to enable the "resolve" completion functionality.
- completionItem.SetCompletionListResultId(resultId);
+ completionItem = completionItem.CreateWithCompletionListResultId(resultId);
completionItems.Add(completionItem);
}
}
@@ -348,13 +350,16 @@ internal static bool TryConvert(
if (razorCompletionItem.CommitCharacters != null && razorCompletionItem.CommitCharacters.Count > 0)
{
- directiveCompletionItem.CommitCharacters = new Container(razorCompletionItem.CommitCharacters);
+ directiveCompletionItem = directiveCompletionItem with { CommitCharacters = new Container(razorCompletionItem.CommitCharacters) };
}
if (razorCompletionItem == DirectiveAttributeTransitionCompletionItemProvider.TransitionCompletionItem)
{
- directiveCompletionItem.Command = s_retriggerCompletionCommand;
- directiveCompletionItem.Kind = tagHelperCompletionItemKind;
+ directiveCompletionItem = directiveCompletionItem with
+ {
+ Command = s_retriggerCompletionCommand,
+ Kind = tagHelperCompletionItemKind,
+ };
}
completionItem = directiveCompletionItem;
@@ -373,7 +378,7 @@ internal static bool TryConvert(
if (razorCompletionItem.CommitCharacters != null && razorCompletionItem.CommitCharacters.Count > 0)
{
- directiveAttributeCompletionItem.CommitCharacters = new Container(razorCompletionItem.CommitCharacters);
+ directiveAttributeCompletionItem = directiveAttributeCompletionItem with { CommitCharacters = new Container(razorCompletionItem.CommitCharacters) };
}
completionItem = directiveAttributeCompletionItem;
@@ -406,7 +411,7 @@ internal static bool TryConvert(
if (razorCompletionItem.CommitCharacters != null && razorCompletionItem.CommitCharacters.Count > 0)
{
- markupTransitionCompletionItem.CommitCharacters = new Container(razorCompletionItem.CommitCharacters);
+ markupTransitionCompletionItem = markupTransitionCompletionItem with { CommitCharacters = new Container(razorCompletionItem.CommitCharacters) };
}
completionItem = markupTransitionCompletionItem;
@@ -425,7 +430,7 @@ internal static bool TryConvert(
if (razorCompletionItem.CommitCharacters != null && razorCompletionItem.CommitCharacters.Count > 0)
{
- tagHelperElementCompletionItem.CommitCharacters = new Container(razorCompletionItem.CommitCharacters);
+ tagHelperElementCompletionItem = tagHelperElementCompletionItem with { CommitCharacters = new Container(razorCompletionItem.CommitCharacters) };
}
completionItem = tagHelperElementCompletionItem;
@@ -444,7 +449,7 @@ internal static bool TryConvert(
if (razorCompletionItem.CommitCharacters != null && razorCompletionItem.CommitCharacters.Count > 0)
{
- tagHelperAttributeCompletionItem.CommitCharacters = new Container(razorCompletionItem.CommitCharacters);
+ tagHelperAttributeCompletionItem = tagHelperAttributeCompletionItem with { CommitCharacters = new Container(razorCompletionItem.CommitCharacters) };
}
completionItem = tagHelperAttributeCompletionItem;
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionItem.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionItem.cs
index 407f02bff25..4fc6cf7c835 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionItem.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionItem.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
///
/// VS-specific completion item based off of LSP's VSCompletionItem.
///
- internal class VSCompletionItem : CompletionItem
+ internal record VSCompletionItem : CompletionItem
{
[JsonProperty("_vs_description")]
public VSClassifiedTextElement Description { get; set; }
diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionList.cs b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionList.cs
index 565835bdd2d..0881178e003 100644
--- a/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionList.cs
+++ b/src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/Completion/VSCompletionList.cs
@@ -13,7 +13,11 @@ namespace Microsoft.AspNetCore.Razor.LanguageServer.Completion
///
internal class VSCompletionList : CompletionList
{
- protected VSCompletionList(CompletionList innerCompletionList) : base (innerCompletionList.Items, innerCompletionList.IsIncomplete)
+ protected VSCompletionList(CompletionList innerCompletionList) : this(innerCompletionList.Items, innerCompletionList.IsIncomplete)
+ {
+ }
+
+ protected VSCompletionList(IEnumerable completionItems, bool isIncomplete) : base(completionItems, isIncomplete)
{
}
@@ -34,18 +38,18 @@ public static VSCompletionList Convert(CompletionList completionList, VSCompleti
var vsCompletionList = new VSCompletionList(completionList);
if (vsCompletionListCapability.CommitCharacters)
{
- PromoteCommonCommitCharactersOntoList(vsCompletionList);
+ vsCompletionList = PromoteCommonCommitCharactersOntoList(vsCompletionList);
}
if (vsCompletionListCapability.Data)
{
- PromotedDataOntoList(vsCompletionList);
+ vsCompletionList = PromotedDataOntoList(vsCompletionList);
}
return vsCompletionList;
}
- private static void PromoteCommonCommitCharactersOntoList(VSCompletionList completionList)
+ private static VSCompletionList PromoteCommonCommitCharactersOntoList(VSCompletionList completionList)
{
var commitCharacterReferences = new Dictionary