Skip to content

Commit 34cacfa

Browse files
authored
Fix FUSE hook up in VS Code (#11175)
This one might be a _little_ controversial in terms of how I wired the `LanguageServerFeatureOptions` up through the `ProjectSnapshot`, but it's somewhat similar to how it works in cohosting, with `RemoteProjectSnapshot -> RemoteSolutionSnapshot -> SolutionSnapshotManager -> LanguageServerFeatureOptions`. Aside from that aspect of the specific implementation, which you're more than welcome to critique and suggest an alternative to, the fundamental change here is removing `LanguageServerFlags` and using `LanguageServerFeatureOptions` directly. It seems that `LanguageServerFlags` was intended to encapsulate the feature options for the compiler, but since that time they are never actually used by the compiler, and just ended up in a weird spot. They were "flags for the language server", but were only ever initialized in VS. We we essentially ended up with this unnecessary middle-man, that didn't always exist. The `LanguageServerFeatureFlags` on the other hand are always set in VS, VS Code, etc. TL;DR: Now that all of the code for deciding whether to use runtime compilation is entirely on the tooling side, it just makes sense to use the tooling side options class directly.
2 parents 62b6d9b + 87c0163 commit 34cacfa

File tree

31 files changed

+148
-175
lines changed

31 files changed

+148
-175
lines changed

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/LanguageServerFlags.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.

src/Compiler/Microsoft.CodeAnalysis.Razor.Compiler/src/Language/RazorConfiguration.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,20 @@ public sealed record class RazorConfiguration(
1212
string ConfigurationName,
1313
ImmutableArray<RazorExtension> Extensions,
1414
bool UseConsolidatedMvcViews = true,
15-
bool SuppressAddComponentParameter = false,
16-
LanguageServerFlags? LanguageServerFlags = null)
15+
bool SuppressAddComponentParameter = false)
1716
{
1817
public static readonly RazorConfiguration Default = new(
1918
RazorLanguageVersion.Latest,
2019
ConfigurationName: "unnamed",
2120
Extensions: [],
2221
UseConsolidatedMvcViews: true,
23-
SuppressAddComponentParameter: false,
24-
LanguageServerFlags: null);
22+
SuppressAddComponentParameter: false);
2523

2624
public bool Equals(RazorConfiguration? other)
2725
=> other is not null &&
2826
LanguageVersion == other.LanguageVersion &&
2927
ConfigurationName == other.ConfigurationName &&
3028
SuppressAddComponentParameter == other.SuppressAddComponentParameter &&
31-
LanguageServerFlags == other.LanguageServerFlags &&
3229
UseConsolidatedMvcViews == other.UseConsolidatedMvcViews &&
3330
Extensions.SequenceEqual(other.Extensions);
3431

@@ -40,7 +37,6 @@ public override int GetHashCode()
4037
hash.Add(Extensions);
4138
hash.Add(SuppressAddComponentParameter);
4239
hash.Add(UseConsolidatedMvcViews);
43-
hash.Add(LanguageServerFlags);
4440
return hash;
4541
}
4642
}

src/Razor/benchmarks/Microsoft.AspNetCore.Razor.Microbenchmarks/ProjectSystem/ProjectSnapshotManagerBenchmarkBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Collections.Immutable;
55
using System.IO;
66
using Microsoft.AspNetCore.Razor.Language;
7+
using Microsoft.AspNetCore.Razor.LanguageServer;
78
using Microsoft.AspNetCore.Razor.PooledObjects;
89
using Microsoft.CodeAnalysis;
910
using Microsoft.CodeAnalysis.Razor.Logging;
@@ -53,6 +54,7 @@ internal ProjectSnapshotManager CreateProjectSnapshotManager()
5354
{
5455
return new ProjectSnapshotManager(
5556
projectEngineFactoryProvider: StaticProjectEngineFactoryProvider.Instance,
57+
languageServerFeatureOptions: new DefaultLanguageServerFeatureOptions(),
5658
loggerFactory: EmptyLoggerFactory.Instance);
5759
}
5860
}

src/Razor/src/Microsoft.AspNetCore.Razor.LanguageServer/ProjectSystem/LspProjectSnapshotManager.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
using Microsoft.AspNetCore.Razor.ProjectEngineHost;
55
using Microsoft.CodeAnalysis.Razor.Logging;
66
using Microsoft.CodeAnalysis.Razor.ProjectSystem;
7+
using Microsoft.CodeAnalysis.Razor.Workspaces;
78

89
namespace Microsoft.AspNetCore.Razor.LanguageServer.ProjectSystem;
910

