@@ -61,13 +61,21 @@ public ReferenceSettings(ReferenceSettings other)
6161 AddToRecentOnReferenceEvents = other . AddToRecentOnReferenceEvents ;
6262 ProjectPaths = new List < string > ( other . ProjectPaths ) ;
6363 other . SerializationPrep ( new StreamingContext ( StreamingContextStates . All ) ) ;
64- _recent = other . _recent ;
65- _pinned = other . _pinned ;
64+ _recent = other . _recent . Select ( use => new HostUsages ( use ) ) . ToList ( ) ;
65+ RecentLibraryReferences = other . RecentLibraryReferences . ToList ( ) ;
66+ _pinned = other . _pinned . Select ( pin => new HostPins ( pin ) ) . ToList ( ) ;
67+ PinnedLibraryReferences = other . PinnedLibraryReferences . ToList ( ) ;
6668 DeserializationLoad ( new StreamingContext ( StreamingContextStates . All ) ) ;
6769 }
6870
71+ private int _tracked ;
72+
6973 [ DataMember ( IsRequired = true ) ]
70- public int RecentReferencesTracked { get ; set ; }
74+ public int RecentReferencesTracked
75+ {
76+ get => _tracked ;
77+ set => _tracked = value < 0 ? 0 : Math . Min ( value , RecentTrackingLimit ) ;
78+ }
7179
7280 [ DataMember ( IsRequired = true ) ]
7381 public bool FixBrokenReferences { get ; set ; }
@@ -128,7 +136,8 @@ public void TrackUsage(ReferenceInfo reference, string host = null)
128136 {
129137 var use = new ReferenceUsage ( reference ) ;
130138 if ( string . IsNullOrEmpty ( host ) )
131- {
139+ {
140+ RecentLibraryReferences . RemoveAll ( usage => usage . Matches ( reference ) ) ;
132141 RecentLibraryReferences . Add ( use ) ;
133142 RecentLibraryReferences = RecentLibraryReferences
134143 . OrderByDescending ( usage => usage . Timestamp )
@@ -154,20 +163,30 @@ public void TrackUsage(ReferenceInfo reference, string host = null)
154163 . Take ( RecentReferencesTracked ) . ToList ( ) ;
155164 }
156165
166+ // This is so close to damned near impossible that I was tempted to hard code it false, but it's useful for testing.
157167 public bool Equals ( ReferenceSettings other )
158168 {
169+ if ( ReferenceEquals ( this , other ) )
170+ {
171+ return true ;
172+ }
173+
159174 if ( other is null ||
160- RecentReferencesTracked != other . RecentReferencesTracked ||
161- ! PinnedLibraryReferences . OrderBy ( _ => _ ) . SequenceEqual ( other . PinnedLibraryReferences . OrderBy ( _ => _ ) ) ||
162- ! RecentLibraryReferences . OrderBy ( _ => _ ) . SequenceEqual ( other . RecentLibraryReferences . OrderBy ( _ => _ ) ) )
175+ RecentReferencesTracked != other . RecentReferencesTracked ||
176+ PinnedLibraryReferences . Count != other . PinnedLibraryReferences . Count ||
177+ RecentLibraryReferences . Count != other . RecentLibraryReferences . Count ||
178+ PinnedLibraryReferences . Any ( pin => ! other . PinnedLibraryReferences . Any ( lib => lib . Equals ( pin ) ) ) ||
179+ RecentLibraryReferences . Any ( recent => ! other . RecentLibraryReferences . Any ( lib => lib . Equals ( recent ) ) ) )
163180 {
164181 return false ;
165182 }
166183
167184 foreach ( var host in PinnedProjectReferences )
168185 {
169186 if ( ! other . PinnedProjectReferences . ContainsKey ( host . Key ) ||
170- ! host . Value . OrderBy ( _ => _ ) . SequenceEqual ( other . PinnedProjectReferences [ host . Key ] . OrderBy ( _ => _ ) ) )
187+ ! ( other . PinnedProjectReferences [ host . Key ] is List < ReferenceInfo > otherHost ) ||
188+ otherHost . Count != host . Value . Count ||
189+ host . Value . Any ( pin => ! otherHost . Any ( lib => lib . Equals ( pin ) ) ) )
171190 {
172191 return false ;
173192 }
@@ -176,8 +195,9 @@ public bool Equals(ReferenceSettings other)
176195 foreach ( var host in RecentProjectReferences )
177196 {
178197 if ( ! other . RecentProjectReferences . ContainsKey ( host . Key ) ||
179- ! host . Value . OrderBy ( usage => usage . Timestamp ) . Select ( usage => usage . Reference )
180- . SequenceEqual ( other . RecentProjectReferences [ host . Key ] . OrderBy ( usage => usage . Timestamp ) . Select ( usage => usage . Reference ) ) )
198+ ! ( other . RecentProjectReferences [ host . Key ] is List < ReferenceUsage > otherHost ) ||
199+ otherHost . Count != host . Value . Count ||
200+ host . Value . Any ( pin => ! otherHost . Any ( lib => lib . Reference . Equals ( pin . Reference ) && lib . Timestamp . Equals ( pin . Timestamp ) ) ) )
181201 {
182202 return false ;
183203 }
@@ -188,15 +208,15 @@ public bool Equals(ReferenceSettings other)
188208
189209 public List < ReferenceInfo > GetPinnedReferencesForHost ( string host )
190210 {
191- var key = host . ToUpperInvariant ( ) ;
211+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
192212 return PinnedLibraryReferences . Union ( PinnedProjectReferences . ContainsKey ( key )
193213 ? PinnedProjectReferences [ key ] . ToList ( )
194214 : new List < ReferenceInfo > ( ) ) . ToList ( ) ;
195215 }
196216
197217 public List < ReferenceInfo > GetRecentReferencesForHost ( string host )
198218 {
199- var key = host . ToUpperInvariant ( ) ;
219+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
200220 return RecentLibraryReferences
201221 . Concat ( RecentProjectReferences . ContainsKey ( key )
202222 ? RecentProjectReferences [ key ]
@@ -207,6 +227,14 @@ public List<ReferenceInfo> GetRecentReferencesForHost(string host)
207227
208228 public void UpdatePinnedReferencesForHost ( string host , List < ReferenceInfo > pinned )
209229 {
230+ var key = host ? . ToUpperInvariant ( ) ?? string . Empty ;
231+
232+ PinnedLibraryReferences . Clear ( ) ;
233+ if ( PinnedProjectReferences . ContainsKey ( key ) )
234+ {
235+ PinnedProjectReferences . Remove ( key ) ;
236+ }
237+
210238 foreach ( var reference in pinned )
211239 {
212240 PinReference ( reference , reference . Guid . Equals ( Guid . Empty ) ? host : string . Empty ) ;
@@ -229,16 +257,19 @@ protected class ReferenceUsage
229257 public ReferenceInfo Reference { get ; protected set ; }
230258
231259 [ DataMember ( IsRequired = true ) ]
232- public DateTime Timestamp { get ; protected set ; } = DateTime . Now ;
260+ public DateTime Timestamp { get ; protected set ; }
233261
234262 public ReferenceUsage ( ReferenceInfo reference )
235263 {
236264 Reference = reference ;
265+ Timestamp = DateTime . Now ;
237266 }
238267
239268 public bool Matches ( ReferenceInfo other )
240269 {
241270 return Reference . FullPath . Equals ( other . FullPath , StringComparison . OrdinalIgnoreCase ) ||
271+ ! Reference . Guid . Equals ( Guid . Empty ) &&
272+ ! other . Guid . Equals ( Guid . Empty ) &&
242273 Reference . Guid . Equals ( other . Guid ) &&
243274 Reference . Major == other . Major &&
244275 Reference . Minor == other . Minor ;
@@ -256,6 +287,12 @@ public HostUsages(string host, List<ReferenceUsage> usages)
256287 Host = host ;
257288 Usages = usages ;
258289 }
290+
291+ public HostUsages ( HostUsages other )
292+ {
293+ Host = other . Host ;
294+ Usages = other . Usages . ToList ( ) ;
295+ }
259296 }
260297
261298 [ DataContract ]
@@ -269,6 +306,12 @@ public HostPins(string host, List<ReferenceInfo> usages)
269306 Host = host ;
270307 Pins = usages ;
271308 }
309+
310+ public HostPins ( HostPins other )
311+ {
312+ Host = other . Host ;
313+ Pins = other . Pins . ToList ( ) ;
314+ }
272315 }
273316 }
274317}
0 commit comments