langtools/src/share/sample/language/model/CoreReflectionFactory.java
changeset 17581 69b191cb1d7e
child 17806 b694bd72f635
equal deleted inserted replaced
17580:6696a7abec02 17581:69b191cb1d7e
       
     1 /*
       
     2  * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  *
       
     8  *   - Redistributions of source code must retain the above copyright
       
     9  *     notice, this list of conditions and the following disclaimer.
       
    10  *
       
    11  *   - Redistributions in binary form must reproduce the above copyright
       
    12  *     notice, this list of conditions and the following disclaimer in the
       
    13  *     documentation and/or other materials provided with the distribution.
       
    14  *
       
    15  *   - Neither the name of Oracle nor the names of its
       
    16  *     contributors may be used to endorse or promote products derived
       
    17  *     from this software without specific prior written permission.
       
    18  *
       
    19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    30  */
       
    31 
       
    32 import java.lang.annotation.Annotation;
       
    33 import javax.annotation.processing.SupportedSourceVersion;
       
    34 import javax.lang.model.element.*;
       
    35 import javax.lang.model.element.Modifier;
       
    36 import javax.lang.model.type.*;
       
    37 import javax.lang.model.util.*;
       
    38 import java.lang.reflect.*;
       
    39 import java.io.Writer;
       
    40 import java.util.*;
       
    41 
       
    42 import static javax.lang.model.SourceVersion.RELEASE_8;
       
    43 import static java.util.Objects.*;
       
    44 
       
    45 /**
       
    46  * This class provides a proof-of-concept implementation of the {@code
       
    47  * javax.lang.model.*} API backed by core reflection. That is, rather
       
    48  * than having a source file or compile-time class file as the
       
    49  * originator of the information about an element or type, as done
       
    50  * during standard annotation processing, runtime core reflection
       
    51  * objects serve that purpose instead.
       
    52  *
       
    53  * With this kind of implementation, the same logic can be used for
       
    54  * both compile-time and runtime processing of annotations.
       
    55  *
       
    56  * The nested types in this class define a specialization of {@code
       
    57  * javax.lang.model.*} to provide some additional functionality and
       
    58  * type information. The original {@code javax.lang.model.*} API was
       
    59  * designed to accommodate such a specialization by using wildcards in
       
    60  * the return types of methods.
       
    61  *
       
    62  * It would be technically possible for further specializations of the
       
    63  * API implemented in this class to define alternative semantics of
       
    64  * annotation look-up. For example to allow one annotation to have the
       
    65  * effect of macro-expanding into a set of other annotations.
       
    66  *
       
    67  * Some aspects of the implementation are left as "exercises for the
       
    68  * reader" to complete if interested.
       
    69  *
       
    70  * When passed null pointers, the methods defined in this type will
       
    71  * generally throw null pointer exceptions.
       
    72  *
       
    73  * To get started, first compile this file with a command line like:
       
    74  *
       
    75  * <pre>
       
    76  * $JDK/bin/javac -parameters -Xdoclint:all/public -Xlint:all -d $OUTPUT_DIR CoreReflectionFactory.java
       
    77  * </pre>
       
    78  *
       
    79  * and then run the main method of {@code CoreReflectionFactory},
       
    80  * which will print out a representation of {@code
       
    81  * CoreReflectionFactory}. To use the printing logic defined in {@code
       
    82  * javac}, put {@code tools.jar} on the classpath as in:
       
    83  *
       
    84  * <pre>
       
    85  * $JDK/bin/java -cp $OUTPUT_DIR:$JDK_ROOT/lib/tools.jar CoreReflectionFactory
       
    86  * </pre>
       
    87  *
       
    88  * @author Joseph D. Darcy (darcy)
       
    89  * @author Joel Borggren-Franck (jfranck)
       
    90  */
       
    91 public class CoreReflectionFactory {
       
    92     private CoreReflectionFactory() {
       
    93         throw new AssertionError("No instances of CoreReflectionFactory for you!");
       
    94     }
       
    95 
       
    96     /**
       
    97      * Returns a reflection type element mirroring a {@code Class} object.
       
    98      * @return a reflection type element mirroring a {@code Class} object
       
    99      * @param clazz the {@code Class} to mirror
       
   100      */
       
   101     public static ReflectionTypeElement createMirror(Class<?> clazz) {
       
   102         return new CoreReflTypeElement(Objects.requireNonNull(clazz));
       
   103     }
       
   104 
       
   105     /**
       
   106      * Returns a reflection package element mirroring a {@code Package} object.
       
   107      * @return a reflection package element mirroring a {@code Package} object
       
   108      * @param pkg the {@code Package} to mirror
       
   109      */
       
   110     public static ReflectionPackageElement createMirror(Package pkg) {
       
   111         // Treat a null pkg to mean an unnamed package.
       
   112         return new CoreReflPackageElement(pkg);
       
   113     }
       
   114 
       
   115     /**
       
   116      * Returns a reflection variable element mirroring a {@code Field} object.
       
   117      * @return a reflection variable element mirroring a {@code Field} object
       
   118      * @param field the {@code Field} to mirror
       
   119      */
       
   120     public static ReflectionVariableElement createMirror(Field field) {
       
   121         return new CoreReflFieldVariableElement(Objects.requireNonNull(field));
       
   122     }
       
   123 
       
   124     /**
       
   125      * Returns a reflection executable element mirroring a {@code Method} object.
       
   126      * @return a reflection executable element mirroring a {@code Method} object
       
   127      * @param method the {@code Method} to mirror
       
   128      */
       
   129     public static ReflectionExecutableElement createMirror(Method method)  {
       
   130         return new CoreReflMethodExecutableElement(Objects.requireNonNull(method));
       
   131     }
       
   132 
       
   133     /**
       
   134      * Returns a reflection executable element mirroring a {@code Constructor} object.
       
   135      * @return a reflection executable element mirroring a {@code Constructor} object
       
   136      * @param constructor the {@code Constructor} to mirror
       
   137      */
       
   138     public static ReflectionExecutableElement createMirror(Constructor<?> constructor)  {
       
   139         return new CoreReflConstructorExecutableElement(Objects.requireNonNull(constructor));
       
   140     }
       
   141 
       
   142     /**
       
   143      * Returns a type parameter element mirroring a {@code TypeVariable} object.
       
   144      * @return a type parameter element mirroring a {@code TypeVariable} object
       
   145      * @param tv the {@code TypeVariable} to mirror
       
   146      */
       
   147     public static TypeParameterElement createMirror(java.lang.reflect.TypeVariable<?> tv) {
       
   148         return new CoreReflTypeParameterElement(Objects.requireNonNull(tv));
       
   149     }
       
   150 
       
   151     /**
       
   152      * Returns a variable element mirroring a {@code Parameter} object.
       
   153      * @return a variable element mirroring a {@code Parameter} object
       
   154      * @param p the {Parameter} to mirror
       
   155      */
       
   156     public static VariableElement createMirror(java.lang.reflect.Parameter p) {
       
   157         return new CoreReflParameterVariableElement(Objects.requireNonNull(p));
       
   158     }
       
   159 
       
   160     /**
       
   161      * Returns an annotation mirror mirroring an annotation object.
       
   162      * @return an annotation mirror mirroring an annotation object
       
   163      * @param annotation the annotation to mirror
       
   164      */
       
   165     public static AnnotationMirror createMirror(Annotation annotation)  {
       
   166         return new CoreReflAnnotationMirror(Objects.requireNonNull(annotation));
       
   167     }
       
   168 
       
   169     /**
       
   170      * Returns a {@code Types} utility object for type objects backed by core reflection.
       
   171      * @return a {@code Types} utility object for type objects backed by core reflection
       
   172      */
       
   173     public static Types getTypes() {
       
   174         return CoreReflTypes.instance();
       
   175     }
       
   176 
       
   177     /**
       
   178      * Returns an {@code Elements} utility object for type objects backed by core reflection.
       
   179      * @return an {@code Elements} utility object for type objects backed by core reflection
       
   180      */
       
   181     public static Elements getElements() {
       
   182         return CoreReflElements.instance();
       
   183     }
       
   184 
       
   185     // Helper
       
   186     private static TypeMirror createTypeMirror(Class<?> c) {
       
   187         return TypeFactory.instance(Objects.requireNonNull(c));
       
   188     }
       
   189 
       
   190     /**
       
   191      * Main method; prints out a representation of this class.
       
   192      * @param args command-line arguments, currently ignored
       
   193      */
       
   194     public static void main(String... args) {
       
   195         getElements().printElements(new java.io.PrintWriter(System.out),
       
   196                                     createMirror(CoreReflectionFactory.class));
       
   197     }
       
   198 
       
   199     /**
       
   200      * A specialization of {@code javax.lang.model.element.Element} that is
       
   201      * backed by core reflection.
       
   202      */
       
   203     public static interface ReflectionElement
       
   204         extends Element, AnnotatedElement {
       
   205 
       
   206         /**
       
   207          * {@inheritDoc}
       
   208          */
       
   209         @Override
       
   210         ReflectionElement getEnclosingElement();
       
   211 
       
   212         /**
       
   213          * {@inheritDoc}
       
   214          */
       
   215         @Override
       
   216         List<ReflectionElement> getEnclosedElements();
       
   217 
       
   218         /**
       
   219          * Applies a visitor to this element.
       
   220          *
       
   221          * @param v the visitor operating on this element
       
   222          * @param p additional parameter to the visitor
       
   223          * @param <R> the return type of the visitor's methods
       
   224          * @param <P> the type of the additional parameter to the visitor's methods
       
   225          * @return a visitor-specified result
       
   226          */
       
   227         <R,P> R accept(ReflectionElementVisitor<R,P> v, P p);
       
   228 
       
   229         // Functionality specific to the specialization
       
   230         /**
       
   231          * Returns the underlying core reflection source object, if applicable.
       
   232          * @return the underlying core reflection source object, if applicable
       
   233          */
       
   234         AnnotatedElement getSource();
       
   235 
       
   236         // Functionality from javax.lang.model.util.Elements
       
   237         /**
       
   238          * Returns the package of an element. The package of a package
       
   239          * is itself.
       
   240          * @return the package of an element
       
   241          */
       
   242         ReflectionPackageElement getPackage();
       
   243 
       
   244     }
       
   245 
       
   246     /**
       
   247      * A logical specialization of {@code
       
   248      * javax.lang.model.element.ElementVisitor} being backed by core
       
   249      * reflection.
       
   250      *
       
   251      * @param <R> the return type of this visitor's methods.
       
   252      * @param <P> the type of the additional parameter to this visitor's
       
   253      *            methods.
       
   254      */
       
   255     public static interface ReflectionElementVisitor<R, P> {
       
   256         /**
       
   257          * Visits an element.
       
   258          * @param e  the element to visit
       
   259          * @param p  a visitor-specified parameter
       
   260          * @return a visitor-specified result
       
   261          */
       
   262         R visit(ReflectionElement e, P p);
       
   263 
       
   264         /**
       
   265          * A convenience method equivalent to {@code v.visit(e, null)}.
       
   266          * @param e  the element to visit
       
   267          * @return a visitor-specified result
       
   268          */
       
   269         R visit(ReflectionElement e);
       
   270 
       
   271         /**
       
   272          * Visits a package element.
       
   273          * @param e  the element to visit
       
   274          * @param p  a visitor-specified parameter
       
   275          * @return a visitor-specified result
       
   276          */
       
   277         R visitPackage(ReflectionPackageElement e, P p);
       
   278 
       
   279         /**
       
   280          * Visits a type element.
       
   281          * @param e  the element to visit
       
   282          * @param p  a visitor-specified parameter
       
   283          * @return a visitor-specified result
       
   284          */
       
   285         R visitType(ReflectionTypeElement e, P p);
       
   286 
       
   287         /**
       
   288          * Visits a variable element.
       
   289          * @param e  the element to visit
       
   290          * @param p  a visitor-specified parameter
       
   291          * @return a visitor-specified result
       
   292          */
       
   293         R visitVariable(ReflectionVariableElement e, P p);
       
   294 
       
   295         /**
       
   296          * Visits an executable element.
       
   297          * @param e  the element to visit
       
   298          * @param p  a visitor-specified parameter
       
   299          * @return a visitor-specified result
       
   300          */
       
   301         R visitExecutable(ReflectionExecutableElement e, P p);
       
   302 
       
   303         /**
       
   304          * Visits a type parameter element.
       
   305          * @param e  the element to visit
       
   306          * @param p  a visitor-specified parameter
       
   307          * @return a visitor-specified result
       
   308          */
       
   309         R visitTypeParameter(ReflectionTypeParameterElement e, P p);
       
   310 
       
   311         /**
       
   312          * Visits an unknown kind of element.
       
   313          * This can occur if the language evolves and new kinds
       
   314          * of elements are added to the {@code Element} hierarchy.
       
   315          *
       
   316          * @param e  the element to visit
       
   317          * @param p  a visitor-specified parameter
       
   318          * @return a visitor-specified result
       
   319          * @throws UnknownElementException
       
   320          * a visitor implementation may optionally throw this exception
       
   321          */
       
   322         R visitUnknown(ReflectionElement e, P p);
       
   323     }
       
   324 
       
   325     /**
       
   326      * A specialization of {@code javax.lang.model.element.ExecutableElement} that is
       
   327      * backed by core reflection.
       
   328      */
       
   329     public static interface ReflectionExecutableElement
       
   330         extends ReflectionElement, ExecutableElement, ReflectionParameterizable {
       
   331 
       
   332         /**
       
   333          * {@inheritDoc}
       
   334          */
       
   335         @Override
       
   336         List<ReflectionTypeParameterElement> getTypeParameters();
       
   337 
       
   338         /**
       
   339          * {@inheritDoc}
       
   340          */
       
   341         @Override
       
   342         List<ReflectionVariableElement> getParameters();
       
   343 
       
   344         // Functionality specific to the specialization
       
   345         /**
       
   346          * Returns all parameters, including synthetic ones.
       
   347          * @return all parameters, including synthetic ones
       
   348          */
       
   349         List<ReflectionVariableElement> getAllParameters();
       
   350 
       
   351         /**
       
   352          * {@inheritDoc}
       
   353          */
       
   354         @Override
       
   355         Executable getSource();
       
   356 
       
   357         /**
       
   358          * Returns true if this executable is a synthetic construct; returns false otherwise.
       
   359          * @return true if this executable is a synthetic construct; returns false otherwise
       
   360          */
       
   361         boolean isSynthetic();
       
   362 
       
   363         /**
       
   364          * Returns true if this executable is a bridge method; returns false otherwise.
       
   365          * @return true if this executable is a bridge method; returns false otherwise
       
   366          */
       
   367         boolean isBridge();
       
   368     }
       
   369 
       
   370     /**
       
   371      * A specialization of {@code javax.lang.model.element.PackageElement} being
       
   372      * backed by core reflection.
       
   373      */
       
   374     public static interface ReflectionPackageElement
       
   375         extends ReflectionElement, PackageElement {
       
   376 
       
   377         // Functionality specific to the specialization
       
   378         /**
       
   379          * {@inheritDoc}
       
   380          */
       
   381         @Override
       
   382         Package getSource();
       
   383     }
       
   384 
       
   385     /**
       
   386      * A specialization of {@code javax.lang.model.element.TypeElement} that is
       
   387      * backed by core reflection.
       
   388      */
       
   389     public static interface ReflectionTypeElement
       
   390         extends ReflectionElement, TypeElement, ReflectionParameterizable {
       
   391 
       
   392         /**
       
   393          * {@inheritDoc}
       
   394          */
       
   395         @Override
       
   396         List<ReflectionTypeParameterElement> getTypeParameters();
       
   397 
       
   398         /**
       
   399          * {@inheritDoc}
       
   400          */
       
   401         @Override
       
   402         List<ReflectionElement> getEnclosedElements();
       
   403 
       
   404         // Methods specific to the specialization, but functionality
       
   405         // also present in javax.lang.model.util.Elements.
       
   406         /**
       
   407          * Returns all members of a type element, whether inherited or
       
   408          * declared directly. For a class the result also includes its
       
   409          * constructors, but not local or anonymous classes.
       
   410          * @return all members of the type
       
   411          */
       
   412         List<ReflectionElement> getAllMembers();
       
   413 
       
   414         /**
       
   415          * Returns the binary name of a type element.
       
   416          * @return the binary name of a type element
       
   417          */
       
   418         Name getBinaryName();
       
   419 
       
   420         // Functionality specific to the specialization
       
   421         /**
       
   422          * {@inheritDoc}
       
   423          */
       
   424         @Override
       
   425         Class<?> getSource();
       
   426     }
       
   427 
       
   428     /**
       
   429      * A specialization of {@code javax.lang.model.element.TypeParameterElement} being
       
   430      * backed by core reflection.
       
   431      */
       
   432     public static interface ReflectionTypeParameterElement
       
   433         extends ReflectionElement, TypeParameterElement {
       
   434 
       
   435         /**
       
   436          * {@inheritDoc}
       
   437          */
       
   438         @Override
       
   439         ReflectionElement getGenericElement();
       
   440 
       
   441         // Functionality specific to the specialization
       
   442 
       
   443         // Conceptually should have an override for getSource
       
   444         // returning GenericDeclaration, but GenericDeclaration
       
   445         // doesn't currently implement AnnotatedElement.
       
   446 //         /**
       
   447 //          * {@inheritDoc}
       
   448 //          */
       
   449 //         @Override
       
   450 //         java.lang.reflect.GenericDeclaration getSource();
       
   451     }
       
   452 
       
   453     /**
       
   454      * A specialization of {@code javax.lang.model.element.VariableElement} that is
       
   455      * backed by core reflection.
       
   456      */
       
   457     public static interface ReflectionVariableElement
       
   458         extends ReflectionElement, VariableElement {
       
   459 
       
   460         // Functionality specific to the specialization
       
   461         /**
       
   462          * Returns true if this variable is a synthetic construct; returns false otherwise.
       
   463          * @return true if this variable is a synthetic construct; returns false otherwise
       
   464          */
       
   465         boolean isSynthetic();
       
   466 
       
   467         /**
       
   468          * Returns true if this variable is implicitly declared in source code; returns false otherwise.
       
   469          * @return true if this variable is implicitly declared in source code; returns false otherwise
       
   470          */
       
   471         boolean isImplicit();
       
   472 
       
   473         // The VariableElement concept covers fields, variables, and
       
   474         // method and constructor parameters. Therefore, this
       
   475         // interface cannot define a more precise override of
       
   476         // getSource since those three concept have different core
       
   477         // reflection types with no supertype more precise than
       
   478         // AnnotatedElement.
       
   479     }
       
   480 
       
   481     /**
       
   482      * A specialization of {@code javax.lang.model.element.Parameterizable} being
       
   483      * backed by core reflection.
       
   484      */
       
   485     public static interface ReflectionParameterizable
       
   486         extends ReflectionElement, Parameterizable {
       
   487         @Override
       
   488         List<ReflectionTypeParameterElement> getTypeParameters();
       
   489     }
       
   490 
       
   491     /**
       
   492      * Base class for concrete visitors of elements backed by core reflection.
       
   493      */
       
   494     public static abstract class AbstractReflectionElementVisitor8<R, P>
       
   495         extends AbstractElementVisitor8<R, P>
       
   496         implements ReflectionElementVisitor<R, P> {
       
   497         protected AbstractReflectionElementVisitor8() {
       
   498             super();
       
   499         }
       
   500     }
       
   501 
       
   502     /**
       
   503      * Base class for simple visitors of elements that are backed by core reflection.
       
   504      */
       
   505     @SupportedSourceVersion(value=RELEASE_8)
       
   506     public static abstract class SimpleReflectionElementVisitor8<R, P>
       
   507         extends SimpleElementVisitor8<R, P>
       
   508         implements ReflectionElementVisitor<R, P> {
       
   509 
       
   510         protected SimpleReflectionElementVisitor8(){
       
   511             super();
       
   512         }
       
   513 
       
   514         protected SimpleReflectionElementVisitor8(R defaultValue) {
       
   515             super(defaultValue);
       
   516         }
       
   517 
       
   518         // Create manual "bridge methods" for now.
       
   519 
       
   520         @Override
       
   521         public final R visitPackage(PackageElement e, P p) {
       
   522             return visitPackage((ReflectionPackageElement) e , p);
       
   523         }
       
   524 
       
   525         @Override
       
   526         public final R visitType(TypeElement e, P p) {
       
   527             return visitType((ReflectionTypeElement) e , p);
       
   528         }
       
   529 
       
   530         @Override
       
   531         public final R visitVariable(VariableElement e, P p) {
       
   532             return visitVariable((ReflectionVariableElement) e , p);
       
   533         }
       
   534 
       
   535         @Override
       
   536         public final R visitExecutable(ExecutableElement e, P p) {
       
   537             return visitExecutable((ReflectionExecutableElement) e , p);
       
   538         }
       
   539 
       
   540         @Override
       
   541         public final R visitTypeParameter(TypeParameterElement e, P p) {
       
   542             return visitTypeParameter((ReflectionTypeParameterElement) e , p);
       
   543         }
       
   544     }
       
   545 
       
   546     /**
       
   547      * {@inheritDoc}
       
   548      */
       
   549     public static interface ReflectionElements  extends Elements {
       
   550         /**
       
   551          * Returns the innermost enclosing {@link ReflectionTypeElement}
       
   552          * of the {@link ReflectionElement} or {@code null} if the
       
   553          * supplied ReflectionElement is toplevel or represents a
       
   554          * Package.
       
   555          *
       
   556          * @param e the {@link ReflectionElement} whose innermost
       
   557          * enclosing {@link ReflectionTypeElement} is sought
       
   558          * @return the innermost enclosing {@link
       
   559          * ReflectionTypeElement} or @{code null} if the parameter
       
   560          * {@code e} is a toplevel element or a package
       
   561          */
       
   562         ReflectionTypeElement getEnclosingTypeElement(ReflectionElement e);
       
   563 
       
   564         /**
       
   565          * {@inheritDoc}
       
   566          */
       
   567         @Override
       
   568         List<? extends ReflectionElement> getAllMembers(TypeElement type);
       
   569 
       
   570         /**
       
   571          * {@inheritDoc}
       
   572          */
       
   573         @Override
       
   574         ReflectionPackageElement getPackageElement(CharSequence name);
       
   575 
       
   576         /**
       
   577          * {@inheritDoc}
       
   578          */
       
   579         @Override
       
   580         ReflectionPackageElement getPackageOf(Element type);
       
   581 
       
   582         /**
       
   583          * {@inheritDoc}
       
   584          */
       
   585         @Override
       
   586         ReflectionTypeElement getTypeElement(CharSequence name);
       
   587     }
       
   588 
       
   589     // ------------------------- Implementation classes ------------------------
       
   590 
       
   591     // Exercise for the reader: review the CoreReflElement class
       
   592     // hierarchy below with an eye toward exposing it as an extensible
       
   593     // API that could be subclassed to provide customized behavior,
       
   594     // such as alternate annotation lookup semantics.
       
   595 
       
   596     private static abstract class CoreReflElement
       
   597         implements ReflectionElement, AnnotatedElement {
       
   598         public abstract AnnotatedElement getSource();
       
   599 
       
   600         protected CoreReflElement() {
       
   601             super();
       
   602         }
       
   603 
       
   604         // ReflectionElement methods
       
   605         @Override
       
   606         public ReflectionPackageElement getPackage() {
       
   607             throw new UnsupportedOperationException();
       
   608         }
       
   609 
       
   610         @Override
       
   611         public TypeMirror asType() {
       
   612             throw new UnsupportedOperationException(getClass().toString());
       
   613         }
       
   614 
       
   615         @Override
       
   616         public List<? extends AnnotationMirror> getAnnotationMirrors() {
       
   617             Annotation[] annotations = getSource().getDeclaredAnnotations();
       
   618             int len = annotations.length;
       
   619 
       
   620             if (len > 0) {
       
   621                 List<AnnotationMirror> res = new ArrayList<>(len);
       
   622                 for (Annotation a : annotations) {
       
   623                     res.add(createMirror(a));
       
   624                 }
       
   625                 return Collections.unmodifiableList(res);
       
   626             } else {
       
   627                 return Collections.emptyList();
       
   628             }
       
   629         }
       
   630 
       
   631         @Override
       
   632         public Set<Modifier> getModifiers() {
       
   633             return ModifierUtil.instance(0, false);
       
   634         }
       
   635 
       
   636         @Override
       
   637         public abstract Name getSimpleName();
       
   638 
       
   639         @Override
       
   640         public abstract ReflectionElement getEnclosingElement();
       
   641 
       
   642         @Override
       
   643         public abstract List<ReflectionElement> getEnclosedElements();
       
   644 
       
   645         //AnnotatedElement methods
       
   646         @Override
       
   647         public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
       
   648             return getSource().getAnnotation(annotationClass);
       
   649         }
       
   650 
       
   651         @Override
       
   652         public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
       
   653             return getSource().getAnnotationsByType(annotationClass);
       
   654         }
       
   655 
       
   656         @Override
       
   657         public Annotation[] getAnnotations() {
       
   658             return getSource().getAnnotations();
       
   659         }
       
   660 
       
   661         @Override
       
   662         public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) {
       
   663             return getSource().getDeclaredAnnotation(annotationClass);
       
   664         }
       
   665 
       
   666         @Override
       
   667         public <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) {
       
   668             return getSource().getDeclaredAnnotationsByType(annotationClass);
       
   669         }
       
   670 
       
   671         @Override
       
   672         public Annotation[] getDeclaredAnnotations() {
       
   673             return getSource().getDeclaredAnnotations();
       
   674         }
       
   675 
       
   676         // java.lang.Object methods
       
   677         @Override
       
   678         public boolean equals(Object obj) {
       
   679             if (obj instanceof CoreReflElement) {
       
   680                 CoreReflElement other = (CoreReflElement)obj;
       
   681                 return Objects.equals(other.getSource(), this.getSource());
       
   682             }
       
   683             return false;
       
   684         }
       
   685 
       
   686         @Override
       
   687         public int hashCode() {
       
   688             return Objects.hashCode(getSource());
       
   689         }
       
   690 
       
   691         @Override
       
   692         public String toString() {
       
   693             return getKind().toString() + " " + getSimpleName().toString();
       
   694         }
       
   695     }
       
   696 
       
   697     // Type
       
   698     private static class CoreReflTypeElement extends CoreReflElement
       
   699         implements ReflectionTypeElement {
       
   700         private final Class<?> source;
       
   701 
       
   702         protected CoreReflTypeElement(Class<?> source) {
       
   703             Objects.requireNonNull(source);
       
   704             if (source.isPrimitive() ||
       
   705                 source.isArray()) {
       
   706                 throw new IllegalArgumentException("Cannot create a ReflectionTypeElement based on class: " + source);
       
   707             }
       
   708 
       
   709             this.source = source;
       
   710         }
       
   711 
       
   712         @Override
       
   713         public TypeMirror asType() {
       
   714             return createTypeMirror(source);
       
   715         }
       
   716 
       
   717         @Override
       
   718         public Class<?> getSource() {
       
   719             return source;
       
   720         }
       
   721 
       
   722         @Override
       
   723         public boolean equals(Object o) {
       
   724             if (o instanceof CoreReflTypeElement) {
       
   725                 return source.equals(((CoreReflTypeElement)o).getSource());
       
   726             } else {
       
   727                 return false;
       
   728             }
       
   729         }
       
   730 
       
   731         @Override
       
   732         public <R,P> R accept(ElementVisitor<R,P> v, P p) {
       
   733             return v.visitType(this, p);
       
   734         }
       
   735 
       
   736         @Override
       
   737         public <R,P> R accept(ReflectionElementVisitor<R,P> v, P p) {
       
   738             return v.visitType(this, p);
       
   739         }
       
   740 
       
   741         @Override
       
   742         public Set<Modifier> getModifiers() {
       
   743             return ModifierUtil.instance(source.getModifiers() &
       
   744                                          (source.isInterface() ?
       
   745                                           java.lang.reflect.Modifier.interfaceModifiers() :
       
   746                                           java.lang.reflect.Modifier.classModifiers()),
       
   747                                          false);
       
   748         }
       
   749 
       
   750         @Override
       
   751         public List<ReflectionElement> getEnclosedElements() {
       
   752             List<ReflectionElement> enclosedElements = new ArrayList<>();
       
   753 
       
   754             for (Class<?> declaredClass : source.getDeclaredClasses()) {
       
   755                 enclosedElements.add(createMirror(declaredClass));
       
   756             }
       
   757 
       
   758             // Add elements in the conventional ordering: fields, then
       
   759             // constructors, then methods.
       
   760             for (Field f : source.getDeclaredFields()) {
       
   761                 enclosedElements.add(createMirror(f));
       
   762             }
       
   763 
       
   764             for (Constructor<?> c : source.getDeclaredConstructors()) {
       
   765                 enclosedElements.add(createMirror(c));
       
   766             }
       
   767 
       
   768             for (Method m : source.getDeclaredMethods()) {
       
   769                 enclosedElements.add(createMirror(m));
       
   770             }
       
   771 
       
   772             return (enclosedElements.isEmpty() ?
       
   773                     Collections.emptyList():
       
   774                     Collections.unmodifiableList(enclosedElements));
       
   775         }
       
   776 
       
   777         // Review for default method handling.
       
   778         @Override
       
   779         public List<ReflectionElement> getAllMembers() {
       
   780             List<ReflectionElement> allMembers = new ArrayList<>();
       
   781 
       
   782             // If I only had a MultiMap ...
       
   783             List<ReflectionElement> fields = new ArrayList<>();
       
   784             List<ReflectionExecutableElement> methods = new ArrayList<>();
       
   785             List<ReflectionElement> classes = new ArrayList<>();
       
   786 
       
   787             // Add all fields for this class
       
   788             for (Field f : source.getDeclaredFields()) {
       
   789                 fields.add(createMirror(f));
       
   790             }
       
   791 
       
   792             // Add all methods for this class
       
   793             for (Method m : source.getDeclaredMethods()) {
       
   794                 methods.add(createMirror(m));
       
   795             }
       
   796 
       
   797             // Add all classes for this class, except anonymous/local as per Elements.getAllMembers doc
       
   798             for (Class<?> c : source.getDeclaredClasses()) {
       
   799                 if (c.isLocalClass() || c.isAnonymousClass())
       
   800                     continue;
       
   801                 classes.add(createMirror(c));
       
   802             }
       
   803 
       
   804             Class<?> cls = source;
       
   805             if (cls.isInterface()) {
       
   806                 cls = null;
       
   807             }
       
   808             do {
       
   809                 // Walk up superclasses adding non-private elements.
       
   810                 // If source is an interface, just add Object's
       
   811                 // elements.
       
   812 
       
   813                 if (cls == null) {
       
   814                     cls = java.lang.Object.class;
       
   815                 } else {
       
   816                     cls = cls.getSuperclass();
       
   817                 }
       
   818 
       
   819                 addMembers(cls, fields, methods, classes);
       
   820 
       
   821             } while (cls != java.lang.Object.class);
       
   822 
       
   823             // add members on (super)interface(s)
       
   824             Set<Class<?>> seenInterfaces = new HashSet<>();
       
   825             Queue<Class<?>> interfaces = new LinkedList<>();
       
   826             if (source.isInterface()) {
       
   827                 seenInterfaces.add(source);
       
   828                 interfaces.add(source);
       
   829             } else {
       
   830                 Class<?>[] ifaces = source.getInterfaces();
       
   831                 for (Class<?> iface : ifaces) {
       
   832                     seenInterfaces.add(iface);
       
   833                     interfaces.add(iface);
       
   834                 }
       
   835             }
       
   836 
       
   837             while (interfaces.peek() != null) {
       
   838                 Class<?> head = interfaces.remove();
       
   839                 addMembers(head, fields, methods, classes);
       
   840 
       
   841                 Class<?>[] ifaces = head.getInterfaces();
       
   842                 for (Class<?> iface : ifaces) {
       
   843                     if (!seenInterfaces.contains(iface)) {
       
   844                         seenInterfaces.add(iface);
       
   845                         interfaces.add(iface);
       
   846                     }
       
   847                 }
       
   848             }
       
   849 
       
   850             // Add constructors
       
   851             for (Constructor<?> c : source.getDeclaredConstructors()) {
       
   852                 allMembers.add(createMirror(c));
       
   853             }
       
   854 
       
   855             // Add all unique methods
       
   856             allMembers.addAll(methods);
       
   857 
       
   858             // Add all unique fields
       
   859             allMembers.addAll(fields);
       
   860 
       
   861             // Add all unique classes
       
   862             allMembers.addAll(classes);
       
   863 
       
   864             return Collections.unmodifiableList(allMembers);
       
   865         }
       
   866 
       
   867         private void addMembers(Class<?> cls,
       
   868                                 List<ReflectionElement> fields,
       
   869                                 List<ReflectionExecutableElement> methods,
       
   870                                 List<ReflectionElement> classes) {
       
   871             Elements elements = getElements();
       
   872 
       
   873             for (Field f : cls.getDeclaredFields()) {
       
   874                 if (java.lang.reflect.Modifier.isPrivate(f.getModifiers())) { continue; }
       
   875                 ReflectionElement tmp = createMirror(f);
       
   876                 boolean add = true;
       
   877                 for (ReflectionElement e : fields) {
       
   878                     if (elements.hides(e, tmp)) {
       
   879                         add = false;
       
   880                         break;
       
   881                     }
       
   882                 }
       
   883                 if (add) {
       
   884                     fields.add(tmp);
       
   885                 }
       
   886             }
       
   887 
       
   888             for (Method m : cls.getDeclaredMethods()) {
       
   889                 if (java.lang.reflect.Modifier.isPrivate(m.getModifiers()))
       
   890                     continue;
       
   891 
       
   892                 ReflectionExecutableElement tmp = createMirror(m);
       
   893                 boolean add = true;
       
   894                 for (ReflectionExecutableElement e : methods) {
       
   895                     if (elements.hides(e, tmp)) {
       
   896                         add = false;
       
   897                         break;
       
   898                     } else if (elements.overrides(e, tmp, this)) {
       
   899                         add = false;
       
   900                         break;
       
   901                     }
       
   902                 }
       
   903                 if (add) {
       
   904                     methods.add(tmp);
       
   905                 }
       
   906             }
       
   907 
       
   908             for (Class<?> c : cls.getDeclaredClasses()) {
       
   909                 if (java.lang.reflect.Modifier.isPrivate(c.getModifiers()) ||
       
   910                     c.isLocalClass() ||
       
   911                     c.isAnonymousClass())
       
   912                     continue;
       
   913 
       
   914                 ReflectionElement tmp = createMirror(c);
       
   915                 boolean add = true;
       
   916                 for (ReflectionElement e : classes) {
       
   917                     if (elements.hides(e, tmp)) {
       
   918                         add = false;
       
   919                         break;
       
   920                     }
       
   921                 }
       
   922                 if (add) {
       
   923                     classes.add(tmp);
       
   924                 }
       
   925             }
       
   926         }
       
   927 
       
   928         @Override
       
   929         public ElementKind getKind() {
       
   930             if (source.isInterface()) {
       
   931                 if (source.isAnnotation())
       
   932                     return ElementKind.ANNOTATION_TYPE;
       
   933                 else
       
   934                     return ElementKind.INTERFACE;
       
   935             } else if (source.isEnum()) {
       
   936                 return ElementKind.ENUM;
       
   937             } else
       
   938                 return ElementKind.CLASS;
       
   939         }
       
   940 
       
   941         @Override
       
   942         public NestingKind getNestingKind() {
       
   943             if (source.isAnonymousClass())
       
   944                 return NestingKind.ANONYMOUS;
       
   945             else if (source.isLocalClass())
       
   946                 return NestingKind.LOCAL;
       
   947             else if (source.isMemberClass())
       
   948                 return NestingKind.MEMBER;
       
   949             else return
       
   950                 NestingKind.TOP_LEVEL;
       
   951         }
       
   952 
       
   953         @Override
       
   954         public Name getQualifiedName() {
       
   955             String name = source.getCanonicalName(); // TODO, this should be a FQN for
       
   956                                                      // the current element
       
   957             if (name == null)
       
   958                 name = "";
       
   959             return StringName.instance(name);
       
   960         }
       
   961 
       
   962         @Override
       
   963         public Name getSimpleName() {
       
   964             return StringName.instance(source.getSimpleName());
       
   965         }
       
   966 
       
   967         @Override
       
   968         public TypeMirror getSuperclass() {
       
   969             if (source.equals(java.lang.Object.class)) {
       
   970                 return NoType.getNoneInstance();
       
   971             } else {
       
   972                 return createTypeMirror(source.getSuperclass());
       
   973             }
       
   974         }
       
   975 
       
   976         @Override
       
   977         public List<? extends TypeMirror> getInterfaces() {
       
   978             Class[] interfaces = source.getInterfaces();
       
   979             int len = interfaces.length;
       
   980             List<TypeMirror> res = new ArrayList<>(len);
       
   981 
       
   982             if (len > 0) {
       
   983                 for (Class<?> c : interfaces) {
       
   984                     res.add(createTypeMirror(c));
       
   985                 }
       
   986             } else {
       
   987                 return Collections.emptyList();
       
   988             }
       
   989             return Collections.unmodifiableList(res);
       
   990         }
       
   991 
       
   992         @Override
       
   993         public List<ReflectionTypeParameterElement> getTypeParameters() {
       
   994             return createTypeParameterList(source);
       
   995         }
       
   996 
       
   997         @Override
       
   998         public ReflectionElement getEnclosingElement() {
       
   999             // Returns the package of a top-level type and returns the
       
  1000             // immediately lexically enclosing element for a nested type.
       
  1001 
       
  1002             switch(getNestingKind()) {
       
  1003             case TOP_LEVEL:
       
  1004                 return createMirror(source.getPackage());
       
  1005             case MEMBER:
       
  1006                 return createMirror(source.getEnclosingClass());
       
  1007             default:
       
  1008                 if (source.getEnclosingConstructor() != null) {
       
  1009                     return createMirror(source.getEnclosingConstructor());
       
  1010                 } else if (source.getEnclosingMethod() != null) {
       
  1011                     return createMirror(source.getEnclosingMethod());
       
  1012                 } else {
       
  1013                     return createMirror(source.getEnclosingClass());
       
  1014                 }
       
  1015             }
       
  1016         }
       
  1017 
       
  1018         @Override
       
  1019         public Name getBinaryName() {
       
  1020             return StringName.instance(getSource().getName());
       
  1021         }
       
  1022     }
       
  1023 
       
  1024     private static abstract class CoreReflExecutableElement extends CoreReflElement
       
  1025         implements ReflectionExecutableElement {
       
  1026 
       
  1027         protected Executable source = null;
       
  1028         protected final List<CoreReflParameterVariableElement> parameters;
       
  1029 
       
  1030         protected CoreReflExecutableElement(Executable source,
       
  1031                                             List<CoreReflParameterVariableElement> parameters) {
       
  1032             this.source = Objects.requireNonNull(source);
       
  1033             this.parameters = Objects.requireNonNull(parameters);
       
  1034         }
       
  1035 
       
  1036         @Override
       
  1037         public <R,P> R accept(ElementVisitor<R,P> v, P p) {
       
  1038             return v.visitExecutable(this, p);
       
  1039         }
       
  1040 
       
  1041         @Override
       
  1042         public <R,P> R accept(ReflectionElementVisitor<R,P> v, P p) {
       
  1043             return v.visitExecutable(this, p);
       
  1044         }
       
  1045 
       
  1046         @Override
       
  1047         public abstract ExecutableType asType();
       
  1048 
       
  1049         // Only Types and Packages enclose elements; see Element.getEnclosedElements()
       
  1050         @Override
       
  1051         public List<ReflectionElement> getEnclosedElements() {
       
  1052             return Collections.emptyList();
       
  1053         }
       
  1054 
       
  1055         @Override
       
  1056         public List<ReflectionVariableElement> getParameters() {
       
  1057             List<ReflectionVariableElement> tmp = new ArrayList<>();
       
  1058             for (ReflectionVariableElement parameter : parameters) {
       
  1059                 if (!parameter.isSynthetic())
       
  1060                     tmp.add(parameter);
       
  1061             }
       
  1062             return tmp;
       
  1063         }
       
  1064 
       
  1065         @Override
       
  1066         public List<ReflectionVariableElement> getAllParameters() {
       
  1067             // Could "fix" this if the return type included wildcards
       
  1068             @SuppressWarnings("unchecked")
       
  1069             List<ReflectionVariableElement> tmp = (List<ReflectionVariableElement>)(List)parameters;
       
  1070             return tmp;
       
  1071         }
       
  1072 
       
  1073         @Override
       
  1074         public List<? extends TypeMirror> getThrownTypes() {
       
  1075             Class<?>[] thrown = source.getExceptionTypes();
       
  1076             int len = thrown.length;
       
  1077             List<TypeMirror> res = new ArrayList<>(len);
       
  1078 
       
  1079             if (len > 0) {
       
  1080                 for (Class<?> c : thrown) {
       
  1081                     res.add(createTypeMirror(c));
       
  1082                 }
       
  1083             } else {
       
  1084                 return Collections.emptyList();
       
  1085             }
       
  1086             return Collections.unmodifiableList(res);
       
  1087         }
       
  1088 
       
  1089         @Override
       
  1090         public boolean isVarArgs() {
       
  1091             return source.isVarArgs();
       
  1092         }
       
  1093 
       
  1094         @Override
       
  1095         public boolean isSynthetic() {
       
  1096             return source.isSynthetic();
       
  1097         }
       
  1098 
       
  1099         @Override
       
  1100         public boolean isBridge() {
       
  1101             return false;
       
  1102         }
       
  1103 
       
  1104         @Override
       
  1105         public List<ReflectionTypeParameterElement> getTypeParameters() {
       
  1106             return createTypeParameterList(source);
       
  1107         }
       
  1108 
       
  1109         public abstract AnnotationValue getDefaultValue();
       
  1110 
       
  1111         @Override
       
  1112         public TypeMirror getReceiverType() {
       
  1113             // New in JDK 8
       
  1114             throw new UnsupportedOperationException(this.toString());
       
  1115         }
       
  1116     }
       
  1117 
       
  1118     private static class CoreReflConstructorExecutableElement
       
  1119         extends CoreReflExecutableElement {
       
  1120 
       
  1121         protected CoreReflConstructorExecutableElement(Constructor<?> source) {
       
  1122             super(Objects.requireNonNull(source),
       
  1123                   createParameterList(source));
       
  1124         }
       
  1125 
       
  1126         @Override
       
  1127         public  Constructor<?> getSource() {
       
  1128             return (Constructor<?>)source;
       
  1129         }
       
  1130 
       
  1131         @Override
       
  1132         public TypeMirror getReturnType() {
       
  1133             return NoType.getVoidInstance();
       
  1134         }
       
  1135 
       
  1136         @Override
       
  1137         public ExecutableType asType() {
       
  1138             throw new UnsupportedOperationException(getClass().toString());
       
  1139         }
       
  1140 
       
  1141         @Override
       
  1142         public boolean equals(Object o) {
       
  1143             if (o instanceof CoreReflConstructorExecutableElement) {
       
  1144                 return source.equals(((CoreReflConstructorExecutableElement)o).getSource());
       
  1145             } else {
       
  1146                 return false;
       
  1147             }
       
  1148         }
       
  1149 
       
  1150         @Override
       
  1151         public ElementKind getKind() {
       
  1152             return ElementKind.CONSTRUCTOR;
       
  1153         }
       
  1154 
       
  1155         @Override
       
  1156         public Set<Modifier> getModifiers() {
       
  1157             return ModifierUtil.instance(source.getModifiers() &
       
  1158                                          java.lang.reflect.Modifier.constructorModifiers(), false);
       
  1159         }
       
  1160 
       
  1161         @Override
       
  1162         public ReflectionElement getEnclosingElement() {
       
  1163             return createMirror(source.getDeclaringClass());
       
  1164         }
       
  1165 
       
  1166         @Override
       
  1167         public Name getSimpleName() {
       
  1168             return StringName.instance("<init>");
       
  1169         }
       
  1170 
       
  1171         @Override
       
  1172         public AnnotationValue getDefaultValue() {
       
  1173             // a constructor is never an annotation element
       
  1174             return null;
       
  1175         }
       
  1176 
       
  1177         @Override
       
  1178         public boolean isDefault() {
       
  1179             return false; // A constructor cannot be a default method
       
  1180         }
       
  1181     }
       
  1182 
       
  1183     private static class CoreReflMethodExecutableElement
       
  1184         extends CoreReflExecutableElement {
       
  1185 
       
  1186         protected CoreReflMethodExecutableElement(Method source) {
       
  1187             super(Objects.requireNonNull(source),
       
  1188                   createParameterList(source));
       
  1189             this.source = source;
       
  1190         }
       
  1191 
       
  1192         @Override
       
  1193         public Method getSource() {
       
  1194             return (Method)source;
       
  1195         }
       
  1196 
       
  1197         @Override
       
  1198         public TypeMirror getReturnType() {
       
  1199             return TypeFactory.instance(getSource().getReturnType());
       
  1200         }
       
  1201 
       
  1202         @Override
       
  1203         public boolean equals(Object o) {
       
  1204             if (o instanceof CoreReflMethodExecutableElement) {
       
  1205                 return source.equals( ((CoreReflMethodExecutableElement)o).getSource());
       
  1206             } else {
       
  1207                 return false;
       
  1208             }
       
  1209         }
       
  1210 
       
  1211         @Override
       
  1212         public ElementKind getKind() {
       
  1213             return ElementKind.METHOD;
       
  1214         }
       
  1215 
       
  1216         @Override
       
  1217         public Set<Modifier> getModifiers() {
       
  1218             return ModifierUtil.instance(source.getModifiers() &
       
  1219                                          java.lang.reflect.Modifier.methodModifiers(),
       
  1220                                          isDefault());
       
  1221         }
       
  1222 
       
  1223         @Override
       
  1224         public ReflectionElement getEnclosingElement() {
       
  1225             return createMirror(source.getDeclaringClass());
       
  1226         }
       
  1227 
       
  1228         @Override
       
  1229         public Name getSimpleName() {
       
  1230             return StringName.instance(source.getName());
       
  1231         }
       
  1232 
       
  1233         @Override
       
  1234         public AnnotationValue getDefaultValue() {
       
  1235             Object value = getSource().getDefaultValue();
       
  1236             if (null == value) {
       
  1237                 return null;
       
  1238             } else {
       
  1239                 return new CoreReflAnnotationValue(value);
       
  1240             }
       
  1241         }
       
  1242 
       
  1243         @Override
       
  1244         public boolean isDefault() {
       
  1245             return getSource().isDefault();
       
  1246         }
       
  1247 
       
  1248         @Override
       
  1249         public boolean isBridge() {
       
  1250             return getSource().isBridge();
       
  1251         }
       
  1252 
       
  1253         @Override
       
  1254         public ExecutableType asType() {
       
  1255             return TypeFactory.instance(getSource());
       
  1256         }
       
  1257     }
       
  1258 
       
  1259     private static List<CoreReflParameterVariableElement> createParameterList(Executable source) {
       
  1260         Parameter[] parameters = source.getParameters();
       
  1261         int length = parameters.length;
       
  1262         if (length == 0)
       
  1263             return Collections.emptyList();
       
  1264         else {
       
  1265             List<CoreReflParameterVariableElement> tmp = new ArrayList<>(length);
       
  1266             for (Parameter parameter : parameters) {
       
  1267                 tmp.add(new CoreReflParameterVariableElement(parameter));
       
  1268             }
       
  1269             return Collections.unmodifiableList(tmp);
       
  1270         }
       
  1271     }
       
  1272 
       
  1273     private static List<ReflectionTypeParameterElement> createTypeParameterList(GenericDeclaration source) {
       
  1274         java.lang.reflect.TypeVariable<?>[] typeParams = source.getTypeParameters();
       
  1275         int length = typeParams.length;
       
  1276         if (length == 0)
       
  1277             return Collections.emptyList();
       
  1278         else {
       
  1279             List<ReflectionTypeParameterElement> tmp = new ArrayList<>(length);
       
  1280             for (java.lang.reflect.TypeVariable<?> typeVar : typeParams)
       
  1281                 tmp.add(new CoreReflTypeParameterElement(typeVar));
       
  1282             return Collections.unmodifiableList(tmp);
       
  1283         }
       
  1284     }
       
  1285 
       
  1286     private static class CoreReflTypeParameterElement
       
  1287         extends CoreReflElement
       
  1288         implements ReflectionTypeParameterElement {
       
  1289 
       
  1290         private final GenericDeclaration source;
       
  1291         private final java.lang.reflect.TypeVariable<?> sourceTypeVar;
       
  1292 
       
  1293         protected CoreReflTypeParameterElement(java.lang.reflect.TypeVariable<?> sourceTypeVar) {
       
  1294             this.sourceTypeVar = Objects.requireNonNull(sourceTypeVar);
       
  1295             this.source = Objects.requireNonNull(sourceTypeVar.getGenericDeclaration());
       
  1296         }
       
  1297 
       
  1298         @Override
       
  1299         public AnnotatedElement getSource() {
       
  1300             return (AnnotatedElement)source;
       
  1301         }
       
  1302 
       
  1303         protected java.lang.reflect.TypeVariable<?> getSourceTypeVar() {
       
  1304             return sourceTypeVar;
       
  1305         }
       
  1306 
       
  1307         @Override
       
  1308         public boolean equals(Object o) {
       
  1309             if (o instanceof CoreReflTypeParameterElement) {
       
  1310                 return sourceTypeVar.equals(((CoreReflTypeParameterElement)o).sourceTypeVar);
       
  1311             } else {
       
  1312                 return false;
       
  1313             }
       
  1314         }
       
  1315 
       
  1316         @Override
       
  1317         public <R,P> R accept(ElementVisitor<R,P> v, P p) {
       
  1318             return v.visitTypeParameter(this, p);
       
  1319         }
       
  1320 
       
  1321         @Override
       
  1322         public <R,P> R accept(ReflectionElementVisitor<R,P> v, P p) {
       
  1323             return v.visitTypeParameter(this, p);
       
  1324         }
       
  1325 
       
  1326         @Override
       
  1327         public List<ReflectionElement> getEnclosedElements() {
       
  1328             return Collections.emptyList();
       
  1329         }
       
  1330 
       
  1331         @Override
       
  1332         public ReflectionElement getEnclosingElement() {
       
  1333             if (source instanceof Class)
       
  1334                 return createMirror((Class<?>)source);
       
  1335             else if (source instanceof Method)
       
  1336                 return createMirror((Method)source);
       
  1337             else if (source instanceof Constructor)
       
  1338                 return createMirror((Constructor<?>)source);
       
  1339             else
       
  1340                 throw new AssertionError("Unexpected enclosing element: " + source);
       
  1341         }
       
  1342 
       
  1343         @Override
       
  1344         public ElementKind getKind() {
       
  1345             return ElementKind.TYPE_PARAMETER;
       
  1346         }
       
  1347 
       
  1348         @Override
       
  1349         public Name getSimpleName() {
       
  1350             return StringName.instance(sourceTypeVar.getName());
       
  1351         }
       
  1352 
       
  1353         // TypeParameterElement methods
       
  1354         @Override
       
  1355         public ReflectionElement getGenericElement() {
       
  1356             return getEnclosingElement(); // As per the doc,
       
  1357                                           // getEnclosingElement and
       
  1358                                           // getGenericElement return
       
  1359                                           // the same information.
       
  1360         }
       
  1361 
       
  1362         @Override
       
  1363         public List<? extends TypeMirror> getBounds() {
       
  1364             Type[] types = getSourceTypeVar().getBounds();
       
  1365             int len = types.length;
       
  1366 
       
  1367             if (len > 0) {
       
  1368                 List<TypeMirror> res = new ArrayList<>(len);
       
  1369                 for (Type t : types) {
       
  1370                     res.add(TypeFactory.instance(t));
       
  1371                 }
       
  1372                 return Collections.unmodifiableList(res);
       
  1373             } else {
       
  1374                 return Collections.emptyList();
       
  1375             }
       
  1376         }
       
  1377     }
       
  1378 
       
  1379     private abstract static class CoreReflVariableElement extends CoreReflElement
       
  1380         implements ReflectionVariableElement {
       
  1381 
       
  1382         protected CoreReflVariableElement() {}
       
  1383 
       
  1384         // Element visitor
       
  1385         @Override
       
  1386         public <R,P> R accept(ElementVisitor<R,P>v, P p) {
       
  1387             return v.visitVariable(this, p);
       
  1388         }
       
  1389 
       
  1390         // ReflectElement visitor
       
  1391         @Override
       
  1392         public <R,P> R accept(ReflectionElementVisitor<R,P> v, P p) {
       
  1393             return v.visitVariable(this, p);
       
  1394         }
       
  1395 
       
  1396         @Override
       
  1397         public List<ReflectionElement> getEnclosedElements() {
       
  1398             return Collections.emptyList();
       
  1399         }
       
  1400 
       
  1401         @Override
       
  1402         public ReflectionElement getEnclosingElement() {
       
  1403             return null;
       
  1404         }
       
  1405 
       
  1406         @Override
       
  1407         public boolean isSynthetic() {
       
  1408             return false;
       
  1409         }
       
  1410 
       
  1411         @Override
       
  1412         public boolean isImplicit() {
       
  1413             return false;
       
  1414         }
       
  1415     }
       
  1416 
       
  1417     private static class CoreReflFieldVariableElement extends CoreReflVariableElement {
       
  1418         private final Field source;
       
  1419 
       
  1420         protected CoreReflFieldVariableElement(Field source) {
       
  1421             this.source = Objects.requireNonNull(source);
       
  1422         }
       
  1423 
       
  1424         @Override
       
  1425         public Field getSource() {
       
  1426             return source;
       
  1427         }
       
  1428 
       
  1429         @Override
       
  1430         public TypeMirror asType() {
       
  1431             return createTypeMirror(getSource().getType());
       
  1432         }
       
  1433 
       
  1434         @Override
       
  1435         public ElementKind getKind() {
       
  1436             if (source.isEnumConstant())
       
  1437                 return ElementKind.ENUM_CONSTANT;
       
  1438             else
       
  1439                 return ElementKind.FIELD;
       
  1440         }
       
  1441 
       
  1442         @Override
       
  1443         public Set<Modifier> getModifiers() {
       
  1444             return ModifierUtil.instance(source.getModifiers() &
       
  1445                                          java.lang.reflect.Modifier.fieldModifiers(), false);
       
  1446         }
       
  1447 
       
  1448         @Override
       
  1449         public Name getSimpleName() {
       
  1450             return StringName.instance(source.getName());
       
  1451         }
       
  1452 
       
  1453         @Override
       
  1454         public ReflectionElement getEnclosingElement() {
       
  1455             return createMirror(source.getDeclaringClass());
       
  1456         }
       
  1457 
       
  1458         @Override
       
  1459         public boolean equals(Object o) {
       
  1460             if (o instanceof CoreReflFieldVariableElement) {
       
  1461                 return Objects.equals(source,
       
  1462                                       ((CoreReflFieldVariableElement)o).getSource());
       
  1463             } else {
       
  1464                 return false;
       
  1465             }
       
  1466         }
       
  1467 
       
  1468         @Override
       
  1469         public Object getConstantValue() {
       
  1470             Field target = source;
       
  1471 
       
  1472             // The api says only Strings and primitives may be compile time constants.
       
  1473             // Ensure field is that, and final.
       
  1474             //
       
  1475             // Also, we don't have an instance so restrict to static Fields
       
  1476             //
       
  1477             if (!(source.getType().equals(java.lang.String.class)
       
  1478                   || source.getType().isPrimitive())) {
       
  1479                 return null;
       
  1480             }
       
  1481             final int modifiers = target.getModifiers();
       
  1482             if (!( java.lang.reflect.Modifier.isFinal(modifiers) &&
       
  1483                    java.lang.reflect.Modifier.isStatic(modifiers))) {
       
  1484                 return null;
       
  1485             }
       
  1486 
       
  1487             try {
       
  1488                 return target.get(null);
       
  1489             } catch (IllegalAccessException e) {
       
  1490                 try {
       
  1491                     target.setAccessible(true);
       
  1492                     return target.get(null);
       
  1493                 } catch (IllegalAccessException i) {
       
  1494                     throw new SecurityException(i);
       
  1495                 }
       
  1496             }
       
  1497         }
       
  1498     }
       
  1499 
       
  1500     private static class CoreReflParameterVariableElement
       
  1501         extends CoreReflVariableElement {
       
  1502         private final Parameter source;
       
  1503 
       
  1504         protected CoreReflParameterVariableElement(Parameter source) {
       
  1505             this.source = Objects.requireNonNull(source);
       
  1506         }
       
  1507 
       
  1508         @Override
       
  1509         public Parameter getSource() {
       
  1510             return source;
       
  1511         }
       
  1512 
       
  1513         @Override
       
  1514         public Set<Modifier> getModifiers() {
       
  1515             return ModifierUtil.instance(source.getModifiers() &
       
  1516                                          java.lang.reflect.Modifier.parameterModifiers(), false);
       
  1517         }
       
  1518 
       
  1519         @Override
       
  1520         public TypeMirror asType() {
       
  1521             // TODO : switch to parameterized type
       
  1522             return createTypeMirror(source.getType());
       
  1523         }
       
  1524 
       
  1525         @Override
       
  1526         public ElementKind getKind() {
       
  1527             return ElementKind.PARAMETER;
       
  1528         }
       
  1529 
       
  1530         @Override
       
  1531         public Name getSimpleName() {
       
  1532             return StringName.instance(source.getName());
       
  1533         }
       
  1534 
       
  1535         @Override
       
  1536         public ReflectionElement getEnclosingElement() {
       
  1537             Executable enclosing = source.getDeclaringExecutable();
       
  1538             if (enclosing instanceof Method)
       
  1539                 return createMirror((Method)enclosing);
       
  1540             else if (enclosing instanceof Constructor)
       
  1541                 return createMirror((Constructor<?>)enclosing);
       
  1542             else
       
  1543                 throw new AssertionError("Bad enclosing value.");
       
  1544         }
       
  1545 
       
  1546         @Override
       
  1547         public boolean equals(Object o) {
       
  1548             if (o instanceof CoreReflParameterVariableElement) {
       
  1549                 return source.equals(((CoreReflParameterVariableElement) o).getSource());
       
  1550             } else
       
  1551                 return false;
       
  1552         }
       
  1553 
       
  1554         // VariableElement methods
       
  1555         @Override
       
  1556         public Object getConstantValue() {
       
  1557             return null;
       
  1558         }
       
  1559 
       
  1560         @Override
       
  1561         public boolean isSynthetic() {
       
  1562             return source.isSynthetic();
       
  1563         }
       
  1564 
       
  1565         @Override
       
  1566         public boolean isImplicit() {
       
  1567             return source.isImplicit();
       
  1568         }
       
  1569     }
       
  1570 
       
  1571     private static class CoreReflPackageElement extends CoreReflElement
       
  1572         implements ReflectionPackageElement {
       
  1573 
       
  1574         private final Package source;
       
  1575 
       
  1576         protected CoreReflPackageElement(Package source) {
       
  1577             this.source = source;
       
  1578         }
       
  1579 
       
  1580         @Override
       
  1581         public Package getSource() {
       
  1582             return source;
       
  1583         }
       
  1584 
       
  1585         @Override
       
  1586         public <R,P> R accept(ElementVisitor<R,P> v, P p) {
       
  1587             return v.visitPackage(this, p);
       
  1588         }
       
  1589 
       
  1590         @Override
       
  1591         public <R,P> R accept(ReflectionElementVisitor<R,P> v, P p) {
       
  1592             return v.visitPackage(this, p);
       
  1593         }
       
  1594 
       
  1595         @Override
       
  1596         public boolean equals(Object o) {
       
  1597             if (o instanceof CoreReflPackageElement) {
       
  1598                 return Objects.equals(source,
       
  1599                                       ((CoreReflPackageElement)o).getSource());
       
  1600             } else {
       
  1601                 return false;
       
  1602             }
       
  1603         }
       
  1604 
       
  1605         @Override
       
  1606         public ElementKind getKind() {
       
  1607             return ElementKind.PACKAGE;
       
  1608         }
       
  1609 
       
  1610         @Override
       
  1611         public ReflectionElement getEnclosingElement() {
       
  1612             return null;
       
  1613         }
       
  1614 
       
  1615         @Override
       
  1616         public List<ReflectionElement> getEnclosedElements() {
       
  1617             throw new UnsupportedOperationException();
       
  1618         }
       
  1619 
       
  1620         @Override
       
  1621         public Name getQualifiedName() {
       
  1622             return StringName.instance((source != null) ?
       
  1623                                        source.getName() :
       
  1624                                        "" );
       
  1625         }
       
  1626 
       
  1627         @Override
       
  1628         public Name getSimpleName() {
       
  1629             String n = ((source != null) ?
       
  1630                         source.getName() :
       
  1631                         "");
       
  1632             int index = n.lastIndexOf('.');
       
  1633             if (index > 0) {
       
  1634                 return StringName.instance(n.substring(index + 1, n.length()));
       
  1635             } else {
       
  1636                 return StringName.instance(n);
       
  1637             }
       
  1638         }
       
  1639 
       
  1640         @Override
       
  1641         public boolean isUnnamed() {
       
  1642             if (source != null) {
       
  1643                 String name = source.getName();
       
  1644                 return(name == null || name.isEmpty());
       
  1645             } else
       
  1646                 return true;
       
  1647         }
       
  1648     }
       
  1649 
       
  1650     private static class CoreReflAnnotationMirror
       
  1651         implements javax.lang.model.element.AnnotationMirror {
       
  1652         private final Annotation annotation;
       
  1653 
       
  1654         protected CoreReflAnnotationMirror(Annotation annotation) {
       
  1655             this.annotation = Objects.requireNonNull(annotation);
       
  1656         }
       
  1657 
       
  1658         @Override
       
  1659         public DeclaredType getAnnotationType() {
       
  1660             return (DeclaredType)TypeFactory.instance(annotation.annotationType());
       
  1661         }
       
  1662 
       
  1663         @Override
       
  1664         public Map<? extends ReflectionExecutableElement, ? extends AnnotationValue> getElementValues() {
       
  1665             // This differs from the javac implementation in that it returns default values
       
  1666 
       
  1667             Method[] elems = annotation.annotationType().getDeclaredMethods();
       
  1668             int len = elems.length;
       
  1669 
       
  1670             if (len > 0) {
       
  1671                 Map<ReflectionExecutableElement, AnnotationValue> res = new HashMap<>();
       
  1672                 for (Method m : elems) {
       
  1673                     AnnotationValue v;
       
  1674                     try {
       
  1675                         v = new CoreReflAnnotationValue(m.invoke(annotation));
       
  1676                     } catch (IllegalAccessException e) {
       
  1677                         try {
       
  1678                             m.setAccessible(true);
       
  1679                             v = new CoreReflAnnotationValue(m.invoke(annotation));
       
  1680                         } catch (IllegalAccessException i) {
       
  1681                             throw new SecurityException(i);
       
  1682                         } catch (InvocationTargetException ee) {
       
  1683                             throw new RuntimeException(ee);
       
  1684                         }
       
  1685                     } catch (InvocationTargetException ee) {
       
  1686                         throw new RuntimeException(ee);
       
  1687                     }
       
  1688                     ReflectionExecutableElement e = createMirror(m);
       
  1689                     res.put(e, v);
       
  1690                 }
       
  1691 
       
  1692                 return Collections.unmodifiableMap(res);
       
  1693             } else {
       
  1694                 return Collections.emptyMap();
       
  1695             }
       
  1696         }
       
  1697 
       
  1698         @Override
       
  1699         public boolean equals(Object other) {
       
  1700             if (other instanceof CoreReflAnnotationMirror) {
       
  1701                 return annotation.equals(((CoreReflAnnotationMirror)other).annotation);
       
  1702             } else {
       
  1703                 return false;
       
  1704             }
       
  1705         }
       
  1706 
       
  1707         @Override
       
  1708         public int hashCode() {
       
  1709             return Objects.hashCode(annotation);
       
  1710         }
       
  1711 
       
  1712         @Override
       
  1713         public String toString() {
       
  1714             return annotation.toString();
       
  1715         }
       
  1716     }
       
  1717 
       
  1718     private static class CoreReflAnnotationValue
       
  1719         implements javax.lang.model.element.AnnotationValue {
       
  1720         private Object value = null;
       
  1721 
       
  1722         protected CoreReflAnnotationValue(Object value) {
       
  1723             // Is this constraint really necessary?
       
  1724             Objects.requireNonNull(value);
       
  1725             this.value = value;
       
  1726         }
       
  1727 
       
  1728         @Override
       
  1729         public Object getValue() {
       
  1730             return value;
       
  1731         }
       
  1732 
       
  1733         @Override
       
  1734         public String toString() {
       
  1735             return value.toString();
       
  1736         }
       
  1737 
       
  1738         @Override
       
  1739         public <R,P> R accept(AnnotationValueVisitor<R,P> v, P p) {
       
  1740             return v.visit(this, p);
       
  1741         }
       
  1742     }
       
  1743 
       
  1744     // Helper utility classes
       
  1745 
       
  1746     private static class StringName implements Name {
       
  1747         private String name;
       
  1748 
       
  1749         private StringName(String name) {
       
  1750             this.name = Objects.requireNonNull(name);
       
  1751         }
       
  1752 
       
  1753         public static StringName instance(String name) {
       
  1754             return new StringName(name);
       
  1755         }
       
  1756 
       
  1757         @Override
       
  1758         public int length() {
       
  1759             return name.length();
       
  1760         }
       
  1761 
       
  1762         @Override
       
  1763         public char charAt(int index) {
       
  1764             return name.charAt(index);
       
  1765         }
       
  1766 
       
  1767         @Override
       
  1768         public CharSequence subSequence(int start, int end) {
       
  1769             return name.subSequence(start, end);
       
  1770         }
       
  1771 
       
  1772         @Override
       
  1773         public String toString() {
       
  1774             return name;
       
  1775         }
       
  1776 
       
  1777         @Override
       
  1778         public boolean equals(Object other) {
       
  1779             if (other instanceof StringName) {
       
  1780                 return name.equals(((StringName) other).name);
       
  1781             } else {
       
  1782                 return false;
       
  1783             }
       
  1784         }
       
  1785 
       
  1786         @Override
       
  1787         public int hashCode() {
       
  1788             return name.hashCode();
       
  1789         }
       
  1790 
       
  1791         @Override
       
  1792         public boolean contentEquals(CharSequence cs) {
       
  1793             return name.contentEquals(cs);
       
  1794         }
       
  1795     }
       
  1796 
       
  1797     /*
       
  1798      * Given an {@code int} value of modifiers, return a proper immutable set
       
  1799      * of {@code Modifier}s as a result.
       
  1800      */
       
  1801     private static class ModifierUtil {
       
  1802         private ModifierUtil() {
       
  1803             throw new AssertionError("No instances for you.");
       
  1804         }
       
  1805 
       
  1806         // Exercise for the reader: explore if caching of sets of
       
  1807         // Modifiers would be helpful.
       
  1808 
       
  1809         public static Set<Modifier> instance(int modifiers, boolean isDefault) {
       
  1810             Set<Modifier> modSet = EnumSet.noneOf(Modifier.class);
       
  1811 
       
  1812             if (java.lang.reflect.Modifier.isAbstract(modifiers))
       
  1813                 modSet.add(Modifier.ABSTRACT);
       
  1814 
       
  1815             if (java.lang.reflect.Modifier.isFinal(modifiers))
       
  1816                 modSet.add(Modifier.FINAL);
       
  1817 
       
  1818             if (java.lang.reflect.Modifier.isNative(modifiers))
       
  1819                 modSet.add(Modifier.NATIVE);
       
  1820 
       
  1821             if (java.lang.reflect.Modifier.isPrivate(modifiers))
       
  1822                 modSet.add(Modifier.PRIVATE);
       
  1823 
       
  1824             if (java.lang.reflect.Modifier.isProtected(modifiers))
       
  1825                 modSet.add(Modifier.PROTECTED);
       
  1826 
       
  1827             if (java.lang.reflect.Modifier.isPublic(modifiers))
       
  1828                 modSet.add(Modifier.PUBLIC);
       
  1829 
       
  1830             if (java.lang.reflect.Modifier.isStatic(modifiers))
       
  1831                 modSet.add(Modifier.STATIC);
       
  1832 
       
  1833             if (java.lang.reflect.Modifier.isStrict(modifiers))
       
  1834                 modSet.add(Modifier.STRICTFP);
       
  1835 
       
  1836             if (java.lang.reflect.Modifier.isSynchronized(modifiers))
       
  1837                 modSet.add(Modifier.SYNCHRONIZED);
       
  1838 
       
  1839             if (java.lang.reflect.Modifier.isTransient(modifiers))
       
  1840                 modSet.add(Modifier.TRANSIENT);
       
  1841 
       
  1842             if (java.lang.reflect.Modifier.isVolatile(modifiers))
       
  1843                 modSet.add(Modifier.VOLATILE);
       
  1844 
       
  1845             if (isDefault)
       
  1846                 modSet.add(Modifier.DEFAULT);
       
  1847 
       
  1848             return Collections.unmodifiableSet(modSet);
       
  1849         }
       
  1850     }
       
  1851 
       
  1852     private abstract static class AbstractTypeMirror implements TypeMirror {
       
  1853         private final TypeKind kind;
       
  1854 
       
  1855         protected AbstractTypeMirror(TypeKind kind) {
       
  1856             this.kind = Objects.requireNonNull(kind);
       
  1857         }
       
  1858 
       
  1859         @Override
       
  1860         public TypeKind getKind() {
       
  1861             return kind;
       
  1862         }
       
  1863 
       
  1864         @Override
       
  1865         public <R,P> R accept(TypeVisitor<R,P> v, P p) {
       
  1866             return v.visit(this, p);
       
  1867         }
       
  1868 
       
  1869         //Types methods
       
  1870         abstract List<? extends TypeMirror> directSuperTypes();
       
  1871 
       
  1872         TypeMirror capture() {
       
  1873             // Exercise for the reader: make this abstract and implement in subtypes
       
  1874             throw new UnsupportedOperationException();
       
  1875         }
       
  1876 
       
  1877         TypeMirror erasure() {
       
  1878             // Exercise for the reader: make this abstract and implement in subtypes
       
  1879             throw new UnsupportedOperationException();
       
  1880         }
       
  1881 
       
  1882         // Exercise for the reader: implement the AnnotatedConstruct methods
       
  1883         @Override
       
  1884         public List<? extends AnnotationMirror> getAnnotationMirrors() {
       
  1885             throw new UnsupportedOperationException();
       
  1886         }
       
  1887 
       
  1888         @Override
       
  1889         public <T extends Annotation> T getAnnotation(Class<T> annotationClass) {
       
  1890             throw new UnsupportedOperationException();
       
  1891         }
       
  1892 
       
  1893         @Override
       
  1894         public <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) {
       
  1895             throw new UnsupportedOperationException();
       
  1896         }
       
  1897     }
       
  1898 
       
  1899     private static class CoreReflArrayType extends AbstractTypeMirror
       
  1900         implements javax.lang.model.type.ArrayType,
       
  1901                    Reifiable {
       
  1902         private Class<?> source = null;
       
  1903         private Class<?> component = null;
       
  1904         private TypeMirror eagerComponent = null;
       
  1905 
       
  1906         protected CoreReflArrayType(Class<?> source) {
       
  1907             super(TypeKind.ARRAY);
       
  1908             this.source = source;
       
  1909             this.component = source.getComponentType();
       
  1910             this.eagerComponent = TypeFactory.instance(component);
       
  1911         }
       
  1912 
       
  1913         public TypeMirror getComponentType() {
       
  1914             return eagerComponent;
       
  1915         }
       
  1916 
       
  1917         @Override
       
  1918         public Class<?> getSource() {
       
  1919             return source;
       
  1920         }
       
  1921 
       
  1922         @Override
       
  1923         List<? extends TypeMirror> directSuperTypes() {
       
  1924             final TypeMirror componentType = getComponentType();
       
  1925             final TypeMirror[] directSupers;
       
  1926 
       
  1927             // JLS v4 4.10.3
       
  1928             if (componentType.getKind().isPrimitive() ||
       
  1929                 component.equals(java.lang.Object.class)) {
       
  1930                 directSupers = new TypeMirror[3];
       
  1931                 directSupers[0] = TypeFactory.instance(java.lang.Object.class);
       
  1932                 directSupers[1] = TypeFactory.instance(java.lang.Cloneable.class);
       
  1933                 directSupers[2] = TypeFactory.instance(java.io.Serializable.class);
       
  1934             } else if (componentType.getKind() == TypeKind.ARRAY) {
       
  1935                 List<? extends TypeMirror> componentDirectSupertypes = CoreReflTypes.instance().directSupertypes(componentType);
       
  1936                 directSupers = new TypeMirror[componentDirectSupertypes.size()];
       
  1937                 for (int i = 0; i < directSupers.length; i++) {
       
  1938                     directSupers[i] = new CoreReflArrayType(Array.newInstance(((Reifiable)componentDirectSupertypes.get(i)).getSource(), 0).getClass());
       
  1939                 }
       
  1940             } else {
       
  1941                 Class<?> superClass = component.getSuperclass();
       
  1942                 Class<?>[] interfaces = component.getInterfaces();
       
  1943                 directSupers = new TypeMirror[1 + interfaces.length];
       
  1944 
       
  1945                 directSupers[0] = TypeFactory.instance(Array.newInstance(superClass, 0).getClass());
       
  1946 
       
  1947                 for (int i = 0; i < interfaces.length; i++) {
       
  1948                     directSupers[i + 1] = TypeFactory.instance(Array.newInstance(interfaces[i],0).getClass());
       
  1949                 }
       
  1950             }
       
  1951 
       
  1952             return Collections.unmodifiableList(Arrays.asList(directSupers));
       
  1953         }
       
  1954 
       
  1955         @Override
       
  1956         public String toString() {
       
  1957             return getKind() + " of " + getComponentType().toString();
       
  1958         }
       
  1959     }
       
  1960 
       
  1961     private static class CaptureTypeVariable extends AbstractTypeMirror implements javax.lang.model.type.TypeVariable {
       
  1962         private TypeMirror source = null;
       
  1963         private TypeMirror upperBound = null;
       
  1964         private TypeMirror lowerBound = null;
       
  1965 
       
  1966         CaptureTypeVariable(TypeMirror source,
       
  1967                             TypeMirror upperBound,
       
  1968                             TypeMirror lowerBound) {
       
  1969             super(TypeKind.TYPEVAR);
       
  1970 
       
  1971             this.source = Objects.requireNonNull(source);
       
  1972             this.upperBound = (upperBound == null ? CoreReflTypes.instance().getNullType() : upperBound);
       
  1973             this.lowerBound = (lowerBound == null ? CoreReflTypes.instance().getNullType() : lowerBound);
       
  1974         }
       
  1975 
       
  1976         protected Class<?> getSource() {
       
  1977             if (source instanceof CoreReflDeclaredType) {
       
  1978                 return ((CoreReflDeclaredType)source).getSource();
       
  1979             } else {
       
  1980                 return null;
       
  1981             }
       
  1982         }
       
  1983 
       
  1984         @Override
       
  1985         public TypeMirror getUpperBound() {
       
  1986             return upperBound;
       
  1987         }
       
  1988 
       
  1989         @Override
       
  1990         public TypeMirror getLowerBound() {
       
  1991             return lowerBound;
       
  1992         }
       
  1993 
       
  1994         @Override
       
  1995         public Element asElement() {
       
  1996             if (null == getSource()) {
       
  1997                 return null;
       
  1998             }
       
  1999             return CoreReflectionFactory.createMirror(getSource());
       
  2000         }
       
  2001 
       
  2002         @Override
       
  2003         List<? extends TypeMirror> directSuperTypes() {
       
  2004             throw new UnsupportedOperationException();
       
  2005 
       
  2006         }
       
  2007 
       
  2008         @Override
       
  2009         public String toString() {
       
  2010             return getKind() + " CAPTURE of: " + source.toString();
       
  2011         }
       
  2012     }
       
  2013 
       
  2014     private static class CoreReflElements implements ReflectionElements {
       
  2015         private CoreReflElements() {} // mostly one instance for you
       
  2016 
       
  2017         private static CoreReflElements instance = new CoreReflElements();
       
  2018 
       
  2019         static CoreReflElements instance() {
       
  2020             return instance;
       
  2021         }
       
  2022 
       
  2023         /**
       
  2024          * {@inheritDoc}
       
  2025          */
       
  2026         @Override
       
  2027         public ReflectionPackageElement getPackageElement(CharSequence name) {
       
  2028             return createMirror(Package.getPackage(name.toString()));
       
  2029         }
       
  2030 
       
  2031         /**
       
  2032          * {@inheritDoc}
       
  2033          */
       
  2034         @Override
       
  2035         public ReflectionTypeElement getTypeElement(CharSequence name) {
       
  2036             // where name is a Canonical Name jls 6.7
       
  2037             // but this method will probably accept an equivalent FQN
       
  2038             // depending on Class.forName(String)
       
  2039 
       
  2040             ReflectionTypeElement tmp = null;
       
  2041 
       
  2042             // Filter out arrays
       
  2043             String n = name.toString();
       
  2044             if (n.contains("[")) return null;
       
  2045             if (n.equals("")) return null;
       
  2046 
       
  2047             // The intention of this loop is to handle nested
       
  2048             // elements.  If finding the element using Class.forName
       
  2049             // fails, an attempt is made to find the element as an
       
  2050             // enclosed element by trying fo find a prefix of the name
       
  2051             // (dropping a trailing ".xyz") and looking for "xyz" as
       
  2052             // an enclosed element.
       
  2053 
       
  2054             Deque<String> parts = new ArrayDeque<>();
       
  2055             boolean again;
       
  2056             do {
       
  2057                 again = false;
       
  2058                 try {
       
  2059                     tmp = createMirror(Class.forName(n));
       
  2060                 } catch (ClassNotFoundException e) {
       
  2061                     tmp = null;
       
  2062                 }
       
  2063 
       
  2064                 if (tmp != null) {
       
  2065                     if (parts.isEmpty()) {
       
  2066                         return tmp;
       
  2067                     }
       
  2068 
       
  2069                     tmp = findInner(tmp, parts);
       
  2070                     if (tmp != null) {
       
  2071                         return tmp;
       
  2072                     }
       
  2073                 }
       
  2074 
       
  2075                 int indx = n.lastIndexOf('.');
       
  2076                 if (indx > -1) {
       
  2077                     parts.addFirst(n.substring(indx + 1));
       
  2078                     n = n.substring(0, indx);
       
  2079                     again = true;
       
  2080                 }
       
  2081             } while (again);
       
  2082 
       
  2083             return null;
       
  2084         }
       
  2085 
       
  2086         // Recursively finds enclosed type elements named as part.top() popping part and repeating
       
  2087         private ReflectionTypeElement findInner(ReflectionTypeElement e, Deque<String> parts) {
       
  2088             if (parts.isEmpty()) {
       
  2089                 return e;
       
  2090             }
       
  2091 
       
  2092             String part = parts.removeFirst();
       
  2093             List<ReflectionElement> enclosed = e.getEnclosedElements();
       
  2094             for (ReflectionElement elm : enclosed) {
       
  2095                 if ((elm.getKind() == ElementKind.CLASS ||
       
  2096                      elm.getKind() == ElementKind.INTERFACE ||
       
  2097                      elm.getKind() == ElementKind.ENUM ||
       
  2098                      elm.getKind() == ElementKind.ANNOTATION_TYPE)
       
  2099                     && elm.getSimpleName().toString().equals(part)) {
       
  2100                     ReflectionTypeElement t = findInner((ReflectionTypeElement)elm, parts);
       
  2101                     if (t != null) {
       
  2102                         return t;
       
  2103                     }
       
  2104                 }
       
  2105             }
       
  2106             return null;
       
  2107         }
       
  2108 
       
  2109         /**
       
  2110          * {@inheritDoc}
       
  2111          */
       
  2112         @Override
       
  2113         public Map<? extends ReflectionExecutableElement, ? extends AnnotationValue>
       
  2114             getElementValuesWithDefaults(AnnotationMirror a) {
       
  2115             if (a instanceof CoreReflAnnotationMirror) {
       
  2116                 return ((CoreReflAnnotationMirror)a).getElementValues();
       
  2117             } else {
       
  2118                 throw new IllegalArgumentException();
       
  2119             }
       
  2120         }
       
  2121 
       
  2122         /**
       
  2123          * {@inheritDoc}
       
  2124          */
       
  2125         @Override
       
  2126         public String getDocComment(Element e) {
       
  2127             checkElement(e);
       
  2128             return null; // As per the doc
       
  2129         }
       
  2130 
       
  2131         /**
       
  2132          * {@inheritDoc}
       
  2133          */
       
  2134         @Override
       
  2135         public boolean isDeprecated(Element e) {
       
  2136             checkElement(e);
       
  2137             return ((CoreReflElement)e).getSource().isAnnotationPresent(java.lang.Deprecated.class);
       
  2138         }
       
  2139 
       
  2140         /**
       
  2141          * {@inheritDoc}
       
  2142          */
       
  2143         @Override
       
  2144         public Name getBinaryName(TypeElement type) {
       
  2145             checkElement(type);
       
  2146             return StringName.instance(((CoreReflTypeElement)type)
       
  2147                                        .getSource()
       
  2148                                        .getName());
       
  2149         }
       
  2150 
       
  2151         /**
       
  2152          * {@inheritDoc}
       
  2153          */
       
  2154         @Override
       
  2155         public ReflectionPackageElement getPackageOf(Element type) {
       
  2156             checkElement(type);
       
  2157             if (type instanceof ReflectionPackageElement) {
       
  2158                 return (ReflectionPackageElement)type;
       
  2159             }
       
  2160 
       
  2161             Package p;
       
  2162             if (type instanceof CoreReflTypeElement) {
       
  2163                 p = ((CoreReflTypeElement)type).getSource().getPackage();
       
  2164             } else {
       
  2165                 CoreReflTypeElement enclosingTypeElement = (CoreReflTypeElement)getEnclosingTypeElement((ReflectionElement)type);
       
  2166                 p = enclosingTypeElement.getSource().getPackage();
       
  2167             }
       
  2168 
       
  2169             return createMirror(p);
       
  2170         }
       
  2171 
       
  2172         /**
       
  2173          * {@inheritDoc}
       
  2174          */
       
  2175         @Override
       
  2176         public List<? extends ReflectionElement> getAllMembers(TypeElement type) {
       
  2177             checkElement(type);
       
  2178             return getAllMembers((ReflectionTypeElement)type);
       
  2179         }
       
  2180 
       
  2181         // Exercise for the reader: should this method, and similar
       
  2182         // ones that specialize on the more specific argument types,
       
  2183         // be addd to the public ReflectionElements API?
       
  2184         public List<? extends ReflectionElement> getAllMembers(ReflectionTypeElement type) {
       
  2185             return type.getAllMembers();
       
  2186         }
       
  2187 
       
  2188         /**
       
  2189          * {@inheritDoc}
       
  2190          */
       
  2191         @Override
       
  2192         public List<? extends AnnotationMirror> getAllAnnotationMirrors(Element e) {
       
  2193             checkElement(e);
       
  2194             AnnotatedElement ae = CoreReflElement.class.cast(e).getSource();
       
  2195             Annotation[] annotations = ae.getAnnotations();
       
  2196             int len = annotations.length;
       
  2197 
       
  2198             if (len > 0) {
       
  2199                 List<AnnotationMirror> res = new ArrayList<>(len);
       
  2200                 for (Annotation a : annotations) {
       
  2201                     res.add(createMirror(a));
       
  2202                 }
       
  2203                 return Collections.unmodifiableList(res);
       
  2204             } else {
       
  2205                 List<AnnotationMirror> ret = Collections.emptyList();
       
  2206                 return ret;
       
  2207             }
       
  2208         }
       
  2209 
       
  2210         /**
       
  2211          * {@inheritDoc}
       
  2212          */
       
  2213         @Override
       
  2214         public boolean hides(Element hider, Element hidden) {
       
  2215             checkElement(hider);
       
  2216             checkElement(hidden);
       
  2217 
       
  2218             // Names must be equal
       
  2219             if (!hider.getSimpleName().equals(hidden.getSimpleName())) {
       
  2220                 return false;
       
  2221             }
       
  2222 
       
  2223             // Hides isn't reflexive
       
  2224             if (hider.equals(hidden)) {
       
  2225                 return false;
       
  2226             }
       
  2227 
       
  2228             // Hider and hidden needs to be field, method or type
       
  2229             // and fields hide fields, types hide types, methods hide methods
       
  2230             // IE a Field doesn't hide a Methods etc
       
  2231             ElementKind hiderKind = hider.getKind();
       
  2232             ElementKind hiddenKind = hidden.getKind();
       
  2233             if (hiderKind.isField() && !hiddenKind.isField()) {
       
  2234                 return false;
       
  2235             } else if (hiderKind.isClass() &&
       
  2236                        !(hiddenKind.isClass() || hiddenKind.isInterface())) {
       
  2237                 return false;
       
  2238             } else if (hiderKind.isInterface() &&
       
  2239                        !(hiddenKind.isClass() || hiddenKind.isInterface())) {
       
  2240                 return false;
       
  2241             } else if (hiderKind == ElementKind.METHOD && hiddenKind != ElementKind.METHOD) {
       
  2242                 return false;
       
  2243             } else if (!(hiderKind.isClass() ||
       
  2244                          hiderKind.isInterface() ||
       
  2245                          hiderKind.isField() ||
       
  2246                          hiderKind == ElementKind.METHOD)) {
       
  2247                 return false;
       
  2248             }
       
  2249 
       
  2250             Set<Modifier> hm = hidden.getModifiers();
       
  2251             // jls 8.4.8.2 only static methods can hide methods
       
  2252             if (hider.getKind() == ElementKind.METHOD) {
       
  2253                 if (!hider.getModifiers().contains(Modifier.STATIC)) {
       
  2254                     return false; // hider not static
       
  2255                 } else if (!hm.contains(Modifier.STATIC)) { // we know it's a method
       
  2256                     return false; // hidden not static
       
  2257                 }
       
  2258 
       
  2259                 // For methods we also need to check parameter types
       
  2260                 Class<?>[] h1 = ((CoreReflMethodExecutableElement)hider).getSource().getParameterTypes();
       
  2261                 Class<?>[] h2 = ((CoreReflMethodExecutableElement)hidden).getSource().getParameterTypes();
       
  2262                 if (h1.length != h2.length) {
       
  2263                     return false;
       
  2264                 }
       
  2265                 for (int i = 0; i < h1.length; i++) {
       
  2266                     if (h1[i] != h2[i]) {
       
  2267                         return false;
       
  2268                     }
       
  2269                 }
       
  2270             }
       
  2271 
       
  2272             // You can only hide visible elements
       
  2273             if (hm.contains(Modifier.PRIVATE)) {
       
  2274                 return false; // hidden private, can't be hidden
       
  2275             } else if ((!(hm.contains(Modifier.PUBLIC) || hm.contains(Modifier.PROTECTED))) && // not private, not (public or protected) IE package private
       
  2276                        (!getPackageOf(hider).equals(getPackageOf(hidden)))) {
       
  2277                 return false; // hidden package private, and different packages, IE not visible
       
  2278             }
       
  2279 
       
  2280             // Ok so now hider actually hides hidden if hider is
       
  2281             // declared on a subtype of hidden.
       
  2282             //
       
  2283             // TODO: should this be a proper subtype or is that taken
       
  2284             // care of by the reflexive check in the beginning?
       
  2285             //
       
  2286             TypeMirror hiderType = getEnclosingTypeElement((ReflectionElement)hider).asType();
       
  2287             TypeMirror hiddenType = getEnclosingTypeElement((ReflectionElement)hidden).asType();
       
  2288 
       
  2289             return getTypes().isSubtype(hiderType, hiddenType);
       
  2290         }
       
  2291 
       
  2292         /**
       
  2293          * {@inheritDoc}
       
  2294          */
       
  2295         @Override
       
  2296         public ReflectionTypeElement getEnclosingTypeElement(ReflectionElement e) {
       
  2297             if (e.getKind() == ElementKind.PACKAGE) {
       
  2298                 return null;
       
  2299             }
       
  2300 
       
  2301             if(e instanceof CoreReflTypeParameterElement) {
       
  2302                 ReflectionElement encElem = ((CoreReflTypeParameterElement)e).getEnclosingElement();
       
  2303                 if (encElem instanceof ReflectionTypeElement) {
       
  2304                     return (ReflectionTypeElement)encElem;
       
  2305                 } else  {
       
  2306                     return getEnclosingTypeElement(encElem);
       
  2307                 }
       
  2308             }
       
  2309 
       
  2310             Class<?> encl = null;
       
  2311             if (e instanceof CoreReflTypeElement) {
       
  2312                 encl = ((CoreReflTypeElement)e).getSource().getDeclaringClass();
       
  2313             } else if (e instanceof CoreReflExecutableElement) {
       
  2314                 encl = (((CoreReflExecutableElement)e).getSource()).getDeclaringClass();
       
  2315             } else if (e instanceof CoreReflFieldVariableElement) {
       
  2316                 encl = ((CoreReflFieldVariableElement)e).getSource().getDeclaringClass();
       
  2317             } else if (e instanceof CoreReflParameterVariableElement) {
       
  2318                 encl = ((CoreReflParameterVariableElement)e).getSource().getDeclaringExecutable().getDeclaringClass();
       
  2319             }
       
  2320 
       
  2321             return encl == null ? null : createMirror(encl);
       
  2322         }
       
  2323 
       
  2324         /**
       
  2325          *{@inheritDoc}
       
  2326          *
       
  2327          * Note that this implementation does not handle the situation
       
  2328          * where A overrides B and B overrides C but A does not
       
  2329          * directly override C. In this case, this implementation will
       
  2330          * erroneously return false.
       
  2331          */
       
  2332         @Override
       
  2333         public boolean overrides(ExecutableElement overrider, ExecutableElement overridden,
       
  2334                                  TypeElement type) {
       
  2335             checkElement(overrider);
       
  2336             checkElement(overridden);
       
  2337             checkElement(type);
       
  2338 
       
  2339             // TODO handle transitive overrides
       
  2340             return overridesDirect(overrider, overridden, type);
       
  2341         }
       
  2342 
       
  2343         private boolean overridesDirect(ExecutableElement overrider, ExecutableElement overridden,
       
  2344                                          TypeElement type) {
       
  2345             // Should we check that at least one of the types
       
  2346             // overrider has is in fact a supertype of the TypeElement
       
  2347             // 'type' supplied?
       
  2348 
       
  2349             CoreReflExecutableElement rider = (CoreReflExecutableElement)overrider;
       
  2350             CoreReflExecutableElement ridden = (CoreReflExecutableElement)overridden;
       
  2351             CoreReflTypeElement riderType = (CoreReflTypeElement)type;
       
  2352 
       
  2353             // Names must match, redundant - see subsignature below
       
  2354             if (!rider.getSimpleName().equals(ridden.getSimpleName())) {
       
  2355                 return false;
       
  2356             }
       
  2357 
       
  2358             // Constructors don't override
       
  2359             // TODO: verify this fact
       
  2360             if (rider.getKind() == ElementKind.CONSTRUCTOR ||
       
  2361                 ridden.getKind() == ElementKind.CONSTRUCTOR) {
       
  2362                 return false;
       
  2363             }
       
  2364 
       
  2365             // Overridden must be visible to be overridden
       
  2366             // TODO Fix transitive visibility/override
       
  2367             Set<Modifier> rm = ridden.getModifiers();
       
  2368             if (rm.contains(Modifier.PRIVATE)) {
       
  2369                 return false; // overridden private, can't be overridden
       
  2370             } else if ((!(rm.contains(Modifier.PUBLIC) || rm.contains(Modifier.PROTECTED))) && // not private, not (public or protected) IE package private
       
  2371                        (!getPackageOf(rider).equals(getPackageOf(ridden)))) {
       
  2372                 return false; // ridden package private, and different packages, IE not visible
       
  2373             }
       
  2374 
       
  2375             // Static methods doesn't override
       
  2376             if (rm.contains(Modifier.STATIC) ||
       
  2377                 rider.getModifiers().contains(Modifier.STATIC)) {
       
  2378                 return false;
       
  2379             }
       
  2380 
       
  2381             // Declaring class of overrider must be a subclass of declaring class of overridden
       
  2382             // except we use the parameter type as declaring class of overrider
       
  2383             if (!getTypes().isSubtype(riderType.asType(), getEnclosingTypeElement(ridden).asType())) {
       
  2384                 return false;
       
  2385             }
       
  2386 
       
  2387             // Now overrider overrides overridden if the signature of rider is a subsignature of ridden
       
  2388             return getTypes().isSubsignature(rider.asType(), ridden.asType());
       
  2389         }
       
  2390 
       
  2391         /**
       
  2392          *{@inheritDoc}
       
  2393          */
       
  2394         @Override
       
  2395         public String getConstantExpression(Object value) {
       
  2396             return Constants.format(value);
       
  2397         }
       
  2398 
       
  2399         // If CoreReflectionFactory were a proper part of the JDK, the
       
  2400         // analogous functionality in javac could be reused.
       
  2401         private static class Constants {
       
  2402             /**
       
  2403              * Returns a string representation of a constant value (given in
       
  2404              * standard wrapped representation), quoted and formatted as in
       
  2405              * Java source.
       
  2406              */
       
  2407             public static String format(Object value) {
       
  2408                 if (value instanceof Byte)      return formatByte((Byte) value);
       
  2409                 if (value instanceof Short)     return formatShort((Short) value);
       
  2410                 if (value instanceof Long)      return formatLong((Long) value);
       
  2411                 if (value instanceof Float)     return formatFloat((Float) value);
       
  2412                 if (value instanceof Double)    return formatDouble((Double) value);
       
  2413                 if (value instanceof Character) return formatChar((Character) value);
       
  2414                 if (value instanceof String)    return formatString((String) value);
       
  2415                 if (value instanceof Integer ||
       
  2416                     value instanceof Boolean)   return value.toString();
       
  2417                 else
       
  2418                     throw new IllegalArgumentException("Argument is not a primitive type or a string; it " +
       
  2419                                                        ((value == null) ?
       
  2420                                                         "is a null value." :
       
  2421                                                         "has class " +
       
  2422                                                         value.getClass().getName()) + "." );
       
  2423             }
       
  2424 
       
  2425             private static String formatByte(byte b) {
       
  2426                 return String.format("(byte)0x%02x", b);
       
  2427             }
       
  2428 
       
  2429             private static String formatShort(short s) {
       
  2430                 return String.format("(short)%d", s);
       
  2431             }
       
  2432 
       
  2433             private static String formatLong(long lng) {
       
  2434                 return lng + "L";
       
  2435             }
       
  2436 
       
  2437             private static String formatFloat(float f) {
       
  2438                 if (Float.isNaN(f))
       
  2439                     return "0.0f/0.0f";
       
  2440                 else if (Float.isInfinite(f))
       
  2441                     return (f < 0) ? "-1.0f/0.0f" : "1.0f/0.0f";
       
  2442                 else
       
  2443                     return f + "f";
       
  2444             }
       
  2445 
       
  2446             private static String formatDouble(double d) {
       
  2447                 if (Double.isNaN(d))
       
  2448                     return "0.0/0.0";
       
  2449                 else if (Double.isInfinite(d))
       
  2450                     return (d < 0) ? "-1.0/0.0" : "1.0/0.0";
       
  2451                 else
       
  2452                     return d + "";
       
  2453             }
       
  2454 
       
  2455             private static String formatChar(char c) {
       
  2456                 return '\'' + quote(c) + '\'';
       
  2457             }
       
  2458 
       
  2459             private static String formatString(String s) {
       
  2460                 return '"' + quote(s) + '"';
       
  2461             }
       
  2462 
       
  2463             /**
       
  2464              * Escapes each character in a string that has an escape sequence or
       
  2465              * is non-printable ASCII.  Leaves non-ASCII characters alone.
       
  2466              */
       
  2467             private static String quote(String s) {
       
  2468                 StringBuilder buf = new StringBuilder();
       
  2469                 for (int i = 0; i < s.length(); i++) {
       
  2470                     buf.append(quote(s.charAt(i)));
       
  2471                 }
       
  2472                 return buf.toString();
       
  2473             }
       
  2474 
       
  2475             /**
       
  2476              * Escapes a character if it has an escape sequence or is
       
  2477              * non-printable ASCII.  Leaves ASCII characters alone.
       
  2478              */
       
  2479             private static String quote(char ch) {
       
  2480                 switch (ch) {
       
  2481                 case '\b':  return "\\b";
       
  2482                 case '\f':  return "\\f";
       
  2483                 case '\n':  return "\\n";
       
  2484                 case '\r':  return "\\r";
       
  2485                 case '\t':  return "\\t";
       
  2486                 case '\'':  return "\\'";
       
  2487                 case '\"':  return "\\\"";
       
  2488                 case '\\':  return "\\\\";
       
  2489                 default:
       
  2490                     return (isPrintableAscii(ch))
       
  2491                         ? String.valueOf(ch)
       
  2492                         : String.format("\\u%04x", (int) ch);
       
  2493                 }
       
  2494             }
       
  2495 
       
  2496             /**
       
  2497              * Is a character printable ASCII?
       
  2498              */
       
  2499             private static boolean isPrintableAscii(char ch) {
       
  2500                 return ch >= ' ' && ch <= '~';
       
  2501             }
       
  2502         }
       
  2503 
       
  2504         /**
       
  2505          * {@inheritDoc}
       
  2506          */
       
  2507         @Override
       
  2508         public void printElements(Writer w, Element... elements) {
       
  2509             ElementVisitor<?, ?> printer = getPrinter(w);
       
  2510             try {
       
  2511                 for (Element e : elements) {
       
  2512                     checkElement(e);
       
  2513                     printer.visit(e);
       
  2514                 }
       
  2515             } finally {
       
  2516                 try {
       
  2517                     w.flush();
       
  2518                 } catch (java.io.IOException e) { /* Ignore */;}
       
  2519             }
       
  2520         }
       
  2521 
       
  2522         private ElementVisitor<?, ?> getPrinter(Writer w) {
       
  2523             // First try a reflective call into javac and if that
       
  2524             // fails, fallback to a very simple toString-based
       
  2525             // scanner.
       
  2526             try {
       
  2527                 //reflective form of
       
  2528                 // return new com.sun.tools.javac.processing.PrintingProcessor.PrintingElementVisitor(w, getElements());
       
  2529                 Class<?> printProcClass =
       
  2530                     ClassLoader.getSystemClassLoader().loadClass("com.sun.tools.javac.processing.PrintingProcessor$PrintingElementVisitor");
       
  2531                 Constructor<?> printProcCtor = printProcClass.getConstructor(Writer.class, Elements.class);
       
  2532                 return (ElementVisitor) printProcCtor.newInstance(w, getElements());
       
  2533             } catch (ReflectiveOperationException | SecurityException e) {
       
  2534                 return new ElementScanner8<Writer, Void>(w){
       
  2535                     @Override
       
  2536                     public Writer scan(Element e, Void v) {
       
  2537                         try {
       
  2538                             DEFAULT_VALUE.append(e.toString());
       
  2539                             DEFAULT_VALUE.append("\n");
       
  2540                         } catch (java.io.IOException ioe) {
       
  2541                             throw new RuntimeException(ioe);
       
  2542                         }
       
  2543                         return DEFAULT_VALUE;
       
  2544                     }
       
  2545                 };
       
  2546             }
       
  2547         }
       
  2548 
       
  2549         /**
       
  2550          * {@inheritDoc}
       
  2551          */
       
  2552         @Override
       
  2553         public Name getName(CharSequence cs) {
       
  2554             return StringName.instance(cs.toString());
       
  2555         }
       
  2556 
       
  2557         private void checkElement(Element e) {
       
  2558             if(!(e instanceof CoreReflElement)) {
       
  2559                 throw new IllegalArgumentException();
       
  2560             }
       
  2561         }
       
  2562 
       
  2563         @Override
       
  2564         public boolean isFunctionalInterface(TypeElement e) {
       
  2565             throw new UnsupportedOperationException();
       
  2566             // Update once this functionality is in core reflection
       
  2567         }
       
  2568     }
       
  2569 
       
  2570     private static class CoreReflTypes implements javax.lang.model.util.Types {
       
  2571         private static Types instance = new CoreReflTypes();
       
  2572 
       
  2573         public static Types instance() {
       
  2574             return instance;
       
  2575         }
       
  2576 
       
  2577         // Private to suppress instantiation
       
  2578         private CoreReflTypes() {}
       
  2579 
       
  2580         // Types methods
       
  2581         @Override
       
  2582         public Element asElement(TypeMirror t) {
       
  2583             checkType(t);
       
  2584             if (t instanceof javax.lang.model.type.TypeVariable) {
       
  2585                 ((javax.lang.model.type.TypeVariable)t).asElement();
       
  2586             } else if (t instanceof DeclaredType) {
       
  2587                 return ((DeclaredType)t).asElement();
       
  2588             }
       
  2589             return null;
       
  2590         }
       
  2591 
       
  2592         @Override
       
  2593         public boolean isSameType(TypeMirror t1, TypeMirror t2) {
       
  2594             if (t1.getKind() != t2.getKind()) {
       
  2595                 return false;
       
  2596             }
       
  2597 
       
  2598             if (t1.getKind() == TypeKind.WILDCARD ||
       
  2599                 t2.getKind() == TypeKind.WILDCARD) {
       
  2600                 // Wildcards are not equal to any type
       
  2601                 return false;
       
  2602             }
       
  2603 
       
  2604             if (t1 instanceof CoreReflDeclaredType &&
       
  2605                 t2 instanceof CoreReflDeclaredType) {
       
  2606                 return ((CoreReflDeclaredType)t1).isSameType((CoreReflDeclaredType)t2);
       
  2607             } else if (t1 instanceof PrimitiveType &&
       
  2608                        t2 instanceof PrimitiveType) {
       
  2609                 return t1.getKind() == t2.getKind();
       
  2610             } else if (t1 instanceof NoType &&
       
  2611                        t2 instanceof NoType) {
       
  2612                 return true;
       
  2613             } else if (t1 instanceof NullType &&
       
  2614                        t2 instanceof NullType) {
       
  2615                 return true;
       
  2616             } else if (t1 instanceof ArrayType &&
       
  2617                        t2 instanceof ArrayType) {
       
  2618                 return isSameType(((ArrayType)t1).getComponentType(), ((ArrayType)t2).getComponentType());
       
  2619             }
       
  2620 
       
  2621             return false;
       
  2622         }
       
  2623 
       
  2624         @Override
       
  2625         public boolean isSubtype(TypeMirror t1, TypeMirror t2) {
       
  2626             checkType(t1);
       
  2627             checkType(t2);
       
  2628 
       
  2629             if (isSameType(t1, t2)) {
       
  2630                 return true;
       
  2631             } else if(t1.getKind() == TypeKind.NULL) {
       
  2632                 return true;
       
  2633             }
       
  2634 
       
  2635             // This depth first traversal should terminate due to the ban on circular inheritance
       
  2636             List<? extends TypeMirror> directSupertypes = directSupertypes(t1);
       
  2637             if (directSupertypes.isEmpty()) {
       
  2638                 return false;
       
  2639             }
       
  2640             for (TypeMirror ti : directSupertypes) {
       
  2641                 if (isSameType(ti, t2) || isSubtype(ti, t2)) {
       
  2642                     return true;
       
  2643                 }
       
  2644             }
       
  2645             return false;
       
  2646         }
       
  2647 
       
  2648         @Override
       
  2649         public boolean isAssignable(TypeMirror t1, TypeMirror t2) {
       
  2650             throw new UnsupportedOperationException();
       
  2651         }
       
  2652 
       
  2653         @Override
       
  2654         public boolean contains(TypeMirror t1, TypeMirror t2) {
       
  2655             throw new UnsupportedOperationException();
       
  2656         }
       
  2657 
       
  2658         @Override
       
  2659         public boolean isSubsignature(ExecutableType m1, ExecutableType m2) {
       
  2660             checkType(m1);
       
  2661             checkType(m2);
       
  2662 
       
  2663             ExecutableMethodType m0 = (ExecutableMethodType)m1;
       
  2664 
       
  2665             return m0.sameSignature((ExecutableMethodType)m2) || m0.sameSignature((ExecutableMethodType)erasure(m2));
       
  2666         }
       
  2667 
       
  2668         @Override
       
  2669         public List<? extends TypeMirror> directSupertypes(TypeMirror t) {
       
  2670             checkType(t);
       
  2671             if (t instanceof ExecutableType ||
       
  2672                 t.getKind() == TypeKind.PACKAGE) {
       
  2673                 throw new IllegalArgumentException("You can't ask for direct supertypes for type: " + t);
       
  2674             }
       
  2675             return ((AbstractTypeMirror)t).directSuperTypes();
       
  2676         }
       
  2677 
       
  2678         @Override
       
  2679         public TypeMirror erasure(TypeMirror t) {
       
  2680             checkType(t);
       
  2681             return ((AbstractTypeMirror)t).erasure();
       
  2682         }
       
  2683 
       
  2684         @Override
       
  2685         public TypeElement boxedClass(javax.lang.model.type.PrimitiveType p) {
       
  2686             throw new UnsupportedOperationException();
       
  2687         }
       
  2688 
       
  2689         @Override
       
  2690         public PrimitiveType unboxedType(TypeMirror t) {
       
  2691             throw new UnsupportedOperationException();
       
  2692         }
       
  2693 
       
  2694         @Override
       
  2695         public TypeMirror capture(TypeMirror t) {
       
  2696             checkType(t);
       
  2697             return ((AbstractTypeMirror)t).capture();
       
  2698         }
       
  2699 
       
  2700         @Override
       
  2701         public PrimitiveType getPrimitiveType(TypeKind kind) {
       
  2702             return PrimitiveType.instance(kind);
       
  2703         }
       
  2704 
       
  2705         @Override
       
  2706         public NullType getNullType() {
       
  2707             return CoreReflNullType.getInstance();
       
  2708         }
       
  2709 
       
  2710         @Override
       
  2711         public javax.lang.model.type.NoType getNoType(TypeKind kind) {
       
  2712             if (kind == TypeKind.NONE) {
       
  2713                 return NoType.getNoneInstance();
       
  2714             } else if (kind == TypeKind.VOID) {
       
  2715                 return NoType.getVoidInstance();
       
  2716             } else {
       
  2717                 throw new IllegalArgumentException("No NoType of kind: " + kind);
       
  2718             }
       
  2719         }
       
  2720 
       
  2721         @Override
       
  2722         public ArrayType getArrayType(TypeMirror componentType) {
       
  2723             throw new UnsupportedOperationException();
       
  2724         }
       
  2725 
       
  2726         @Override
       
  2727         public javax.lang.model.type.WildcardType getWildcardType(TypeMirror extendsBound,
       
  2728                                                                   TypeMirror superBound) {
       
  2729             throw new UnsupportedOperationException();
       
  2730         }
       
  2731 
       
  2732         @Override
       
  2733         public DeclaredType getDeclaredType(TypeElement typeElem, TypeMirror... typeArgs) {
       
  2734             throw new UnsupportedOperationException();
       
  2735         }
       
  2736 
       
  2737         @Override
       
  2738         public javax.lang.model.type.DeclaredType getDeclaredType(javax.lang.model.type.DeclaredType containing,
       
  2739                                                                   TypeElement typeElem,
       
  2740                                                                   TypeMirror... typeArgs) {
       
  2741             throw new UnsupportedOperationException();
       
  2742         }
       
  2743 
       
  2744         @Override
       
  2745         public TypeMirror asMemberOf(javax.lang.model.type.DeclaredType containing, Element element) {
       
  2746             throw new UnsupportedOperationException();
       
  2747         }
       
  2748 
       
  2749         private void checkType(TypeMirror t) {
       
  2750             if (!(t instanceof AbstractTypeMirror)) {
       
  2751                 throw new IllegalArgumentException("This Types implementation can only operate on CoreReflectionFactory type classes");
       
  2752             }
       
  2753         }
       
  2754     }
       
  2755 
       
  2756     private abstract static class CoreReflDeclaredType extends AbstractTypeMirror
       
  2757         implements javax.lang.model.type.DeclaredType {
       
  2758         private Class<?> source = null;
       
  2759 
       
  2760         private CoreReflDeclaredType(Class<?> source) {
       
  2761             super(TypeKind.DECLARED);
       
  2762             this.source = source;
       
  2763         }
       
  2764 
       
  2765         static DeclaredType instance(Class<?> source, Type genericSource) {
       
  2766             if (genericSource instanceof ParameterizedType) {
       
  2767                 return new ParameterizedDeclaredType(source, (ParameterizedType)genericSource);
       
  2768             } else if (genericSource instanceof Class) { // This happens when a field has a raw type
       
  2769                 if (!source.equals(genericSource)) {
       
  2770                     throw new IllegalArgumentException("Don't know how to handle this");
       
  2771                 }
       
  2772                 return instance(source);
       
  2773             }
       
  2774             throw new IllegalArgumentException("Don't know how to create a declared type from: " +
       
  2775                                                source +
       
  2776                                                " and genericSource " +
       
  2777                                                genericSource);
       
  2778         }
       
  2779 
       
  2780         static DeclaredType instance(Class<?> source) {
       
  2781             return new RawDeclaredType(source);
       
  2782         }
       
  2783 
       
  2784         protected Class<?> getSource() {
       
  2785             return source;
       
  2786         }
       
  2787 
       
  2788         @Override
       
  2789         public Element asElement() {
       
  2790             return CoreReflectionFactory.createMirror(getSource());
       
  2791         }
       
  2792 
       
  2793         abstract boolean isSameType(DeclaredType other);
       
  2794 
       
  2795         @Override
       
  2796         TypeMirror capture() {
       
  2797             return new CaptureDeclaredType(this);
       
  2798         }
       
  2799 
       
  2800         private static class CaptureDeclaredType extends CoreReflDeclaredType {
       
  2801             CoreReflDeclaredType cap;
       
  2802             CaptureDeclaredType(CoreReflDeclaredType t) {
       
  2803                 super(t.source);
       
  2804                 this.cap = t;
       
  2805             }
       
  2806 
       
  2807             @Override
       
  2808             public List<? extends TypeMirror> getTypeArguments() {
       
  2809                 List<? extends TypeMirror> wrapped = cap.getTypeArguments();
       
  2810                 ArrayList<TypeMirror> res = new ArrayList<>(wrapped.size());
       
  2811                 res.ensureCapacity(wrapped.size());
       
  2812 
       
  2813                 for (int i = 0; i < wrapped.size(); i++) {
       
  2814                     TypeMirror t = wrapped.get(i);
       
  2815 
       
  2816                     if (t instanceof javax.lang.model.type.WildcardType) {
       
  2817                         res.add(i, convert(t));
       
  2818                     } else {
       
  2819                         res.add(i, t);
       
  2820                     }
       
  2821                 }
       
  2822                 return Collections.unmodifiableList(res);
       
  2823             }
       
  2824 
       
  2825             private TypeMirror convert(TypeMirror t) {
       
  2826                 if (!(t instanceof javax.lang.model.type.WildcardType)) {
       
  2827                     throw new IllegalArgumentException();
       
  2828                 } else {
       
  2829                     javax.lang.model.type.WildcardType w = (javax.lang.model.type.WildcardType)t;
       
  2830                     return TypeFactory.typeVariableInstance(w, w.getExtendsBound(), w.getSuperBound());
       
  2831                 }
       
  2832             }
       
  2833 
       
  2834             @Override
       
  2835             public TypeMirror getEnclosingType() {
       
  2836                 return cap.getEnclosingType();
       
  2837             }
       
  2838 
       
  2839             @Override
       
  2840             List<? extends TypeMirror> directSuperTypes() {
       
  2841                 return cap.directSuperTypes();
       
  2842             }
       
  2843 
       
  2844             @Override
       
  2845             boolean isSameType(DeclaredType other) {
       
  2846                 return other == this;
       
  2847             }
       
  2848 
       
  2849             @Override
       
  2850             public String toString() {
       
  2851                 return " CAPTURE of: " + cap.toString();
       
  2852             }
       
  2853         }
       
  2854 
       
  2855         private static class RawDeclaredType extends CoreReflDeclaredType
       
  2856             implements Reifiable {
       
  2857             private RawDeclaredType(Class<?> source) {
       
  2858                 super(source);
       
  2859             }
       
  2860 
       
  2861             @Override
       
  2862             public Class<?> getSource() {
       
  2863                 return super.getSource();
       
  2864             }
       
  2865 
       
  2866             @Override
       
  2867             public TypeMirror getEnclosingType() {
       
  2868                 Class<?> enclosing = getSource().getEnclosingClass();
       
  2869                 if (null == enclosing) {
       
  2870                     return NoType.getNoneInstance();
       
  2871                 } else {
       
  2872                     return TypeFactory.instance(enclosing);
       
  2873                 }
       
  2874             }
       
  2875 
       
  2876             @Override
       
  2877             public List<? extends TypeMirror> getTypeArguments() {
       
  2878                 return Collections.emptyList();
       
  2879             }
       
  2880 
       
  2881             @Override
       
  2882             List<? extends TypeMirror> directSuperTypes() {
       
  2883                 if (getSource().isEnum()) {
       
  2884                     return enumSuper();
       
  2885                 }
       
  2886 
       
  2887                 if (getSource() == java.lang.Object.class) {
       
  2888                     return Collections.emptyList();
       
  2889                 }
       
  2890                 List<TypeMirror> res = new ArrayList<>();
       
  2891                 Type[] superInterfaces = getSource().getInterfaces();
       
  2892                 if (!getSource().isInterface()) {
       
  2893                     res.add(TypeFactory.instance(getSource().getSuperclass()));
       
  2894                 } else if (superInterfaces.length == 0) {
       
  2895                     // Interfaces that don't extend another interface
       
  2896                     // have java.lang.Object as a direct supertype.
       
  2897                     return Collections.unmodifiableList(Arrays.asList(TypeFactory.instance(java.lang.Object.class)));
       
  2898                 }
       
  2899 
       
  2900                 for (Type t : superInterfaces) {
       
  2901                     res.add(TypeFactory.instance(t));
       
  2902                 }
       
  2903                 return Collections.unmodifiableList(res);
       
  2904             }
       
  2905 
       
  2906             private List<? extends TypeMirror> enumSuper() {
       
  2907                 Class<?> rawSuper = getSource().getSuperclass();
       
  2908                 Type[] actualArgs = ((ParameterizedTypeImpl)getSource().getGenericSuperclass()).getActualTypeArguments();
       
  2909 
       
  2910                 // Reconsider this : assume the problem is making
       
  2911                 // Enum<MyEnum> rather than just a raw enum.
       
  2912                 return Collections.unmodifiableList(Arrays.asList(TypeFactory.instance(ParameterizedTypeImpl.make(rawSuper,
       
  2913                                                                                                                   Arrays.copyOf(actualArgs,
       
  2914                                                                                                                                 actualArgs.length),
       
  2915                                                                                                                   null))));
       
  2916             }
       
  2917 
       
  2918             @Override
       
  2919             boolean isSameType(DeclaredType other) {
       
  2920                 if (other instanceof RawDeclaredType) {
       
  2921                     return Objects.equals(getSource(), ((RawDeclaredType)other).getSource());
       
  2922                 } else {
       
  2923                     return false;
       
  2924                 }
       
  2925             }
       
  2926 
       
  2927             @Override
       
  2928             public String toString() {
       
  2929                 return getSource().toString();
       
  2930             }
       
  2931         }
       
  2932 
       
  2933         private static class ParameterizedDeclaredType extends CoreReflDeclaredType {
       
  2934             private ParameterizedType genericSource = null;
       
  2935             private ParameterizedDeclaredType(Class<?> source, ParameterizedType genericSource) {
       
  2936                 super(source);
       
  2937                 this.genericSource = genericSource;
       
  2938             }
       
  2939 
       
  2940             @Override
       
  2941             public TypeMirror getEnclosingType() {
       
  2942                 Type me = genericSource;
       
  2943                 Type owner = GenericTypes.getEnclosingType(me);
       
  2944                 if (owner == null) {
       
  2945                     return NoType.getNoneInstance();
       
  2946                 }
       
  2947                 return TypeFactory.instance(owner);
       
  2948             }
       
  2949 
       
  2950             @Override
       
  2951             public List<? extends TypeMirror> getTypeArguments() {
       
  2952                 Type[] typeArgs = genericSource.getActualTypeArguments();
       
  2953 
       
  2954                 int length = typeArgs.length;
       
  2955                 if (length == 0)
       
  2956                     return Collections.emptyList();
       
  2957                 else {
       
  2958                     List<TypeMirror> tmp = new ArrayList<>(length);
       
  2959                     for (Type t : typeArgs) {
       
  2960                         tmp.add(TypeFactory.instance(t));
       
  2961                     }
       
  2962                     return Collections.unmodifiableList(tmp);
       
  2963                 }
       
  2964             }
       
  2965 
       
  2966             @Override
       
  2967             List<? extends TypeMirror> directSuperTypes() {
       
  2968                 if (getSource() == java.lang.Object.class) {
       
  2969                     return Collections.emptyList();
       
  2970                 }
       
  2971 
       
  2972                 List<TypeMirror> res = new ArrayList<>();
       
  2973                 Type[] superInterfaces = getSource().getGenericInterfaces();
       
  2974                 if (!getSource().isInterface()) {
       
  2975                     // Replace actual type arguments with our type arguments
       
  2976                     res.add(TypeFactory.instance(substituteTypeArgs(getSource().getGenericSuperclass())));
       
  2977                 } else if (superInterfaces.length == 0) {
       
  2978                     // Interfaces that don't extend another interface
       
  2979                     // have java.lang.Object as a direct supertype, plus
       
  2980                     // possibly the interface's raw type
       
  2981                     res.add(TypeFactory.instance(java.lang.Object.class));
       
  2982                 }
       
  2983 
       
  2984                 for (Type t : superInterfaces) {
       
  2985                     res.add(TypeFactory.instance(substituteTypeArgs(t)));
       
  2986                 }
       
  2987 
       
  2988                 res.add(TypeFactory.instance(getSource())); // Add raw type
       
  2989                 return Collections.unmodifiableList(res);
       
  2990             }
       
  2991 
       
  2992             private Type substituteTypeArgs(Type type) {
       
  2993                 if (!(type instanceof ParameterizedType)) {
       
  2994                     return type;
       
  2995                 }
       
  2996 
       
  2997                 ParameterizedType target = (ParameterizedType)type;
       
  2998                 // Cast to get a Class instead of a plain type.
       
  2999                 Class<?> raw = ((ParameterizedTypeImpl)target).getRawType();
       
  3000                 Type[] actualArgs = genericSource.getActualTypeArguments();
       
  3001 
       
  3002                 return  ParameterizedTypeImpl.make(raw, Arrays.copyOf(actualArgs, actualArgs.length), null);
       
  3003             }
       
  3004 
       
  3005             @Override
       
  3006             boolean isSameType(DeclaredType other) {
       
  3007                 if (other instanceof ParameterizedDeclaredType) {
       
  3008                     return GenericTypes.isSameGenericType(genericSource,
       
  3009                                                           ((ParameterizedDeclaredType)other).genericSource);
       
  3010                 } else {
       
  3011                     return false;
       
  3012                 }
       
  3013             }
       
  3014 
       
  3015             @Override
       
  3016             public String toString() {
       
  3017                 return getKind().toString() + " " + genericSource.toString();
       
  3018             }
       
  3019         }
       
  3020 
       
  3021         /**
       
  3022          * Implementing class for ParameterizedType interface.
       
  3023          * Derived from sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
       
  3024          */
       
  3025 
       
  3026         private static class ParameterizedTypeImpl implements ParameterizedType {
       
  3027             private Type[] actualTypeArguments;
       
  3028             private Class<?>  rawType;
       
  3029             private Type   ownerType;
       
  3030 
       
  3031             private ParameterizedTypeImpl(Class<?> rawType,
       
  3032                                           Type[] actualTypeArguments,
       
  3033                                           Type ownerType) {
       
  3034                 this.actualTypeArguments = actualTypeArguments;
       
  3035                 this.rawType             = rawType;
       
  3036                 if (ownerType != null) {
       
  3037                     this.ownerType = ownerType;
       
  3038                 } else {
       
  3039                     this.ownerType = rawType.getDeclaringClass();
       
  3040                 }
       
  3041                 validateConstructorArguments();
       
  3042             }
       
  3043 
       
  3044             private void validateConstructorArguments() {
       
  3045                 java.lang.reflect.TypeVariable/*<?>*/[] formals = rawType.getTypeParameters();
       
  3046                 // check correct arity of actual type args
       
  3047                 if (formals.length != actualTypeArguments.length){
       
  3048                     throw new MalformedParameterizedTypeException();
       
  3049                 }
       
  3050             }
       
  3051 
       
  3052             /**
       
  3053              * Static factory. Given a (generic) class, actual type arguments
       
  3054              * and an owner type, creates a parameterized type.
       
  3055              * This class can be instantiated with a a raw type that does not
       
  3056              * represent a generic type, provided the list of actual type
       
  3057              * arguments is empty.
       
  3058              * If the ownerType argument is null, the declaring class of the
       
  3059              * raw type is used as the owner type.
       
  3060              * <p> This method throws a MalformedParameterizedTypeException
       
  3061              * under the following circumstances:
       
  3062              * If the number of actual type arguments (i.e., the size of the
       
  3063              * array {@code typeArgs}) does not correspond to the number of
       
  3064              * formal type arguments.
       
  3065              * If any of the actual type arguments is not an instance of the
       
  3066              * bounds on the corresponding formal.
       
  3067              * @param rawType the Class representing the generic type declaration being
       
  3068              * instantiated
       
  3069              * @param actualTypeArguments - a (possibly empty) array of types
       
  3070              * representing the actual type arguments to the parameterized type
       
  3071              * @param ownerType - the enclosing type, if known.
       
  3072              * @return An instance of {@code ParameterizedType}
       
  3073              * @throws MalformedParameterizedTypeException - if the instantiation
       
  3074              * is invalid
       
  3075              */
       
  3076             public static ParameterizedTypeImpl make(Class<?> rawType,
       
  3077                                                      Type[] actualTypeArguments,
       
  3078                                                      Type ownerType) {
       
  3079                 return new ParameterizedTypeImpl(rawType, actualTypeArguments,
       
  3080                                                  ownerType);
       
  3081             }
       
  3082 
       
  3083 
       
  3084             /**
       
  3085              * Returns an array of {@code Type} objects representing the actual type
       
  3086              * arguments to this type.
       
  3087              *
       
  3088              * <p>Note that in some cases, the returned array be empty. This can occur
       
  3089              * if this type represents a non-parameterized type nested within
       
  3090              * a parameterized type.
       
  3091              *
       
  3092              * @return an array of {@code Type} objects representing the actual type
       
  3093              *     arguments to this type
       
  3094              * @throws {@code TypeNotPresentException} if any of the
       
  3095              *     actual type arguments refers to a non-existent type declaration
       
  3096              * @throws {@code MalformedParameterizedTypeException} if any of the
       
  3097              *     actual type parameters refer to a parameterized type that cannot
       
  3098              *     be instantiated for any reason
       
  3099              * @since 1.5
       
  3100              */
       
  3101             public Type[] getActualTypeArguments() {
       
  3102                 return actualTypeArguments.clone();
       
  3103             }
       
  3104 
       
  3105             /**
       
  3106              * Returns the {@code Type} object representing the class or interface
       
  3107              * that declared this type.
       
  3108              *
       
  3109              * @return the {@code Type} object representing the class or interface
       
  3110              *     that declared this type
       
  3111              */
       
  3112             public Class<?> getRawType() {
       
  3113                 return rawType;
       
  3114             }
       
  3115 
       
  3116 
       
  3117             /**
       
  3118              * Returns a {@code Type} object representing the type that this type
       
  3119              * is a member of.  For example, if this type is {@code O<T>.I<S>},
       
  3120              * return a representation of {@code O<T>}.
       
  3121              *
       
  3122              * <p>If this type is a top-level type, {@code null} is returned.
       
  3123              *
       
  3124              * @return a {@code Type} object representing the type that
       
  3125              *     this type is a member of. If this type is a top-level type,
       
  3126              *     {@code null} is returned
       
  3127              */
       
  3128             public Type getOwnerType() {
       
  3129                 return ownerType;
       
  3130             }
       
  3131 
       
  3132             /*
       
  3133              * From the JavaDoc for java.lang.reflect.ParameterizedType
       
  3134              * "Instances of classes that implement this interface must
       
  3135              * implement an equals() method that equates any two instances
       
  3136              * that share the same generic type declaration and have equal
       
  3137              * type parameters."
       
  3138              */
       
  3139             @Override
       
  3140             public boolean equals(Object o) {
       
  3141                 if (o instanceof ParameterizedType) {
       
  3142                     // Check that information is equivalent
       
  3143                     ParameterizedType that = (ParameterizedType) o;
       
  3144 
       
  3145                     if (this == that)
       
  3146                         return true;
       
  3147 
       
  3148                     Type thatOwner   = that.getOwnerType();
       
  3149                     Type thatRawType = that.getRawType();
       
  3150 
       
  3151                     return Objects.equals(ownerType, thatOwner) &&
       
  3152                         Objects.equals(rawType, thatRawType) &&
       
  3153                         Arrays.equals(actualTypeArguments, // avoid clone
       
  3154                                       that.getActualTypeArguments());
       
  3155                 } else
       
  3156                     return false;
       
  3157             }
       
  3158 
       
  3159             @Override
       
  3160             public int hashCode() {
       
  3161                 return
       
  3162                     Arrays.hashCode(actualTypeArguments) ^
       
  3163                     Objects.hashCode(ownerType) ^
       
  3164                     Objects.hashCode(rawType);
       
  3165             }
       
  3166 
       
  3167             public String toString() {
       
  3168                 StringBuilder sb = new StringBuilder();
       
  3169 
       
  3170                 if (ownerType != null) {
       
  3171                     if (ownerType instanceof Class)
       
  3172                         sb.append(((Class)ownerType).getName());
       
  3173                     else
       
  3174                         sb.append(ownerType.toString());
       
  3175 
       
  3176                     sb.append(".");
       
  3177 
       
  3178                     if (ownerType instanceof ParameterizedTypeImpl) {
       
  3179                         // Find simple name of nested type by removing the
       
  3180                         // shared prefix with owner.
       
  3181                         sb.append(rawType.getName().replace( ((ParameterizedTypeImpl)ownerType).rawType.getName() + "$",
       
  3182                                                              ""));
       
  3183                     } else
       
  3184                         sb.append(rawType.getName());
       
  3185                 } else
       
  3186                     sb.append(rawType.getName());
       
  3187 
       
  3188                 if (actualTypeArguments != null &&
       
  3189                     actualTypeArguments.length > 0) {
       
  3190                     sb.append("<");
       
  3191                     boolean first = true;
       
  3192                     for (Type t: actualTypeArguments) {
       
  3193                         if (!first)
       
  3194                             sb.append(", ");
       
  3195                         if (t instanceof Class)
       
  3196                             sb.append(((Class)t).getName());
       
  3197                         else
       
  3198                             sb.append(t.toString());
       
  3199                         first = false;
       
  3200                     }
       
  3201                     sb.append(">");
       
  3202                 }
       
  3203 
       
  3204                 return sb.toString();
       
  3205             }
       
  3206         }
       
  3207 
       
  3208     }
       
  3209 
       
  3210     private static class ErasedMethodType extends ExecutableMethodType implements javax.lang.model.type.ExecutableType {
       
  3211         private final Method m;
       
  3212 
       
  3213         ErasedMethodType(Method m) {
       
  3214             super(m);
       
  3215             this.m = Objects.requireNonNull(m);
       
  3216         }
       
  3217 
       
  3218         @Override
       
  3219         public List<javax.lang.model.type.TypeVariable> getTypeVariables() {
       
  3220             return Collections.emptyList();
       
  3221         }
       
  3222 
       
  3223         @Override
       
  3224         public List<? extends TypeMirror> getThrownTypes() {
       
  3225             Class<?>[] exceptions = m.getExceptionTypes();
       
  3226             int len = exceptions.length;
       
  3227 
       
  3228             if (len > 0) {
       
  3229                 List<TypeMirror> res = new ArrayList<TypeMirror>(len);
       
  3230                 for (Class<?> t : exceptions) {
       
  3231                     res.add(TypeFactory.instance(t));
       
  3232                 }
       
  3233                 return Collections.unmodifiableList(res);
       
  3234             } else {
       
  3235                 List<TypeMirror> ret = Collections.emptyList();
       
  3236                 return ret;
       
  3237             }
       
  3238         }
       
  3239 
       
  3240         @Override
       
  3241         public List<? extends TypeMirror> getParameterTypes() {
       
  3242             Class<?>[] params = m.getParameterTypes();
       
  3243             int len = params.length;
       
  3244 
       
  3245             if (len > 0) {
       
  3246                 List<TypeMirror> res = new ArrayList<TypeMirror>(len);
       
  3247                 for (Class<?> t : params) {
       
  3248                     res.add(TypeFactory.instance(t));
       
  3249                 }
       
  3250                 return Collections.unmodifiableList(res);
       
  3251             } else {
       
  3252                 List<TypeMirror> ret = Collections.emptyList();
       
  3253                 return ret;
       
  3254             }
       
  3255         }
       
  3256 
       
  3257         @Override
       
  3258         public TypeMirror getReturnType() {
       
  3259             return TypeFactory.instance(m.getReturnType());
       
  3260         }
       
  3261 
       
  3262         @Override
       
  3263         TypeMirror erasure() {
       
  3264             return this;
       
  3265         }
       
  3266     }
       
  3267 
       
  3268     private static class ErrorType extends AbstractTypeMirror implements javax.lang.model.type.ErrorType {
       
  3269         private static ErrorType errorType = new ErrorType();
       
  3270 
       
  3271         public static ErrorType getErrorInstance() {
       
  3272             return errorType;
       
  3273         }
       
  3274 
       
  3275         private ErrorType() {
       
  3276             super(TypeKind.ERROR);
       
  3277         }
       
  3278 
       
  3279         @Override
       
  3280         public List<? extends TypeMirror> getTypeArguments() {
       
  3281             throw new UnsupportedOperationException();
       
  3282         }
       
  3283 
       
  3284         @Override
       
  3285         public TypeMirror getEnclosingType() {
       
  3286             throw new UnsupportedOperationException();
       
  3287         }
       
  3288 
       
  3289         @Override
       
  3290         public Element asElement() {
       
  3291             throw new UnsupportedOperationException();
       
  3292         }
       
  3293 
       
  3294         @Override
       
  3295         List<? extends TypeMirror> directSuperTypes() {
       
  3296             throw new UnsupportedOperationException();
       
  3297         }
       
  3298     }
       
  3299 
       
  3300     private static class ExecutableMethodType extends AbstractTypeMirror
       
  3301         implements javax.lang.model.type.ExecutableType {
       
  3302         private final Method m;
       
  3303 
       
  3304         ExecutableMethodType(Method m) {
       
  3305             super(TypeKind.EXECUTABLE);
       
  3306             this.m = Objects.requireNonNull(m);
       
  3307         }
       
  3308 
       
  3309         @Override
       
  3310         public List<? extends TypeMirror> getThrownTypes() {
       
  3311             Type[] exceptions = m.getGenericExceptionTypes();
       
  3312             int len = exceptions.length;
       
  3313 
       
  3314             if (len > 0) {
       
  3315                 List<TypeMirror> res = new ArrayList<TypeMirror>(len);
       
  3316                 for (Type t : exceptions) {
       
  3317                     res.add(TypeFactory.instance(t));
       
  3318                 }
       
  3319                 return Collections.unmodifiableList(res);
       
  3320             } else {
       
  3321                 List<TypeMirror> ret = Collections.emptyList();
       
  3322                 return ret;
       
  3323             }
       
  3324         }
       
  3325 
       
  3326         @Override
       
  3327         public List<javax.lang.model.type.TypeVariable> getTypeVariables() {
       
  3328             java.lang.reflect.TypeVariable[] variables = m.getTypeParameters();
       
  3329             int len = variables.length;
       
  3330 
       
  3331             if (len > 0) {
       
  3332                 List<javax.lang.model.type.TypeVariable> res = new ArrayList<>(len);
       
  3333                 for (java.lang.reflect.TypeVariable<?> t : variables) {
       
  3334                     res.add(TypeFactory.typeVariableInstance(t));
       
  3335                 }
       
  3336                 return Collections.unmodifiableList(res);
       
  3337             } else {
       
  3338                 return Collections.emptyList();
       
  3339             }
       
  3340         }
       
  3341 
       
  3342         @Override
       
  3343         public TypeMirror getReturnType() {
       
  3344             return TypeFactory.instance(m.getGenericReturnType());
       
  3345         }
       
  3346 
       
  3347         @Override
       
  3348         public List<? extends TypeMirror> getParameterTypes() {
       
  3349             Type[] params = m.getGenericParameterTypes();
       
  3350             int len = params.length;
       
  3351 
       
  3352             if (len > 0) {
       
  3353                 List<TypeMirror> res = new ArrayList<TypeMirror>(len);
       
  3354                 for (Type t : params) {
       
  3355                     res.add(TypeFactory.instance(t));
       
  3356                 }
       
  3357                 return Collections.unmodifiableList(res);
       
  3358             } else {
       
  3359                 return Collections.emptyList();
       
  3360             }
       
  3361         }
       
  3362 
       
  3363         @Override
       
  3364         List<? extends TypeMirror> directSuperTypes() {
       
  3365             // Spec says we don't need this
       
  3366             throw new UnsupportedOperationException();
       
  3367         }
       
  3368 
       
  3369         @Override
       
  3370         TypeMirror erasure() {
       
  3371             return new ErasedMethodType(m);
       
  3372         }
       
  3373 
       
  3374         @Override
       
  3375         public TypeMirror getReceiverType() {
       
  3376             throw new UnsupportedOperationException();
       
  3377         }
       
  3378 
       
  3379         boolean sameSignature(ExecutableMethodType other){
       
  3380             if (!m.getName().equals(other.m.getName())) {
       
  3381                 return false;
       
  3382             }
       
  3383 
       
  3384             List<? extends TypeMirror> thisParams = getParameterTypes();
       
  3385             List<? extends TypeMirror> otherParams = other.getParameterTypes();
       
  3386             if (thisParams.size() != otherParams.size()) {
       
  3387                 return false;
       
  3388             }
       
  3389             for (int i = 0; i < thisParams.size(); i++) {
       
  3390                 if (!CoreReflTypes.instance().isSameType(thisParams.get(i), otherParams.get(i))) {
       
  3391                     return false;
       
  3392                 }
       
  3393             }
       
  3394             return true;
       
  3395         }
       
  3396     }
       
  3397 
       
  3398     private static class GenericTypes {
       
  3399         public static boolean isSameGenericType(Type t1, Type t2) {
       
  3400             if (t1 instanceof Class) {
       
  3401                 return ((Class)t1).equals(t2);
       
  3402             } else if (t1 instanceof ParameterizedType) {
       
  3403                 return ((ParameterizedType)t1).equals(t2);
       
  3404             }
       
  3405             throw new UnsupportedOperationException();
       
  3406         }
       
  3407 
       
  3408         public static Type getEnclosingType(Type t1) {
       
  3409             if (t1 instanceof Class) {
       
  3410                 return ((Class)t1).getEnclosingClass();
       
  3411             } else if (t1 instanceof ParameterizedType) {
       
  3412                 return ((ParameterizedType)t1).getOwnerType();
       
  3413             }
       
  3414             throw new UnsupportedOperationException();
       
  3415         }
       
  3416     }
       
  3417 
       
  3418     private static class IntersectionDeclaredType extends AbstractTypeMirror
       
  3419         implements javax.lang.model.type.DeclaredType {
       
  3420         private Type[] sources = null;
       
  3421 
       
  3422         IntersectionDeclaredType(Type[] sources) {
       
  3423             super(TypeKind.DECLARED);
       
  3424             this.sources = Arrays.copyOf(Objects.requireNonNull(sources),
       
  3425                                          sources.length);
       
  3426         }
       
  3427 
       
  3428         @Override
       
  3429         public TypeMirror getEnclosingType() {
       
  3430             return NoType.getNoneInstance();
       
  3431         }
       
  3432 
       
  3433         @Override
       
  3434         public  Element asElement() {
       
  3435             throw new UnsupportedOperationException();
       
  3436         }
       
  3437 
       
  3438         @Override
       
  3439         public List<? extends TypeMirror> getTypeArguments() {
       
  3440             throw new UnsupportedOperationException();
       
  3441         }
       
  3442 
       
  3443         @Override
       
  3444         List<? extends TypeMirror> directSuperTypes() {
       
  3445             int len = sources.length;
       
  3446 
       
  3447             if (len > 0) {
       
  3448                 List<TypeMirror> res = new ArrayList<TypeMirror>(len);
       
  3449                 for (Type c : sources) {
       
  3450                     res.add(TypeFactory.instance(c));
       
  3451                 }
       
  3452                 return Collections.unmodifiableList(res);
       
  3453             } else {
       
  3454                 return Collections.emptyList();
       
  3455             }
       
  3456         }
       
  3457     }
       
  3458 
       
  3459     private static class ModelWildcardType extends AbstractTypeMirror
       
  3460         implements javax.lang.model.type.WildcardType {
       
  3461         private java.lang.reflect.WildcardType genericSource;
       
  3462 
       
  3463         ModelWildcardType(java.lang.reflect.WildcardType genericSource) {
       
  3464             super(TypeKind.WILDCARD);
       
  3465             this.genericSource = Objects.requireNonNull(genericSource);
       
  3466         }
       
  3467 
       
  3468         @Override
       
  3469         List<? extends TypeMirror> directSuperTypes() {
       
  3470             // TODO Add support for this operation
       
  3471             throw new UnsupportedOperationException();
       
  3472         }
       
  3473 
       
  3474         @Override
       
  3475         public TypeMirror getExtendsBound() {
       
  3476             Type[] t = genericSource.getUpperBounds();
       
  3477 
       
  3478             if (t.length == 1) {
       
  3479                 if (t[0].equals(Object.class) && getSuperBound() != null) { // can't have both lower and upper explicit
       
  3480                     return null;
       
  3481                 }
       
  3482                 return TypeFactory.instance(t[0]);
       
  3483             }
       
  3484             throw new UnsupportedOperationException(); // TODO: intersection type?
       
  3485         }
       
  3486 
       
  3487         @Override
       
  3488         public TypeMirror getSuperBound() {
       
  3489             Type[] t = genericSource.getLowerBounds();
       
  3490 
       
  3491             if (t.length == 0) { // bound is null
       
  3492                 return null;
       
  3493             } else if (t.length == 1) {
       
  3494                 return TypeFactory.instance(t[0]);
       
  3495             }
       
  3496             throw new UnsupportedOperationException(); // TODO: intersection type?
       
  3497         }
       
  3498 
       
  3499         @Override
       
  3500         public String toString() {
       
  3501             return getKind() + " " + genericSource.toString();
       
  3502         }
       
  3503     }
       
  3504 
       
  3505     private static class NoType extends AbstractTypeMirror
       
  3506         implements javax.lang.model.type.NoType {
       
  3507         private static NoType noneType = new NoType(TypeKind.NONE, "none");
       
  3508         private static NoType packageType = new NoType(TypeKind.PACKAGE, "package");
       
  3509         private static NoType voidType = new NoType(TypeKind.VOID, "void");
       
  3510 
       
  3511         private String str;
       
  3512 
       
  3513         public static NoType getNoneInstance() {
       
  3514             return noneType;
       
  3515         }
       
  3516 
       
  3517         public static NoType getPackageInstance() {
       
  3518             return packageType;
       
  3519         }
       
  3520 
       
  3521         public static NoType getVoidInstance() {
       
  3522             return voidType;
       
  3523         }
       
  3524 
       
  3525         private NoType(TypeKind k, String str) {
       
  3526             super(k);
       
  3527             this.str = str;
       
  3528         }
       
  3529 
       
  3530         @Override
       
  3531         List<? extends TypeMirror> directSuperTypes() {
       
  3532             // TODO We don't need this for the Package instance, how about the others?
       
  3533             throw new UnsupportedOperationException();
       
  3534         }
       
  3535 
       
  3536         @Override
       
  3537         public String toString() {
       
  3538             return str;
       
  3539         }
       
  3540     }
       
  3541 
       
  3542     private static class CoreReflNullType extends AbstractTypeMirror
       
  3543         implements javax.lang.model.type.NullType {
       
  3544         private static CoreReflNullType nullType = new CoreReflNullType();
       
  3545 
       
  3546         public static NullType getInstance() {
       
  3547             return nullType;
       
  3548         }
       
  3549 
       
  3550         private CoreReflNullType() {
       
  3551             super(TypeKind.NULL);
       
  3552         }
       
  3553 
       
  3554         @Override
       
  3555         List<? extends TypeMirror> directSuperTypes() {
       
  3556             // JLS 4.10.2 says:
       
  3557             // "The direct supertypes of the null type are all reference types other than the null type itself."
       
  3558             // TODO return null? an empty list? the error type? anyhow fix this
       
  3559             throw new UnsupportedOperationException();
       
  3560         }
       
  3561     }
       
  3562 
       
  3563     private static interface Reifiable {
       
  3564         Class<?> getSource();
       
  3565     }
       
  3566 
       
  3567     private static class PrimitiveType extends AbstractTypeMirror
       
  3568         implements javax.lang.model.type.PrimitiveType,
       
  3569                    Reifiable {
       
  3570         private Class<?> source;
       
  3571 
       
  3572         private static PrimitiveType booleanInstance = new PrimitiveType(TypeKind.BOOLEAN, boolean.class);
       
  3573         private static PrimitiveType byteInstance =    new PrimitiveType(TypeKind.BYTE, byte.class);
       
  3574         private static PrimitiveType charInstance =    new PrimitiveType(TypeKind.CHAR, char.class);
       
  3575         private static PrimitiveType shortInstance =   new PrimitiveType(TypeKind.SHORT, short.class);
       
  3576         private static PrimitiveType intInstance =     new PrimitiveType(TypeKind.INT, int.class);
       
  3577         private static PrimitiveType longInstance =    new PrimitiveType(TypeKind.LONG, long.class);
       
  3578         private static PrimitiveType floatInstance =   new PrimitiveType(TypeKind.FLOAT, float.class);
       
  3579         private static PrimitiveType doubleInstance =  new PrimitiveType(TypeKind.DOUBLE, double.class);
       
  3580 
       
  3581         private PrimitiveType(TypeKind kind, Class<?> source) {
       
  3582             super(kind);
       
  3583             this.source = source;
       
  3584         }
       
  3585 
       
  3586         @Override
       
  3587         public Class<?> getSource() {
       
  3588             return source;
       
  3589         }
       
  3590 
       
  3591         static PrimitiveType instance(Class<?> c) {
       
  3592             switch(c.getName()) {
       
  3593             case "boolean":
       
  3594                 return booleanInstance;
       
  3595             case "byte":
       
  3596                 return byteInstance;
       
  3597             case "char":
       
  3598                 return charInstance;
       
  3599             case "short":
       
  3600                 return shortInstance;
       
  3601             case "int":
       
  3602                 return intInstance;
       
  3603             case "long":
       
  3604                 return longInstance;
       
  3605             case "float":
       
  3606                 return floatInstance;
       
  3607             case "double":
       
  3608                 return doubleInstance;
       
  3609             default:
       
  3610                 throw new IllegalArgumentException();
       
  3611             }
       
  3612         }
       
  3613 
       
  3614         static PrimitiveType instance(TypeKind k) {
       
  3615             switch(k) {
       
  3616             case BOOLEAN:
       
  3617                 return booleanInstance;
       
  3618             case BYTE:
       
  3619                 return byteInstance;
       
  3620             case CHAR:
       
  3621                 return charInstance;
       
  3622             case SHORT:
       
  3623                 return shortInstance;
       
  3624             case INT:
       
  3625                 return intInstance;
       
  3626             case LONG:
       
  3627                 return longInstance;
       
  3628             case FLOAT:
       
  3629                 return floatInstance;
       
  3630             case DOUBLE:
       
  3631                 return doubleInstance;
       
  3632             default:
       
  3633                 throw new IllegalArgumentException();
       
  3634             }
       
  3635         }
       
  3636 
       
  3637         @Override
       
  3638         public String toString() {
       
  3639             return source.getName();
       
  3640         }
       
  3641 
       
  3642         //Types methods
       
  3643         @Override
       
  3644         List<? extends TypeMirror> directSuperTypes() {
       
  3645             switch (getKind()) {
       
  3646             case DOUBLE:
       
  3647                 return Collections.emptyList();
       
  3648             case FLOAT:
       
  3649                 return Arrays.asList(doubleInstance);
       
  3650             case LONG:
       
  3651                 return Arrays.asList(floatInstance);
       
  3652             case INT:
       
  3653                 return Arrays.asList(longInstance);
       
  3654             case CHAR:
       
  3655                 return Arrays.asList(intInstance);
       
  3656             case SHORT:
       
  3657                 return Arrays.asList(intInstance);
       
  3658             case BYTE:
       
  3659                 return Arrays.asList(shortInstance);
       
  3660             default:
       
  3661                 return Collections.emptyList();
       
  3662             }
       
  3663         }
       
  3664     }
       
  3665 
       
  3666     private static class TypeFactory {
       
  3667         private TypeFactory() { }// no instances for you
       
  3668 
       
  3669         public static TypeMirror instance(Class<?> c) {
       
  3670             if (c.isPrimitive()) {
       
  3671                 if (c.getName().equals("void")) {
       
  3672                     return NoType.getVoidInstance();
       
  3673                 } else {
       
  3674                     return PrimitiveType.instance(c);
       
  3675                 }
       
  3676             } else if (c.isArray()) {
       
  3677                 return new CoreReflArrayType(c);
       
  3678             } else if (c.isAnonymousClass() ||
       
  3679                        c.isLocalClass() ||
       
  3680                        c.isMemberClass() ||
       
  3681                        c.isInterface() || // covers annotations
       
  3682                        c.isEnum()) {
       
  3683                 return CoreReflDeclaredType.instance(c);
       
  3684             } else { // plain old class ??
       
  3685                 return CoreReflDeclaredType.instance(c);
       
  3686             }
       
  3687         }
       
  3688 
       
  3689         public static TypeMirror instance(Type t) {
       
  3690             if (t instanceof Class) {
       
  3691                 return instance((Class)t);
       
  3692             } else if (t instanceof ParameterizedType) {
       
  3693                 ParameterizedType tmp = (ParameterizedType)t;
       
  3694                 Type raw = tmp.getRawType();
       
  3695                 if (!(raw instanceof Class)) {
       
  3696                     throw new IllegalArgumentException(t + " " + raw );
       
  3697                 }
       
  3698                 return CoreReflDeclaredType.instance((Class)raw, tmp);
       
  3699             } else if (t instanceof java.lang.reflect.WildcardType) {
       
  3700                 return new ModelWildcardType((java.lang.reflect.WildcardType)t);
       
  3701             } else if (t instanceof java.lang.reflect.TypeVariable) {
       
  3702             return new CoreReflTypeVariable((java.lang.reflect.TypeVariable)t);
       
  3703             }
       
  3704             throw new IllegalArgumentException("Don't know how to make instance from: " + t.getClass());
       
  3705         }
       
  3706 
       
  3707         public static TypeMirror instance(Field f) {
       
  3708             return CoreReflDeclaredType.instance(f.getType(), f.getGenericType());
       
  3709         }
       
  3710 
       
  3711         public static ExecutableType instance(Method m) {
       
  3712             return new ExecutableMethodType(m);
       
  3713         }
       
  3714 
       
  3715         public static javax.lang.model.type.TypeVariable typeVariableInstance(java.lang.reflect.TypeVariable<?> v) {
       
  3716             return new CoreReflTypeVariable(v);
       
  3717         }
       
  3718 
       
  3719         public static javax.lang.model.type.TypeVariable typeVariableInstance(TypeMirror source,
       
  3720                                                         TypeMirror upperBound,
       
  3721                                                         TypeMirror lowerBound) {
       
  3722             return new CaptureTypeVariable(source, upperBound, lowerBound);
       
  3723         }
       
  3724     }
       
  3725 
       
  3726     private static class CoreReflTypeVariable extends AbstractTypeMirror
       
  3727         implements javax.lang.model.type.TypeVariable {
       
  3728         private final java.lang.reflect.TypeVariable<?> source;
       
  3729         private boolean isCapture = false;
       
  3730 
       
  3731         protected CoreReflTypeVariable(java.lang.reflect.TypeVariable<?> source) {
       
  3732             super(TypeKind.TYPEVAR);
       
  3733             Objects.requireNonNull(source);
       
  3734             this.source = source;
       
  3735         }
       
  3736 
       
  3737         @Override
       
  3738         public TypeMirror getUpperBound() {
       
  3739             return new IntersectionDeclaredType(source.getBounds());
       
  3740         }
       
  3741 
       
  3742         @Override
       
  3743         public TypeMirror getLowerBound() {
       
  3744             return CoreReflTypes.instance().getNullType();
       
  3745         }
       
  3746 
       
  3747         @Override
       
  3748         public Element asElement() {
       
  3749             return CoreReflectionFactory.createMirror(source);
       
  3750         }
       
  3751 
       
  3752         @Override
       
  3753         List<? extends TypeMirror> directSuperTypes() {
       
  3754             return ((AbstractTypeMirror)getUpperBound()).directSuperTypes();
       
  3755         }
       
  3756 
       
  3757         @Override
       
  3758         public int hashCode() {
       
  3759             return source.hashCode();
       
  3760         }
       
  3761 
       
  3762         @Override
       
  3763         public boolean equals(Object other) {
       
  3764             if (other instanceof CoreReflTypeVariable) {
       
  3765                 return this.source.equals(((CoreReflTypeVariable)other).source);
       
  3766             } else {
       
  3767                 return false;
       
  3768             }
       
  3769         }
       
  3770     }
       
  3771 }