// Path: src/com/google/java/contract/core/model/ElementKind.java
// public enum ElementKind {
//   /*
//    * Source elements.
//    */
// 
//   /**
//    * A source file.
//    */
//   SOURCE,
// 
//   /**
//    * A class.
//    */
//   CLASS,
// 
//   /**
//    * An interface.
//    */
//   INTERFACE,
// 
//   /**
//    * An annotation.
//    */
//   ANNOTATION_TYPE,
// 
//   /**
//    * An enum.
//    */
//   ENUM,
// 
//   /**
//    * An enum constant.
//    */
//   CONSTANT,
// 
//   /**
//    * A field. Mocked in output.
//    */
//   FIELD,
// 
//   /**
//    * A method that is not a constructor. Mocked in output.
//    */
//   METHOD,
// 
//   /**
//    * A constructor. Mocked in output.
//    */
//   CONSTRUCTOR,
// 
//   /**
//    * A method parameter.
//    */
//   PARAMETER,
// 
//   /**
//    * An @Invariant annotation.
//    */
//   INVARIANT,
// 
//   /**
//    * An @Requires annotation. Source-only, not present in output.
//    */
//   REQUIRES,
// 
//   /**
//    * An @Ensures annotation. Source-only, not present in output.
//    */
//   ENSURES,
// 
//   /**
//    * An @ThrowEnsures annotation. Source-only, not present in output.
//    */
//   THROW_ENSURES,
// 
//   /*
//    * Output elements.
//    */
// 
//   /**
//    * An @ContractMethodSignature annotation.
//    */
//   CONTRACT_SIGNATURE,
// 
//   /**
//    * A contract method.
//    */
//   CONTRACT_METHOD,
// 
//   /**
//    * A mock contract method.
//    */
//   CONTRACT_MOCK;
// 
//   public boolean isType() {
//     switch (this) {
//       case CLASS:
//       case ENUM:
//       case INTERFACE:
//       case ANNOTATION_TYPE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isMember() {
//     switch (this) {
//       case FIELD:
//       case METHOD:
//       case CONSTRUCTOR:
//       case CONTRACT_METHOD:
//       case CONTRACT_MOCK:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   @Requires("isMember()")
//   public boolean isMock() {
//     switch (this) {
//       case METHOD:
//       case CONSTRUCTOR:
//       case CONTRACT_MOCK:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   @Requires("isMember()")
//   public boolean isContract() {
//     return !isMock();
//   }
// 
//   public boolean isAnnotation() {
//     switch (this) {
//       case INVARIANT:
//       case REQUIRES:
//       case ENSURES:
//       case THROW_ENSURES:
//       case CONTRACT_SIGNATURE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isInterfaceType() {
//     switch(this) {
//       case INTERFACE:
//       case ANNOTATION_TYPE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isSourceAnnotation() {
//     switch (this) {
//       case INVARIANT:
//       case REQUIRES:
//       case ENSURES:
//       case THROW_ENSURES:
//         return true;
//       default:
//         return false;
//     }
//   }
// }