1011
internal class LspProjectSnapshotManager(
1112
IProjectEngineFactoryProvider projectEngineFactoryProvider,
13+
LanguageServerFeatureOptions languageServerFeatureOptions,
1214
ILoggerFactory loggerFactory)
13-
: ProjectSnapshotManager(projectEngineFactoryProvider, loggerFactory, initializer: AddMiscFilesProject)
15+
: ProjectSnapshotManager(projectEngineFactoryProvider, languageServerFeatureOptions, loggerFactory, initializer: AddMiscFilesProject)
1416
{
1517
private static void AddMiscFilesProject(Updater updater)
1618
{

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/LanguageServerFeatureOptions.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
// Copyright (c) .NET Foundation. All rights reserved.
22
// Licensed under the MIT license. See License.txt in the project root for license information.
33

4-
using Microsoft.AspNetCore.Razor.Language;
5-
64
namespace Microsoft.CodeAnalysis.Razor.Workspaces;
75

86
internal abstract class LanguageServerFeatureOptions
@@ -41,7 +39,4 @@ internal abstract class LanguageServerFeatureOptions
4139
/// When enabled, design time code will not be generated. All tooling will be using runtime code generation.
4240
/// </summary>
4341
public abstract bool ForceRuntimeCodeGeneration { get; }
44-
45-
public LanguageServerFlags ToLanguageServerFlags()
46-
=> new(ForceRuntimeCodeGeneration);
4742
}

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/DocumentState.ComputedStateTracker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ static void PropagateToTaskCompletionSource(
233233
}
234234

235235
var tagHelpers = await project.GetTagHelpersAsync(cancellationToken).ConfigureAwait(false);
236-
var forceRuntimeCodeGeneration = project.Configuration.LanguageServerFlags?.ForceRuntimeCodeGeneration ?? false;
236+
var forceRuntimeCodeGeneration = project.LanguageServerFeatureOptions.ForceRuntimeCodeGeneration;
237237
var codeDocument = await GenerateCodeDocumentAsync(document, project.GetProjectEngine(), imports, tagHelpers, forceRuntimeCodeGeneration, cancellationToken).ConfigureAwait(false);
238238
return (codeDocument, inputVersion);
239239
}

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshot.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.AspNetCore.Razor.ProjectSystem;
1313
using Microsoft.AspNetCore.Razor.Utilities;
1414
using Microsoft.CodeAnalysis.CSharp;
15+
using Microsoft.CodeAnalysis.Razor.Workspaces;
1516

1617
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem;
1718

@@ -23,6 +24,7 @@ internal sealed class ProjectSnapshot(ProjectState state) : IProjectSnapshot
2324
private readonly Dictionary<string, DocumentSnapshot> _filePathToDocumentMap = new(FilePathNormalizingComparer.Instance);
2425

2526
public HostProject HostProject => _state.HostProject;
27+
public LanguageServerFeatureOptions LanguageServerFeatureOptions => _state.LanguageServerFeatureOptions;
2628

2729
public ProjectKey Key => _state.HostProject.Key;
2830
public RazorConfiguration Configuration => _state.HostProject.Configuration;

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectSnapshotManager.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Microsoft.AspNetCore.Razor.ProjectSystem;
1414
using Microsoft.AspNetCore.Razor.Threading;
1515
using Microsoft.CodeAnalysis.Razor.Logging;
16+
using Microsoft.CodeAnalysis.Razor.Workspaces;
1617
using Microsoft.CodeAnalysis.Text;
1718

