88using System . Threading . Tasks ;
99using System . Threading . Tasks . Dataflow ;
1010using Microsoft . Internal . Performance ;
11+ using Microsoft . VisualStudio . ProjectSystem . Logging ;
1112using Microsoft . VisualStudio . ProjectSystem . Properties ;
1213using Microsoft . VisualStudio . ProjectSystem . Utilities ;
1314using NuGet . SolutionRestoreManager ;
@@ -23,6 +24,7 @@ internal class NuGetRestorer : OnceInitializedOnceDisposedAsync
2324 private readonly IActiveConfiguredProjectsProvider _activeConfiguredProjectsProvider ;
2425 private readonly IActiveConfiguredProjectSubscriptionService _activeConfiguredProjectSubscriptionService ;
2526 private readonly IActiveProjectConfigurationRefreshService _activeProjectConfigurationRefreshService ;
27+ private readonly IProjectLogger _logger ;
2628 private IDisposable _targetFrameworkSubscriptionLink ;
2729 private DisposableBag _designTimeBuildSubscriptionLink ;
2830
@@ -46,14 +48,16 @@ public NuGetRestorer(
4648 IVsSolutionRestoreService solutionRestoreService ,
4749 IActiveConfiguredProjectSubscriptionService activeConfiguredProjectSubscriptionService ,
4850 IActiveProjectConfigurationRefreshService activeProjectConfigurationRefreshService ,
49- IActiveConfiguredProjectsProvider activeConfiguredProjectsProvider )
51+ IActiveConfiguredProjectsProvider activeConfiguredProjectsProvider ,
52+ IProjectLogger logger )
5053 : base ( projectVsServices . ThreadingService . JoinableTaskContext )
5154 {
5255 _projectVsServices = projectVsServices ;
5356 _solutionRestoreService = solutionRestoreService ;
5457 _activeConfiguredProjectSubscriptionService = activeConfiguredProjectSubscriptionService ;
5558 _activeProjectConfigurationRefreshService = activeProjectConfigurationRefreshService ;
5659 _activeConfiguredProjectsProvider = activeConfiguredProjectsProvider ;
60+ _logger = logger ;
5761 }
5862
5963 [ ProjectAutoLoad ( startAfter : ProjectLoadCheckpoint . ProjectFactoryCompleted ) ]
@@ -166,13 +170,16 @@ private Task ProjectPropertyChangedAsync(Tuple<ImmutableList<IProjectValueVersio
166170 _projectVsServices . Project . Services . ProjectAsynchronousTasks
167171 . RegisterAsyncTask ( JoinableFactory . RunAsync ( async ( ) =>
168172 {
173+ LogProjectRestoreInfo ( _projectVsServices . Project . FullPath , projectRestoreInfo ) ;
174+
169175 await _solutionRestoreService
170176 . NominateProjectAsync ( _projectVsServices . Project . FullPath , projectRestoreInfo ,
171177 _projectVsServices . Project . Services . ProjectAsynchronousTasks . UnloadCancellationToken )
172178 . ConfigureAwait ( false ) ;
173179
174180 CodeMarkers . Instance . CodeMarker ( CodeMarkerTimerId . PerfPackageRestoreEnd ) ;
175181
182+ CompleteLogProjectRestoreInfo ( _projectVsServices . Project . FullPath ) ;
176183 } ) ,
177184 ProjectCriticalOperation . Build | ProjectCriticalOperation . Unload | ProjectCriticalOperation . Rename ,
178185 registerFaultHandler : true ) ;
@@ -192,5 +199,91 @@ private static bool HasTargetFrameworkChanged(IProjectVersionedValue<IProjectSub
192199 }
193200 return false ;
194201 }
202+
203+ #region ProjectRestoreInfo Logging
204+
205+ private void LogProjectRestoreInfo ( string fullPath , IVsProjectRestoreInfo projectRestoreInfo )
206+ {
207+ if ( _logger . IsEnabled )
208+ {
209+ using ( IProjectLoggerBatch logger = _logger . BeginBatch ( ) )
210+ {
211+ logger . WriteLine ( ) ;
212+ logger . WriteLine ( "------------------------------------------" ) ;
213+ logger . WriteLine ( $ "BEGIN Nominate Restore for { fullPath } ") ;
214+ logger . IndentLevel ++ ;
215+
216+ logger . WriteLine ( $ "BaseIntermediatePath: { projectRestoreInfo . BaseIntermediatePath } ") ;
217+ logger . WriteLine ( $ "OriginalTargetFrameworks: { projectRestoreInfo . OriginalTargetFrameworks } ") ;
218+ LogTargetFrameworks ( logger , projectRestoreInfo . TargetFrameworks as TargetFrameworks ) ;
219+ LogReferenceItems ( logger , "Tool References" , projectRestoreInfo . ToolReferences as ReferenceItems ) ;
220+
221+ logger . IndentLevel -- ;
222+ logger . WriteLine ( ) ;
223+ }
224+ }
225+ }
226+
227+ private void CompleteLogProjectRestoreInfo ( string fullPath )
228+ {
229+ if ( _logger . IsEnabled )
230+ {
231+ using ( IProjectLoggerBatch logger = _logger . BeginBatch ( ) )
232+ {
233+ logger . WriteLine ( ) ;
234+ logger . WriteLine ( "------------------------------------------" ) ;
235+ logger . WriteLine ( $ "COMPLETED Nominate Restore for { fullPath } ") ;
236+ logger . WriteLine ( ) ;
237+ }
238+ }
239+ }
240+
241+ private void LogTargetFrameworks ( IProjectLoggerBatch logger , TargetFrameworks targetFrameworks )
242+ {
243+ logger . WriteLine ( $ "Target Frameworks ({ targetFrameworks . Count } )") ;
244+ logger . IndentLevel ++ ;
245+
246+ foreach ( var tf in targetFrameworks )
247+ {
248+ LogTargetFramework ( logger , tf as TargetFrameworkInfo ) ;
249+ }
250+ logger . IndentLevel -- ;
251+ }
252+
253+ private void LogTargetFramework ( IProjectLoggerBatch logger , TargetFrameworkInfo targetFrameworkInfo )
254+ {
255+ logger . WriteLine ( targetFrameworkInfo . TargetFrameworkMoniker ) ;
256+ logger . IndentLevel ++ ;
257+
258+ LogReferenceItems ( logger , "Project References" , targetFrameworkInfo . ProjectReferences as ReferenceItems ) ;
259+ LogReferenceItems ( logger , "Package References" , targetFrameworkInfo . PackageReferences as ReferenceItems ) ;
260+ LogProperties ( logger , "Target Framework Properties" , targetFrameworkInfo . Properties as ProjectProperties ) ;
261+
262+ logger . IndentLevel -- ;
263+ }
264+
265+ private void LogProperties ( IProjectLoggerBatch logger , string heading , ProjectProperties projectProperties )
266+ {
267+ var properties = projectProperties . Cast < ProjectProperty > ( )
268+ . Select ( prop => $ "{ prop . Name } :{ prop . Value } ") ;
269+ logger . WriteLine ( $ "{ heading } -- ({ string . Join ( " | " , properties ) } )") ;
270+ }
271+
272+ private void LogReferenceItems ( IProjectLoggerBatch logger , string heading , ReferenceItems references )
273+ {
274+ logger . WriteLine ( heading ) ;
275+ logger . IndentLevel ++ ;
276+
277+ foreach ( var reference in references )
278+ {
279+ var properties = reference . Properties . Cast < ReferenceProperty > ( )
280+ . Select ( prop => $ "{ prop . Name } :{ prop . Value } ") ;
281+ logger . WriteLine ( $ "{ reference . Name } -- ({ string . Join ( " | " , properties ) } )") ;
282+ }
283+
284+ logger . IndentLevel -- ;
285+ }
286+
287+ #endregion
195288 }
196289}
0 commit comments