/*
 * Copyright 2020 The Error Prone Authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.errorprone.bugpatterns;

import static com.google.errorprone.util.ASTHelpers.isSameType;

import com.google.common.collect.ImmutableSet;
import com.google.errorprone.VisitorState;
import com.sun.tools.javac.code.Type;

/** Enumerates types which have poorly-defined behaviour for equals. */
public enum TypesWithUndefinedEquality {
  LONG_SPARSE_ARRAY(
      "LongSparseArray",
      "android.util.LongSparseArray",
      "android.support.v4.util.LongSparseArrayCompat",
      "androidx.core.util.LongSparseArrayCompat",
      "androidx.collection.LongSparseArrayCompat"),
  SPARSE_ARRAY(
      "SparseArray",
      "android.util.SparseArray",
      "androidx.collection.SparseArrayCompat",
      "androidx.collection.SparseArrayCompat"),
  MULTIMAP("Multimap", "com.google.common.collect.Multimap"),
  IMMUTABLE_MULTIMAP("ImmutableMultimap", "com.google.common.collect.ImmutableMultimap"),
  CHAR_SEQUENCE("CharSequence", "java.lang.CharSequence"),
  ITERABLE("Iterable", "java.lang.Iterable", "com.google.common.collect.FluentIterable"),
  COLLECTION("Collection", "java.util.Collection"),
  IMMUTABLE_COLLECTION("ImmutableCollection", "com.google.common.collect.ImmutableCollection"),
  QUEUE("Queue", "java.util.Queue"),
  DATE("Date", "java.util.Date");

  private final String shortName;
  private final ImmutableSet<String> typeNames;

  TypesWithUndefinedEquality(String shortName, String... typeNames) {
    this.shortName = shortName;
    this.typeNames = ImmutableSet.copyOf(typeNames);
  }

  public boolean matchesType(Type type, VisitorState state) {
    return typeNames.stream()
        .anyMatch(typeName -> isSameType(type, state.getTypeFromString(typeName), state));
  }

  public String shortName() {
    return shortName;
  }
}

@@ -959,709 +959,83 @@
 %7B%0A  
-LONG_SPARSE_ARRAY(%0A      %22LongSparseArray%22,%0A      %22android.util.LongSparseArray%22,%0A      %22android.support.v4.util.LongSparseArrayCompat%22,%0A      %22androidx.core.util.LongSparseArrayCompat%22,%0A      %22androidx.collection.LongSparseArrayCompat%22),%0A  SPARSE_ARRAY(%0A      %22SparseArray%22,%0A      %22android.util.SparseArray%22,%0A      %22androidx.collection.SparseArrayCompat%22,%0A      %22androidx.collection.SparseArrayCompat%22),%0A  MULTIMAP(%22Multimap%22, %22com.google.common.collect.Multimap%22),%0A  IMMUTABLE_MULTIMAP(%22ImmutableMultimap%22, %22com.google.common.collect.ImmutableMultimap%22),%0A  CHAR_SEQUENCE(%22CharSequence%22, %22java.lang.CharSequence%22),%0A  ITERABLE(%22Iterable%22, %22java.lang.Iterable%22, %22com.google.common.collect.FluentIterabl
+// keep-sorted start%0A  CHAR_SEQUENCE(%22CharSequence%22, %22java.lang.CharSequenc
 e%22),
@@ -1087,16 +1087,50 @@
 tion%22),%0A
+  DATE(%22Date%22, %22java.util.Date%22),%0A
   IMMUTA
@@ -1223,76 +1223,646 @@
 ,%0A  
-QUEUE(%22Queue%22, %22java.util.Queue%22),%0A  DATE(%22Date%22, %22java.util.Date%22);
+IMMUTABLE_MULTIMAP(%22ImmutableMultimap%22, %22com.google.common.collect.ImmutableMultimap%22),%0A  ITERABLE(%22Iterable%22, %22com.google.common.collect.FluentIterable%22, %22java.lang.Iterable%22),%0A  LONG_SPARSE_ARRAY(%0A      %22LongSparseArray%22,%0A      %22android.support.v4.util.LongSparseArrayCompat%22,%0A      %22android.util.LongSparseArray%22,%0A      %22androidx.collection.LongSparseArrayCompat%22,%0A      %22androidx.core.util.LongSparseArrayCompat%22),%0A  MULTIMAP(%22Multimap%22, %22com.google.common.collect.Multimap%22),%0A  QUEUE(%22Queue%22, %22java.util.Queue%22),%0A  SPARSE_ARRAY(%22SparseArray%22, %22android.util.SparseArray%22, %22androidx.collection.SparseArrayCompat%22);%0A  // keep-sorted end
 %0A%0A  

Remove duplicate `TypesWithUndefinedEquality#SPARSE_ARRAY` entry