// Path: holder-compiler/src/main/java/com/steve/creact/processor/core/model/AbstractModel.java
// public abstract class AbstractModel<R> {
// 
//     protected Element element;
//     protected ElementVisitorAdapter elementVisitor;
//     /**
//      * real model
//      */
//     private R model;
// 
//     public AbstractModel(Element element) {
//         this.element = element;
//     }
// 
//     public boolean isClass() {
//         return element.getKind().isClass();
//     }
// 
//     public boolean isInterface() {
//         return element.getKind().isInterface();
//     }
// 
//     public boolean isField() {
// 
//         return element.getKind().isField();
//     }
// 
//     public String getSimpleName() {
//         return element.getSimpleName().toString();
//     }
// 
//     public <P> void visit(P p) {
//         model = (R) element.accept(this.elementVisitor, p);
//     }
// 
//     public <P> void setElementVisitor(ElementVisitorAdapter<R, P> visitor) {
//         this.elementVisitor = visitor;
//     }
// 
//     public R getRealModel() {
//         return model;
//     }
// 
// }
// 
// Path: holder-compiler/src/main/java/com/steve/creact/processor/core/model/ElementVisitorAdapter.java
// public abstract class ElementVisitorAdapter<R, P> implements ElementVisitor<R, P> {
//     protected ProcessingEnvironment processingEnv;
//     protected Types typeUtils;
//     protected Logger logger;
//     protected Elements elements;
// 
//     public ElementVisitorAdapter(ProcessingEnvironment processingEnv) {
//         this.processingEnv = processingEnv;
//         this.typeUtils = processingEnv.getTypeUtils();
//         this.logger = Logger.getInstance(processingEnv.getMessager());
//         this.elements = processingEnv.getElementUtils();
//     }
// 
//     @Override
//     public R visit(Element e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visit(Element e) {
//         return null;
//     }
// 
//     @Override
//     public R visitPackage(PackageElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitType(TypeElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitVariable(VariableElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitExecutable(ExecutableElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitTypeParameter(TypeParameterElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitUnknown(Element e, P p) {
//         return null;
//     }
// 
//     protected String getSimpleName(Element e){
//         return e.getSimpleName().toString();
//     }
// 
//     protected String getQualifiedName(TypeElement te){
//         return te.getQualifiedName().toString();
//     }
// 
//     protected String getPackageName(TypeElement te){
//         return getQualifiedName(te).replace("."+getSimpleName(te),"");
//     }
// }


import com.steve.creact.annotation.DataBean;
import com.steve.creact.processor.core.model.AbstractModel;
import com.steve.creact.processor.core.model.ElementVisitorAdapter;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;
package com.steve.creact.processor.app.model;



/**
 * Created by Administrator on 2016/4/10.
 */
public class DataBeanModel extends AbstractModel<BeanInfo> {
    public DataBeanModel(Element element, ProcessingEnvironment processingEnv) {
        super(element);
        setElementVisitor(DataBeanVisitor.getInstance(processingEnv));
        visit(null);
    }

    /**
     * Element Visitor
     */
// Path: holder-compiler/src/main/java/com/steve/creact/processor/core/model/AbstractModel.java
// public abstract class AbstractModel<R> {
// 
//     protected Element element;
//     protected ElementVisitorAdapter elementVisitor;
//     /**
//      * real model
//      */
//     private R model;
// 
//     public AbstractModel(Element element) {
//         this.element = element;
//     }
// 
//     public boolean isClass() {
//         return element.getKind().isClass();
//     }
// 
//     public boolean isInterface() {
//         return element.getKind().isInterface();
//     }
// 
//     public boolean isField() {
// 
//         return element.getKind().isField();
//     }
// 
//     public String getSimpleName() {
//         return element.getSimpleName().toString();
//     }
// 
//     public <P> void visit(P p) {
//         model = (R) element.accept(this.elementVisitor, p);
//     }
// 
//     public <P> void setElementVisitor(ElementVisitorAdapter<R, P> visitor) {
//         this.elementVisitor = visitor;
//     }
// 
//     public R getRealModel() {
//         return model;
//     }
// 
// }
// 
// Path: holder-compiler/src/main/java/com/steve/creact/processor/core/model/ElementVisitorAdapter.java
// public abstract class ElementVisitorAdapter<R, P> implements ElementVisitor<R, P> {
//     protected ProcessingEnvironment processingEnv;
//     protected Types typeUtils;
//     protected Logger logger;
//     protected Elements elements;
// 
//     public ElementVisitorAdapter(ProcessingEnvironment processingEnv) {
//         this.processingEnv = processingEnv;
//         this.typeUtils = processingEnv.getTypeUtils();
//         this.logger = Logger.getInstance(processingEnv.getMessager());
//         this.elements = processingEnv.getElementUtils();
//     }
// 
//     @Override
//     public R visit(Element e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visit(Element e) {
//         return null;
//     }
// 
//     @Override
//     public R visitPackage(PackageElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitType(TypeElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitVariable(VariableElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitExecutable(ExecutableElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitTypeParameter(TypeParameterElement e, P p) {
//         return null;
//     }
// 
//     @Override
//     public R visitUnknown(Element e, P p) {
//         return null;
//     }
// 
//     protected String getSimpleName(Element e){
//         return e.getSimpleName().toString();
//     }
// 
//     protected String getQualifiedName(TypeElement te){
//         return te.getQualifiedName().toString();
//     }
// 
//     protected String getPackageName(TypeElement te){
//         return getQualifiedName(te).replace("."+getSimpleName(te),"");
//     }
// }


// Path: holder-compiler/src/main/java/com/steve/creact/processor/app/model/DataBeanModel.java
import com.steve.creact.annotation.DataBean;
import com.steve.creact.processor.core.model.AbstractModel;
import com.steve.creact.processor.core.model.ElementVisitorAdapter;
import javax.annotation.processing.ProcessingEnvironment;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.MirroredTypeException;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import javax.tools.Diagnostic;

package com.steve.creact.processor.app.model;



/**
 * Created by Administrator on 2016/4/10.
 */
public class DataBeanModel extends AbstractModel<BeanInfo> {
    public DataBeanModel(Element element, ProcessingEnvironment processingEnv) {
        super(element);
        setElementVisitor(DataBeanVisitor.getInstance(processingEnv));
        visit(null);
    }

    /**
     * Element Visitor
     */
    public static class DataBeanVisitor extends ElementVisitorAdapter<BeanInfo, Void> {