Skip to content

Commit 1a709f3

Browse files
committed
Simplify lazy initialization in RazorDocumentServiceProviderWrapper
Closes #58004
1 parent 0d68a4b commit 1a709f3

File tree

1 file changed

+44
-56
lines changed

1 file changed

+44
-56
lines changed

src/Tools/ExternalAccess/Razor/RazorDocumentServiceProviderWrapper.cs

Lines changed: 44 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,25 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
4-
#nullable enable annotations
54

65
using System;
6+
using System.Runtime.CompilerServices;
77
using Microsoft.CodeAnalysis.Host;
8+
using Roslyn.Utilities;
89

910
namespace Microsoft.CodeAnalysis.ExternalAccess.Razor
1011
{
1112
internal sealed class RazorDocumentServiceProviderWrapper : IDocumentServiceProvider, IDocumentOperationService
1213
{
1314
private readonly IRazorDocumentServiceProvider _innerDocumentServiceProvider;
14-
private readonly object _lock;
1515

16-
private RazorSpanMappingServiceWrapper? _spanMappingService;
17-
private RazorDocumentExcerptServiceWrapper? _excerptService;
18-
private RazorDocumentPropertiesServiceWrapper? _documentPropertiesService;
16+
private StrongBox<ISpanMappingService?>? _spanMappingService;
17+
private StrongBox<IDocumentExcerptService?>? _excerptService;
18+
private StrongBox<DocumentPropertiesService?>? _documentPropertiesService;
1919

2020
public RazorDocumentServiceProviderWrapper(IRazorDocumentServiceProvider innerDocumentServiceProvider)
2121
{
2222
_innerDocumentServiceProvider = innerDocumentServiceProvider ?? throw new ArgumentNullException(nameof(innerDocumentServiceProvider));
23-
24-
_lock = new object();
2523
}
2624

2725
public bool CanApplyChange => _innerDocumentServiceProvider.CanApplyChange;
@@ -33,75 +31,65 @@ public RazorDocumentServiceProviderWrapper(IRazorDocumentServiceProvider innerDo
3331
var serviceType = typeof(TService);
3432
if (serviceType == typeof(ISpanMappingService))
3533
{
36-
if (_spanMappingService == null)
37-
{
38-
lock (_lock)
34+
var spanMappingService = LazyInitialization.EnsureInitialized(
35+
ref _spanMappingService,
36+
static documentServiceProvider =>
3937
{
40-
if (_spanMappingService == null)
38+
var razorMappingService = documentServiceProvider.GetService<IRazorSpanMappingService>();
39+
if (razorMappingService != null)
40+
{
41+
return new StrongBox<ISpanMappingService?>(new RazorSpanMappingServiceWrapper(razorMappingService));
42+
}
43+
else
4144
{
42-
var razorMappingService = _innerDocumentServiceProvider.GetService<IRazorSpanMappingService>();
43-
if (razorMappingService != null)
44-
{
45-
_spanMappingService = new RazorSpanMappingServiceWrapper(razorMappingService);
46-
}
47-
else
48-
{
49-
return this as TService;
50-
}
45+
return new StrongBox<ISpanMappingService?>(null);
5146
}
52-
}
53-
}
47+
},
48+
_innerDocumentServiceProvider);
5449

55-
return (TService)(object)_spanMappingService;
50+
return (TService?)spanMappingService.Value;
5651
}
5752

5853
if (serviceType == typeof(IDocumentExcerptService))
5954
{
60-
if (_excerptService == null)
61-
{
62-
lock (_lock)
55+
var excerptService = LazyInitialization.EnsureInitialized(
56+
ref _excerptService,
57+
static documentServiceProvider =>
6358
{
64-
if (_excerptService == null)
59+
var razorExcerptService = documentServiceProvider.GetService<IRazorDocumentExcerptService>();
60+
if (razorExcerptService != null)
61+
{
62+
return new StrongBox<IDocumentExcerptService?>(new RazorDocumentExcerptServiceWrapper(razorExcerptService));
63+
}
64+
else
6565
{
66-
var excerptService = _innerDocumentServiceProvider.GetService<IRazorDocumentExcerptService>();
67-
if (excerptService != null)
68-
{
69-
_excerptService = new RazorDocumentExcerptServiceWrapper(excerptService);
70-
}
71-
else
72-
{
73-
return this as TService;
74-
}
66+
return new StrongBox<IDocumentExcerptService?>(null);
7567
}
76-
}
77-
}
68+
},
69+
_innerDocumentServiceProvider);
7870

79-
return (TService)(object)_excerptService;
71+
return (TService?)excerptService.Value;
8072
}
8173

8274
if (serviceType == typeof(DocumentPropertiesService))
8375
{
84-
if (_documentPropertiesService == null)
85-
{
86-
lock (_lock)
76+
var documentPropertiesService = LazyInitialization.EnsureInitialized(
77+
ref _documentPropertiesService,
78+
static documentServiceProvider =>
8779
{
88-
if (_documentPropertiesService == null)
80+
var razorDocumentPropertiesService = documentServiceProvider.GetService<IRazorDocumentPropertiesService>();
81+
if (razorDocumentPropertiesService != null)
8982
{
90-
var documentPropertiesService = _innerDocumentServiceProvider.GetService<IRazorDocumentPropertiesService>();
91-
92-
if (documentPropertiesService != null)
93-
{
94-
_documentPropertiesService = new RazorDocumentPropertiesServiceWrapper(documentPropertiesService);
95-
}
96-
else
97-
{
98-
return this as TService;
99-
}
83+
return new StrongBox<DocumentPropertiesService?>(new RazorDocumentPropertiesServiceWrapper(razorDocumentPropertiesService));
84+
}
85+
else
86+
{
87+
return new StrongBox<DocumentPropertiesService?>(null);
10088
}
101-
}
102-
}
89+
},
90+
_innerDocumentServiceProvider);
10391

104-
return (TService)(object)_documentPropertiesService;
92+
return (TService?)(object?)documentPropertiesService.Value;
10593
}
10694

10795
return this as TService;

0 commit comments

Comments
 (0)