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
65using System ;
6+ using System . Runtime . CompilerServices ;
77using Microsoft . CodeAnalysis . Host ;
8+ using Roslyn . Utilities ;
89
910namespace 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