Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.LanguageServer.Handler;
using Microsoft.CodeAnalysis.LanguageServer.Handler.CodeActions;
using Microsoft.CodeAnalysis.Razor;
using Microsoft.CodeAnalysis.Razor.CodeActions.Models;
using Microsoft.CodeAnalysis.Razor.Cohost;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.Razor.Protocol;
using Microsoft.CodeAnalysis.Razor.Protocol.CodeActions;
using Microsoft.CodeAnalysis.Razor.Remote;
Expand Down Expand Up @@ -112,7 +111,7 @@ public ImmutableArray<Registration> GetRegistrations(VSInternalClientCapabilitie

private async Task<RazorVSInternalCodeAction[]> GetCSharpCodeActionsAsync(TextDocument razorDocument, VSCodeActionParams request, Guid correlationId, CancellationToken cancellationToken)
{
var generatedDocument = await razorDocument.Project.Solution.TryGetSourceGeneratedDocumentAsync(request.TextDocument.DocumentUri.GetRequiredSystemUri(), cancellationToken).ConfigureAwait(false);
var generatedDocument = await razorDocument.Project.Solution.TryGetSourceGeneratedDocumentAsync(request.TextDocument.DocumentUri, cancellationToken).ConfigureAwait(false);
if (generatedDocument is null)
{
return [];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.LanguageServer.Handler;
using Microsoft.CodeAnalysis.LanguageServer.Handler.CodeActions;
using Microsoft.CodeAnalysis.Razor.CodeActions.Models;
using Microsoft.CodeAnalysis.Razor.Cohost;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.Razor.Protocol;
using Microsoft.CodeAnalysis.Razor.Remote;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.EditAndContinue;
using Microsoft.CodeAnalysis.Razor;
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.CodeAnalysis.Razor.Cohost;
using Microsoft.CodeAnalysis.Razor.Logging;
using Microsoft.CodeAnalysis.Razor.Protocol;
Expand Down Expand Up @@ -47,7 +48,7 @@ protected virtual LspDiagnostic[] ExtractHtmlDiagnostics(TResponse result)
throw new NotSupportedException("If SupportsHtmlDiagnostics is true, you must implement GetHtmlDiagnostics");
}

protected virtual TRequest CreateHtmlParams(Uri uri)
protected virtual TRequest CreateHtmlParams(DocumentUri uri)
{
throw new NotSupportedException("If SupportsHtmlDiagnostics is true, you must implement CreateHtmlParams");
}
Expand Down Expand Up @@ -131,7 +132,7 @@ protected virtual TRequest CreateHtmlParams(Uri uri)

private async Task<LspDiagnostic[]> GetHtmlDiagnosticsAsync(TextDocument razorDocument, Guid correlationId, CancellationToken cancellationToken)
{
var diagnosticsParams = CreateHtmlParams(razorDocument.CreateSystemUri());
var diagnosticsParams = CreateHtmlParams(razorDocument.GetURI());

var result = await _requestInvoker.MakeHtmlLspRequestAsync<TRequest, TResponse>(
razorDocument,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public void HandleMissingDocument(TextDocumentIdentifier? textDocumentIdentifier
return;
}

if (textDocumentIdentifier?.DocumentUri.GetSystemUri() is not Uri uri)
if (textDocumentIdentifier?.DocumentUri.ParsedUri is not Uri uri)
{
// Can't do anything without a uri
return;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Razor.PooledObjects;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.LanguageServer.Handler;
using Microsoft.CodeAnalysis.Razor;
using Microsoft.CodeAnalysis.Razor.Cohost;
using Microsoft.CodeAnalysis.Razor.CohostingShared;
using Microsoft.CodeAnalysis.Razor.Remote;
using Microsoft.CodeAnalysis.Razor.Workspaces;
using Microsoft.CodeAnalysis.Razor.Workspaces.Extensions;
Expand Down Expand Up @@ -97,11 +96,11 @@ public ImmutableArray<Registration> GetRegistrations(VSInternalClientCapabilitie

if (result.TryGetFirst(out var singleLocation))
{
return LspFactory.CreateLocation(RemapVirtualHtmlUri(singleLocation.DocumentUri.GetRequiredSystemUri()).CreateDocumentUriFromSystemUri(), singleLocation.Range.ToLinePositionSpan());
return LspFactory.CreateLocation(RemapVirtualHtmlUri(singleLocation.DocumentUri), singleLocation.Range.ToLinePositionSpan());
}
else if (result.TryGetSecond(out var multipleLocations))
{
return Array.ConvertAll(multipleLocations, l => LspFactory.CreateLocation(RemapVirtualHtmlUri(l.DocumentUri.GetRequiredSystemUri()).CreateDocumentUriFromSystemUri(), l.Range.ToLinePositionSpan()));
return Array.ConvertAll(multipleLocations, l => LspFactory.CreateLocation(RemapVirtualHtmlUri(l.DocumentUri), l.Range.ToLinePositionSpan()));
}
else if (result.TryGetThird(out var documentLinks))
{
Expand All @@ -111,7 +110,7 @@ public ImmutableArray<Registration> GetRegistrations(VSInternalClientCapabilitie
{
if (documentLink.DocumentTarget is DocumentUri target)
{
builder.Add(LspFactory.CreateDocumentLink(RemapVirtualHtmlUri(target.GetRequiredSystemUri()).CreateDocumentUriFromSystemUri(), documentLink.Range.ToLinePositionSpan()));
builder.Add(LspFactory.CreateDocumentLink(RemapVirtualHtmlUri(target), documentLink.Range.ToLinePositionSpan()));
}
}

Expand All @@ -121,9 +120,9 @@ public ImmutableArray<Registration> GetRegistrations(VSInternalClientCapabilitie
return null;
}

private Uri RemapVirtualHtmlUri(Uri uri)
private DocumentUri RemapVirtualHtmlUri(DocumentUri uri)
{
if (uri.CreateDocumentUriFromSystemUri().IsRazorHtmlDocumentUri(out var razorUri))
if (uri.IsRazorHtmlDocumentUri(out var razorUri))
{
return razorUri;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ private void RemapVirtualHtmlUri(LspLocation? location)
if (location is not null &&
location.DocumentUri.IsRazorHtmlDocumentUri(out var razorDocumentUri))
{
location.DocumentUri = new(razorDocumentUri);
location.DocumentUri = razorDocumentUri;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,8 @@ internal sealed record RazorCodeActionResolutionParams(TextDocumentIdentifier Te
public required RazorLanguageKind Language { get; set; }

[JsonPropertyName("delegatedDocumentUri")]
public required Uri? DelegatedDocumentUri { get; set; }
[JsonConverter(typeof(DocumentUriConverter))]
public required DocumentUri? DelegatedDocumentUri { get; set; }

[JsonPropertyName("data")]
public object? Data { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,7 @@
using System.Linq;
using Microsoft.AspNetCore.Razor.Language;
using Microsoft.AspNetCore.Razor.Language.Syntax;
using Microsoft.CodeAnalysis.Razor.DocumentMapping;
using Microsoft.CodeAnalysis.Razor.Protocol;
using Microsoft.CodeAnalysis.Razor.Protocol.Completion;
using Microsoft.VisualStudio.Editor.Razor;

namespace Microsoft.CodeAnalysis.Razor.Completion.Delegation;
Expand Down Expand Up @@ -137,66 +135,6 @@ public static RazorVSInternalCompletionList RewriteHtmlResponse(
return rewrittenResponse;
}

/// <summary>
/// Returns possibly update document position info and provisional edit (if any)
/// </summary>
/// <remarks>
/// Provisional completion happens when typing something like @DateTime. in a document.
/// In this case the '.' initially is parsed as belonging to HTML. However, we want to
/// show C# member completion in this case, so we want to make a temporary change to the
/// generated C# code so that '.' ends up in C#. This method will check for such case,
/// and provisional completion case is detected, will update position language from HTML
/// to C# and will return a temporary edit that should be made to the generated document
/// in order to add the '.' to the generated C# contents.
/// </remarks>
public static bool TryGetProvisionalCompletionInfo(
RazorCodeDocument codeDocument,
VSInternalCompletionContext completionContext,
DocumentPositionInfo originalPositionInfo,
IDocumentMappingService documentMappingService,
out CompletionPositionInfo result)
{
result = default;

if (originalPositionInfo.LanguageKind != RazorLanguageKind.Html ||
completionContext.TriggerKind != CompletionTriggerKind.TriggerCharacter ||
completionContext.TriggerCharacter != ".")
{
// Invalid provisional completion context
return false;
}

if (originalPositionInfo.Position.Character == 0)
{
// We're at the start of line. Can't have provisional completions here.
return false;
}

var previousCharacterPositionInfo = documentMappingService.GetPositionInfo(codeDocument, originalPositionInfo.HostDocumentIndex - 1);

if (previousCharacterPositionInfo.LanguageKind != RazorLanguageKind.CSharp)
{
return false;
}

var previousPosition = previousCharacterPositionInfo.Position;

// Edit the CSharp projected document to contain a '.'. This allows C# completion to provide valid
// completion items for moments when a user has typed a '.' that's typically interpreted as Html.
var addProvisionalDot = LspFactory.CreateTextEdit(previousPosition, ".");

var provisionalPositionInfo = new DocumentPositionInfo(
RazorLanguageKind.CSharp,
LspFactory.CreatePosition(
previousPosition.Line,
previousPosition.Character + 1),
previousCharacterPositionInfo.HostDocumentIndex + 1,
previousCharacterPositionInfo.InDeclDocument);

result = new CompletionPositionInfo(addProvisionalDot, provisionalPositionInfo, ShouldIncludeDelegationSnippets: false);
return true;
}

public static bool ShouldIncludeSnippets(RazorCodeDocument razorCodeDocument, int absoluteIndex, out bool isStartTagContext)
{
isStartTagContext = false;
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,10 @@ internal static class DocumentUriExtensions
{
public bool IsRazorCSharpDocumentUri(Solution solution)
{
if (documentUri.ParsedUri is not { } uri)
{
return false;
}

return solution.TryGetSourceGeneratedDocumentIdentity(uri, out _);
return solution.TryGetSourceGeneratedDocumentIdentity(documentUri, out _);
}

public bool IsRazorHtmlDocumentUri([NotNullWhen(true)] out Uri? razorDocumentUri)
public bool IsRazorHtmlDocumentUri([NotNullWhen(true)] out DocumentUri? razorDocumentUri)
{
razorDocumentUri = null;
if (documentUri.ParsedUri is not { } uri)
Expand Down Expand Up @@ -49,7 +44,7 @@ public bool IsRazorHtmlDocumentUri([NotNullWhen(true)] out Uri? razorDocumentUri
if (filePath.EndsWith(LanguageServerConstants.HtmlVirtualDocumentSuffix, StringComparison.Ordinal))
{
var razorFilePath = filePath[..^LanguageServerConstants.HtmlVirtualDocumentSuffix.Length];
razorDocumentUri = new Uri(razorFilePath, UriKind.Absolute);
razorDocumentUri = new DocumentUri(new Uri(razorFilePath, UriKind.Absolute));
return true;
Comment thread
davidwengier marked this conversation as resolved.
Resolved
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;

Check failure on line 4 in src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs

View check run for this annotation

Azure Pipelines / roslyn-CI (Correctness Correctness_Analyzers)

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs#L4

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs(4,1): error IDE0005: (NETCORE_ENGINEERING_TELEMETRY=Build) Using directive is unnecessary. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0005)

Check failure on line 4 in src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs

View check run for this annotation

Azure Pipelines / roslyn-CI (Correctness Correctness_Analyzers)

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs#L4

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs(4,1): error IDE0005: (NETCORE_ENGINEERING_TELEMETRY=Build) Using directive is unnecessary. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0005)

Check failure on line 4 in src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs

View check run for this annotation

Azure Pipelines / roslyn-CI (Correctness Correctness_Analyzers)

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs#L4

src/Razor/src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/Extensions/LspExtensions_Location.cs(4,1): error IDE0005: (NETCORE_ENGINEERING_TELEMETRY=Build) Using directive is unnecessary. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/style-rules/ide0005)
Comment thread
davidwengier marked this conversation as resolved.
Resolved
using Microsoft.CodeAnalysis.Razor;

namespace Roslyn.LanguageServer.Protocol;

internal static partial class LspExtensions
{
public static void Deconstruct(this LspLocation position, out Uri uri, out LspRange range)
=> (uri, range) = (position.DocumentUri.GetRequiredSystemUri(), position.Range);
public static void Deconstruct(this LspLocation position, out DocumentUri uri, out LspRange range)
=> (uri, range) = (position.DocumentUri, position.Range);
}
Loading
Loading