// Path: rxgroups/src/main/java/com/airbnb/rxgroups/AutoResubscribingObserver.java
// public abstract class AutoResubscribingObserver<T> implements TaggedObserver<T> {
// 
//   private String tag;
// 
//   public final String getTag() {
//     return tag;
//   }
// 
//   void setTag(String tag) {
//     this.tag = tag;
//   }
// 
//   @Override
//   public void onComplete() {
// 
//   }
// 
//   @Override
//   public void onError(Throwable e) {
// 
//   }
// 
//   @Override
//   public void onNext(T t) {
// 
//   }
// 
//   @Override public void onSubscribe(@NonNull Disposable d) {
// 
//   }
// }
// 
// Path: rxgroups/src/main/java/com/airbnb/rxgroups/AutoTaggableObserver.java
// public interface AutoTaggableObserver<T> extends TaggedObserver<T> {
//   void setTag(String tag);
// }
// 
// Path: rxgroups/src/main/java/com/airbnb/rxgroups/TaggedObserver.java
// public interface TaggedObserver<T> extends Observer<T> {
// 
//   /**
//    * @return A string which uniquely identifies this Observer. In order to use
//    * {@link ObservableGroup#resubscribe(TaggedObserver, String)} the tag must be
//    * stable across lifecycles of the observer.
//    */
//   String getTag();
// 
// }


import com.airbnb.rxgroups.AutoResubscribingObserver;
import com.airbnb.rxgroups.AutoTaggableObserver;
import com.airbnb.rxgroups.TaggedObserver;
import javax.lang.model.element.Element;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
package com.airbnb.rxgroups.processor;




class ProcessorUtils {

  static boolean isResubscribingObserver(Element observerFieldElement, Types typeUtil, Elements
          elementUtil) {
    final TypeMirror autoResubscribingTypeMirror = elementUtil.getTypeElement(
            AutoResubscribingObserver.class.getCanonicalName()).asType();
    return typeUtil.isAssignable(observerFieldElement.asType(), typeUtil.erasure(
            autoResubscribingTypeMirror));
  }

  static boolean isTaggedObserver(Element observerFieldElement, Types typeUtil, Elements
      elementUtil) {
    final TypeMirror autoResubscribingTypeMirror = elementUtil.getTypeElement(
        TaggedObserver.class.getCanonicalName()).asType();
    return typeUtil.isAssignable(observerFieldElement.asType(), typeUtil.erasure(
        autoResubscribingTypeMirror));
  }

  static boolean isAutoTaggable(Element observerFieldElement, Types typeUtil, Elements
// Path: rxgroups/src/main/java/com/airbnb/rxgroups/AutoResubscribingObserver.java
// public abstract class AutoResubscribingObserver<T> implements TaggedObserver<T> {
// 
//   private String tag;
// 
//   public final String getTag() {
//     return tag;
//   }
// 
//   void setTag(String tag) {
//     this.tag = tag;
//   }
// 
//   @Override
//   public void onComplete() {
// 
//   }
// 
//   @Override
//   public void onError(Throwable e) {
// 
//   }
// 
//   @Override
//   public void onNext(T t) {
// 
//   }
// 
//   @Override public void onSubscribe(@NonNull Disposable d) {
// 
//   }
// }
// 
// Path: rxgroups/src/main/java/com/airbnb/rxgroups/AutoTaggableObserver.java
// public interface AutoTaggableObserver<T> extends TaggedObserver<T> {
//   void setTag(String tag);
// }
// 
// Path: rxgroups/src/main/java/com/airbnb/rxgroups/TaggedObserver.java
// public interface TaggedObserver<T> extends Observer<T> {
// 
//   /**
//    * @return A string which uniquely identifies this Observer. In order to use
//    * {@link ObservableGroup#resubscribe(TaggedObserver, String)} the tag must be
//    * stable across lifecycles of the observer.
//    */
//   String getTag();
// 
// }


// Path: rxgroups-processor/src/main/java/com/airbnb/rxgroups/processor/ProcessorUtils.java
import com.airbnb.rxgroups.AutoResubscribingObserver;
import com.airbnb.rxgroups.AutoTaggableObserver;
import com.airbnb.rxgroups.TaggedObserver;
import javax.lang.model.element.Element;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

package com.airbnb.rxgroups.processor;




class ProcessorUtils {

  static boolean isResubscribingObserver(Element observerFieldElement, Types typeUtil, Elements
          elementUtil) {
    final TypeMirror autoResubscribingTypeMirror = elementUtil.getTypeElement(
            AutoResubscribingObserver.class.getCanonicalName()).asType();
    return typeUtil.isAssignable(observerFieldElement.asType(), typeUtil.erasure(
            autoResubscribingTypeMirror));
  }

  static boolean isTaggedObserver(Element observerFieldElement, Types typeUtil, Elements
      elementUtil) {
    final TypeMirror autoResubscribingTypeMirror = elementUtil.getTypeElement(
        TaggedObserver.class.getCanonicalName()).asType();
    return typeUtil.isAssignable(observerFieldElement.asType(), typeUtil.erasure(
        autoResubscribingTypeMirror));
  }

  static boolean isAutoTaggable(Element observerFieldElement, Types typeUtil, Elements
      elementUtil) {