Browse Source

Simplify SnippetManager.LoadGroups, hopefully fixes http://community.sharpdevelop.net/forums/t/11768.aspx

pull/1/head
Daniel Grunwald 15 years ago
parent
commit
b271d6b2a9
  1. 28
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs

28
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/Snippets/SnippetManager.cs

@ -304,43 +304,39 @@ End Property${Caret}",
var merged = group.Snippets.Concat( var merged = group.Snippets.Concat(
defaultGroup.Snippets.Except( defaultGroup.Snippets.Except(
group.Snippets, group.Snippets,
new PredicateComparer<CodeSnippet>((x, y) => x.Name == y.Name, x => x.Name.GetHashCode()) new ByMemberComparer<CodeSnippet, string>(s => s.Name)
).Select(s => new CodeSnippet(s)) ).Select(s => new CodeSnippet(s)) // clone snippets so that defaultGroup is not modified
).OrderBy(s => s.Name).ToList(); ).OrderBy(s => s.Name).ToList();
group.Snippets.Clear(); group.Snippets.Clear();
group.Snippets.AddRange(merged); group.Snippets.AddRange(merged);
} }
} }
foreach (var group in defaultSnippets.Except(savedSnippets, new PredicateComparer<CodeSnippetGroup>( foreach (var group in defaultSnippets.Except(savedSnippets, new ByMemberComparer<CodeSnippetGroup, string>(g => g.Extensions))) {
(x, y) => x.Extensions == y.Extensions,
x => x.Extensions.GetHashCode()
))) {
savedSnippets.Add(group); savedSnippets.Add(group);
} }
return savedSnippets; return savedSnippets;
} }
class PredicateComparer<T> : IEqualityComparer<T> sealed class ByMemberComparer<TObject, TMember> : IEqualityComparer<TObject>
{ {
Func<T, T, bool> equalsFunc; readonly Func<TObject, TMember> selector;
Func<T, int> getHashCodeFunc; readonly IEqualityComparer<TMember> memberComparer = EqualityComparer<TMember>.Default;
public PredicateComparer(Func<T, T, bool> equalsFunc, Func<T, int> getHashCodeFunc) public ByMemberComparer(Func<TObject, TMember> selector)
{ {
this.equalsFunc = equalsFunc; this.selector = selector;
this.getHashCodeFunc = getHashCodeFunc;
} }
public bool Equals(T x, T y) public bool Equals(TObject x, TObject y)
{ {
return equalsFunc(x, y); return memberComparer.Equals(selector(x), selector(y));
} }
public int GetHashCode(T obj) public int GetHashCode(TObject obj)
{ {
return getHashCodeFunc(obj); return memberComparer.GetHashCode(selector(obj));
} }
} }

Loading…
Cancel
Save