anchor.diff:              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 internal (|MemberFunctionType|_|) (typ: FSharpType) =
  +        if typ.IsFunctionType && typ.GenericArguments.Count = 2 then
  +            Some typ.GenericArguments.[1]
  +        else None
  +
  +    let internal (|TypeOfMember|) (m: FSharpMemberFunctionOrValue) =
           let typ = m.FullType
  -        if typ.IsFunctionType && typ.GenericArguments.Count = 2 && m.IsProperty && m.EnclosingEntity.IsFSharp then
  -            typ.GenericArguments.[1]
  -        else typ
  +        match typ with
  +        | MemberFunctionType typ when m.IsProperty && m.EnclosingEntity.IsFSharp ->
  +            typ
  +        | _ -> typ
  +
  +    let internal (|EventFunctionType|_|) (typ: FSharpType) =
  +        match typ with
  +        | MemberFunctionType typ ->
  +            if typ.IsFunctionType && typ.GenericArguments.Count = 2 then
  +                let retType = typ.GenericArguments.[0]
  +                let argType = typ.GenericArguments.[1]
  +                if argType.GenericArguments.Count = 2 then
  +                    Some (argType.GenericArguments.[0], retType)
  +                else None
  +            else None
  +        | _ ->
  +            None
  +
  +    let internal removeWhitespace (str: string) = 
  +        str.Replace(" ", "")
   
       /// Ideally this info should be returned in error symbols from FCS
       /// Because it isn't, we implement a crude way of getting member signatures:
  
positive.code:             Debug.Assert(symbolUse.Symbol :? FSharpMemberFunctionOrValue, "Only accept symbol use of members.")
              try
                  let m = symbolUse.Symbol :?> FSharpMemberFunctionOrValue
                  let typ = m.FullType
                  let signature = sprintf "%s:%s" m.DisplayName (typ.Format(displayContext))
                  Some (signature.Replace(" ", ""))
              with _ ->
                  None
          async {
  
negative.code:             |> Seq.filter (fun (m, insts) -> 
                  // FullType might throw exceptions due to bugs in FCS
                  try
                      let (TypeOfMember typ) = m 
                      let signature = removeWhitespace (sprintf "%s:%s" m.DisplayName (formatType { ctx with ArgInstantiations = insts }  typ))
                      not (Set.contains signature excludedMemberSignatures) 
                  with _ -> true)
          // All members are already implemented
          if Seq.isEmpty missingMembers then
  