import com.google.java.contract.Ensures;
import com.google.java.contract.Invariant;
import com.google.java.contract.Requires;
import com.google.java.contract.core.model.ClassName;
import com.google.java.contract.core.model.ElementKind;
import com.google.java.contract.core.model.ElementModifier;
import com.google.java.contract.core.model.QualifiedElementModel;
import com.google.java.contract.core.model.TypeName;
import java.util.Iterator;
import java.util.List;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
    StringBuilder buffer = new StringBuilder();
    buffer.append(name);
    buffer.append(" extends ");

    Iterator<? extends TypeMirror> iter = bounds.iterator();
    for (;;) {
      buffer.append(iter.next().toString());
      if (!iter.hasNext()) {
        break;
      }
      buffer.append(" & ");
    }

    return new TypeName(buffer.toString());
  }

  /**
   * Gets the contract kind of an annotation given its qualified name.
   * Returns null if the annotation is not a contract annotation.
   *
   * @param annotationName the fully qualified name of the annotation
   * @return the contract type, null if not contracts
   */
  ElementKind getAnnotationKindForName(AnnotationMirror annotation) {
    String annotationName = annotation.getAnnotationType().toString();
    ElementKind kind;
    if (annotationName.equals("com.google.java.contract.Invariant")) {
      kind = ElementKind.INVARIANT;
    } else if (annotationName.equals("com.google.java.contract.Requires")) {
      kind = ElementKind.REQUIRES;
// Path: src/com/google/java/contract/core/model/ElementKind.java
// public enum ElementKind {
//   /*
//    * Source elements.
//    */
// 
//   /**
//    * A source file.
//    */
//   SOURCE,
// 
//   /**
//    * A class.
//    */
//   CLASS,
// 
//   /**
//    * An interface.
//    */
//   INTERFACE,
// 
//   /**
//    * An annotation.
//    */
//   ANNOTATION_TYPE,
// 
//   /**
//    * An enum.
//    */
//   ENUM,
// 
//   /**
//    * An enum constant.
//    */
//   CONSTANT,
// 
//   /**
//    * A field. Mocked in output.
//    */
//   FIELD,
// 
//   /**
//    * A method that is not a constructor. Mocked in output.
//    */
//   METHOD,
// 
//   /**
//    * A constructor. Mocked in output.
//    */
//   CONSTRUCTOR,
// 
//   /**
//    * A method parameter.
//    */
//   PARAMETER,
// 
//   /**
//    * An @Invariant annotation.
//    */
//   INVARIANT,
// 
//   /**
//    * An @Requires annotation. Source-only, not present in output.
//    */
//   REQUIRES,
// 
//   /**
//    * An @Ensures annotation. Source-only, not present in output.
//    */
//   ENSURES,
// 
//   /**
//    * An @ThrowEnsures annotation. Source-only, not present in output.
//    */
//   THROW_ENSURES,
// 
//   /*
//    * Output elements.
//    */
// 
//   /**
//    * An @ContractMethodSignature annotation.
//    */
//   CONTRACT_SIGNATURE,
// 
//   /**
//    * A contract method.
//    */
//   CONTRACT_METHOD,
// 
//   /**
//    * A mock contract method.
//    */
//   CONTRACT_MOCK;
// 
//   public boolean isType() {
//     switch (this) {
//       case CLASS:
//       case ENUM:
//       case INTERFACE:
//       case ANNOTATION_TYPE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isMember() {
//     switch (this) {
//       case FIELD:
//       case METHOD:
//       case CONSTRUCTOR:
//       case CONTRACT_METHOD:
//       case CONTRACT_MOCK:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   @Requires("isMember()")
//   public boolean isMock() {
//     switch (this) {
//       case METHOD:
//       case CONSTRUCTOR:
//       case CONTRACT_MOCK:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   @Requires("isMember()")
//   public boolean isContract() {
//     return !isMock();
//   }
// 
//   public boolean isAnnotation() {
//     switch (this) {
//       case INVARIANT:
//       case REQUIRES:
//       case ENSURES:
//       case THROW_ENSURES:
//       case CONTRACT_SIGNATURE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isInterfaceType() {
//     switch(this) {
//       case INTERFACE:
//       case ANNOTATION_TYPE:
//         return true;
//       default:
//         return false;
//     }
//   }
// 
//   public boolean isSourceAnnotation() {
//     switch (this) {
//       case INVARIANT:
//       case REQUIRES:
//       case ENSURES:
//       case THROW_ENSURES:
//         return true;
//       default:
//         return false;
//     }
//   }
// }


// Path: src/com/google/java/contract/core/apt/FactoryUtils.java
import com.google.java.contract.Ensures;
import com.google.java.contract.Invariant;
import com.google.java.contract.Requires;
import com.google.java.contract.core.model.ClassName;
import com.google.java.contract.core.model.ElementKind;
import com.google.java.contract.core.model.ElementModifier;
import com.google.java.contract.core.model.QualifiedElementModel;
import com.google.java.contract.core.model.TypeName;
import java.util.Iterator;
import java.util.List;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.TypeParameterElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;

    StringBuilder buffer = new StringBuilder();
    buffer.append(name);
    buffer.append(" extends ");

    Iterator<? extends TypeMirror> iter = bounds.iterator();
    for (;;) {
      buffer.append(iter.next().toString());
      if (!iter.hasNext()) {
        break;
      }
      buffer.append(" & ");
    }

    return new TypeName(buffer.toString());
  }

  /**
   * Gets the contract kind of an annotation given its qualified name.
   * Returns null if the annotation is not a contract annotation.
   *
   * @param annotationName the fully qualified name of the annotation
   * @return the contract type, null if not contracts
   */
  ElementKind getAnnotationKindForName(AnnotationMirror annotation) {
    String annotationName = annotation.getAnnotationType().toString();
    ElementKind kind;
    if (annotationName.equals("com.google.java.contract.Invariant")) {
      kind = ElementKind.INVARIANT;
    } else if (annotationName.equals("com.google.java.contract.Requires")) {
      kind = ElementKind.REQUIRES;
    } else if (annotationName.equals("com.google.java.contract.Ensures")) {