1819
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem;
@@ -27,6 +28,7 @@ namespace Microsoft.CodeAnalysis.Razor.ProjectSystem;
2728
internal partial class ProjectSnapshotManager : IProjectSnapshotManager, IDisposable
2829
{
2930
private readonly IProjectEngineFactoryProvider _projectEngineFactoryProvider;
31+
private readonly LanguageServerFeatureOptions _languageServerFeatureOptions;
3032
private readonly Dispatcher _dispatcher;
3133
private readonly bool _initialized;
3234

@@ -64,16 +66,19 @@ internal partial class ProjectSnapshotManager : IProjectSnapshotManager, IDispos
6466
/// </summary>
6567
/// <param name="projectEngineFactoryProvider">The <see cref="IProjectEngineFactoryProvider"/> to
6668
/// use when creating <see cref="ProjectState"/>.</param>
69+
/// <param name="languageServerFeatureOptions">The options that were used to start the language server</param>
6770
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/> to use.</param>
6871
/// <param name="initializer">An optional callback to set up the initial set of projects and documents.
6972
/// Note that this is called during construction, so it does not run on the dispatcher and notifications
7073
/// will not be sent.</param>
7174
public ProjectSnapshotManager(
7275
IProjectEngineFactoryProvider projectEngineFactoryProvider,
76+
LanguageServerFeatureOptions languageServerFeatureOptions,
7377
ILoggerFactory loggerFactory,
7478
Action<Updater>? initializer = null)
7579
{
7680
_projectEngineFactoryProvider = projectEngineFactoryProvider;
81+
_languageServerFeatureOptions = languageServerFeatureOptions;
7782
_dispatcher = new(loggerFactory);
7883

7984
initializer?.Invoke(new(this));
@@ -437,6 +442,7 @@ private bool TryUpdate(
437442

438443
var state = ProjectState.Create(
439444
_projectEngineFactoryProvider,
445+
_languageServerFeatureOptions,
440446
hostProject,
441447
ProjectWorkspaceState.Default);
442448

src/Razor/src/Microsoft.CodeAnalysis.Razor.Workspaces/ProjectSystem/ProjectState.cs

Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.AspNetCore.Razor.ProjectSystem;
1313
using Microsoft.AspNetCore.Razor.Utilities;
1414
using Microsoft.CodeAnalysis.CSharp;
15+
using Microsoft.CodeAnalysis.Razor.Workspaces;
1516
using Microsoft.CodeAnalysis.Text;
1617

1718
namespace Microsoft.CodeAnalysis.Razor.ProjectSystem;
@@ -35,37 +36,26 @@ internal class ProjectState
3536
private readonly object _lock;
3637

3738
private readonly IProjectEngineFactoryProvider _projectEngineFactoryProvider;
39+
private readonly LanguageServerFeatureOptions _languageServerFeatureOptions;
3840
private RazorProjectEngine? _projectEngine;
3941

4042
public static ProjectState Create(
4143
IProjectEngineFactoryProvider projectEngineFactoryProvider,
44+
LanguageServerFeatureOptions languageServerFeatureOptions,
4245
HostProject hostProject,
4346
ProjectWorkspaceState projectWorkspaceState)
4447
{
45-
if (projectEngineFactoryProvider is null)
46-
{
47-
throw new ArgumentNullException(nameof(projectEngineFactoryProvider));
48-
}
49-
50-
if (hostProject is null)
51-
{
52-
throw new ArgumentNullException(nameof(hostProject));
53-
}
54-
55-
if (projectWorkspaceState is null)
56-
{
57-
throw new ArgumentNullException(nameof(projectWorkspaceState));
58-
}
59-
60-
return new ProjectState(projectEngineFactoryProvider, hostProject, projectWorkspaceState);
48+
return new ProjectState(projectEngineFactoryProvider, languageServerFeatureOptions, hostProject, projectWorkspaceState);
6149
}
6250

6351
private ProjectState(
6452
IProjectEngineFactoryProvider projectEngineFactoryProvider,
53+
LanguageServerFeatureOptions languageServerFeatureOptions,
6554
HostProject hostProject,
6655
ProjectWorkspaceState projectWorkspaceState)
6756
{
6857
_projectEngineFactoryProvider = projectEngineFactoryProvider;
58+
_languageServerFeatureOptions = languageServerFeatureOptions;
6959
HostProject = hostProject;
7060
ProjectWorkspaceState = projectWorkspaceState;
7161
Documents = s_emptyDocuments;
@@ -85,32 +75,8 @@ private ProjectState(
8575
ImmutableDictionary<string, DocumentState> documents,
8676
ImmutableDictionary<string, ImmutableArray<string>> importsToRelatedDocuments)
8777
{
88-
if (older is null)
89-
{
90-
throw new ArgumentNullException(nameof(older));
91-
}
92-
93-
if (hostProject is null)
94-
{
95-
throw new ArgumentNullException(nameof(hostProject));
96-
}
97-
98-
if (documents is null)
99-
{
100-
throw new ArgumentNullException(nameof(documents));
101-
}
102-
103-
if (importsToRelatedDocuments is null)
104-
{
105-
throw new ArgumentNullException(nameof(importsToRelatedDocuments));
106-
}
107-
108-
if (projectWorkspaceState is null)
109-
{
110-
throw new ArgumentNullException(nameof(projectWorkspaceState));
111-
}
112-
11378
_projectEngineFactoryProvider = older._projectEngineFactoryProvider;
79+
_languageServerFeatureOptions = older._languageServerFeatureOptions;
11480
Version = older.Version.GetNewerVersion();
11581

11682
HostProject = hostProject;
@@ -169,6 +135,8 @@ private ProjectState(
169135

170136
public HostProject HostProject { get; }
171137

138+
internal LanguageServerFeatureOptions LanguageServerFeatureOptions => _languageServerFeatureOptions;
139+
172140
public ProjectWorkspaceState ProjectWorkspaceState { get; }
173141

174142
public ImmutableArray<TagHelperDescriptor> TagHelpers => ProjectWorkspaceState.TagHelpers;

src/Razor/src/Microsoft.CodeAnalysis.Remote.Razor/ProjectSystem/RemoteDocumentSnapshot.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ async Task<RazorCodeDocument> GetRazorCodeDocumentAsync(bool forceRuntimeCodeGen
103103
var imports = await DocumentState.GetImportsAsync(this, projectEngine, cancellationToken).ConfigureAwait(false);
104104

105105
return await DocumentState
106-
.GenerateCodeDocumentAsync(this, projectEngine, imports, tagHelpers, forceRuntimeCodeGeneration: forceRuntimeCodeGeneration, cancellationToken)
106+
.GenerateCodeDocumentAsync(this, projectEngine, imports, tagHelpers, forceRuntimeCodeGeneration, cancellationToken)
107107
.ConfigureAwait(false);
108108
}
109109
}

0 commit comments

Comments
 (0)