anchor.diff:      let g = infoReader.g
       let amap = infoReader.amap
       // NOTE: multiple "open"'s push multiple duplicate values into eIndexedExtensionMembers, hence setify.
  -    // REVIEW: this looks a little slow: ListSet.setify is quadratic. 
  -    let extMemInfos = extMemInfos |> ListSet.setify (ExtensionMember.Equality g) 
  +    let seen = HashSet(ExtensionMember.Comparer g)
       let propCollector = new PropertyCollector(g,amap,m,declaringTy,optFilter,ad)
  -    extMemInfos |> List.iter (fun emem ->
  -        match emem with 
  -        | FSExtMem (vref,_pri) -> 
  -            match vref.MemberInfo with 
  -            | None -> ()
  -            | Some membInfo -> propCollector.Collect(membInfo,vref)
  -        | ILExtMem _ -> 
  -            // No extension properties coming from .NET
  -            ())
  +    for emem in extMemInfos do
  +        if seen.Add emem then
  +            match emem with 
  +            | FSExtMem (vref,_pri) -> 
  +                match vref.MemberInfo with 
  +                | None -> ()
  +                | Some membInfo -> propCollector.Collect(membInfo,vref)
  +            | ILExtMem _ -> 
  +                // No extension properties coming from .NET
  +                ()
       propCollector.Close()
   
   /// Query the available extension properties of a type (including extension properties for inherited types)
  
positive.code:         | Item.CustomOperation (customOpName,_,_) -> customOpName
          | Item.CustomBuilder (nm,_) -> nm
          | _ ->  ""
  
  /// Information about an extension member held in the name resolution environment
  type ExtensionMember = 
  
negative.code:        | ILExtMem (_,md1,_), ILExtMem (_,md2,_) -> MethInfo.MethInfosUseIdenticalDefinitions md1 md2
         | _ -> false
  
     static member Hash e1 =
         match e1 with
         | FSExtMem(vref, _) -> valRefHash vref
         | ILExtMem(_, m, _) -> 
             match m with
             | ILMeth(_, ilmeth, _) -> LanguagePrimitives.PhysicalHash ilmeth.RawMetadata
             | FSMeth(_, _, vref, _) -> valRefHash vref
             | _ -> 0
     
     static member Comparer g = HashIdentity.FromFunctions ExtensionMember.Hash (ExtensionMember.Equality g)
     
     /// Describes the sequence order of the introduction of an extension method. Extension methods that are introduced
     /// later through 'open' get priority in overload resolution.
     member x.Priority = 
  