anchor.diff:              for (iface, instantiations) in getInterfaces e do
                   yield! iface.MembersFunctionsAndValues |> Seq.choose (fun m -> 
                              // Use this hack when FCS doesn't return enough information on .NET properties
  -                           if iface.IsFSharp || not m.IsProperty then Some (m, instantiations) else None)
  +                           if (iface.IsFSharp || not m.IsProperty) && not m.IsEvent then Some (m, instantiations) else None)
            }
   
       let hasNoInterfaceMember e =
  
positive.code:         let formatMemberSignature (symbolUse: FSharpSymbolUse) =
              Debug.Assert(symbolUse.Symbol :? FSharpMemberFunctionOrValue, "Only accept symbol use of members.")
              try
                  let m = symbolUse.Symbol :?> FSharpMemberFunctionOrValue 
                  let signature = sprintf "%s:%s" m.DisplayName (m.FullType.Format(displayContext))
                  Some (signature.Replace(" ", ""))
              with _ ->
                  None
  
negative.code:         | InterfaceData.ObjExpr(_, bindings) -> 
              List.choose (|MemberNameAndRange|_|) bindings
  
      // Sometimes interface members are stored in the form of `IInterface<'T> -> ...` so we need to get the 2nd generic arguments
      let internal (|MemberFunctionType|) (m: FSharpMemberFunctionOrValue) =
          let typ = m.FullType
          if typ.IsFunctionType && typ.GenericArguments.Count = 2 && m.IsProperty && m.EnclosingEntity.IsFSharp then
              typ.GenericArguments.[1]
          else typ
  
      /// Ideally this info should be returned in error symbols from FCS
      /// Because it isn't, we implement a crude way of getting member signatures:
      ///  (1) Crack ASTs to get member names and their associated ranges
  