src/share/classes/javax/lang/model/util/ElementFilter.java

Tue, 28 Dec 2010 15:54:52 -0800

author
ohair
date
Tue, 28 Dec 2010 15:54:52 -0800
changeset 798
4868a36f6fd8
parent 554
9d9f26857129
child 1357
c75be5bc5283
permissions
-rw-r--r--

6962318: Update copyright year
Reviewed-by: xdono

     1 /*
     2  * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package javax.lang.model.util;
    28 import java.lang.Iterable;
    29 import java.util.Collections;
    30 import java.util.Iterator;
    31 import java.util.List;
    32 import java.util.Set;
    33 import java.util.EnumSet;
    34 import java.util.ArrayList;
    35 import java.util.LinkedHashSet;
    36 import java.util.NoSuchElementException;
    38 import javax.lang.model.element.*;
    39 import javax.lang.model.type.*;
    42 /**
    43  * Filters for selecting just the elements of interest from a
    44  * collection of elements.  The returned sets and lists are new
    45  * collections and do use the argument as a backing store.  The
    46  * methods in this class do not make any attempts to guard against
    47  * concurrent modifications of the arguments.  The returned sets and
    48  * lists are mutable but unsafe for concurrent access.  A returned set
    49  * has the same iteration order as the argument set to a method.
    50  *
    51  * <p>If iterables and sets containing {@code null} are passed as
    52  * arguments to methods in this class, a {@code NullPointerException}
    53  * will be thrown.
    54  *
    55  * <p>Note that a <i>static import</i> statement can make the text of
    56  * calls to the methods in this class more concise; for example:
    57  *
    58  * <blockquote><pre>
    59  *     import static javax.lang.model.util.ElementFilter.*;
    60  *     ...
    61  *         {@code List<VariableElement>} fs = fieldsIn(someClass.getEnclosedElements());
    62  * </pre></blockquote>
    63  *
    64  * @author Joseph D. Darcy
    65  * @author Scott Seligman
    66  * @author Peter von der Ah&eacute;
    67  * @author Martin Buchholz
    68  * @since 1.6
    69  */
    70 public class ElementFilter {
    71     private ElementFilter() {} // Do not instantiate.
    73     private static Set<ElementKind> CONSTRUCTOR_KIND =
    74         Collections.unmodifiableSet(EnumSet.of(ElementKind.CONSTRUCTOR));
    76     private static Set<ElementKind> FIELD_KINDS =
    77         Collections.unmodifiableSet(EnumSet.of(ElementKind.FIELD,
    78                                                ElementKind.ENUM_CONSTANT));
    79     private static Set<ElementKind> METHOD_KIND =
    80         Collections.unmodifiableSet(EnumSet.of(ElementKind.METHOD));
    82     private static Set<ElementKind> PACKAGE_KIND =
    83         Collections.unmodifiableSet(EnumSet.of(ElementKind.PACKAGE));
    85     private static Set<ElementKind> TYPE_KINDS =
    86         Collections.unmodifiableSet(EnumSet.of(ElementKind.CLASS,
    87                                                ElementKind.ENUM,
    88                                                ElementKind.INTERFACE,
    89                                                ElementKind.ANNOTATION_TYPE));
    90     /**
    91      * Returns a list of fields in {@code elements}.
    92      * @return a list of fields in {@code elements}
    93      * @param elements the elements to filter
    94      */
    95     public static List<VariableElement>
    96             fieldsIn(Iterable<? extends Element> elements) {
    97         return listFilter(elements, FIELD_KINDS, VariableElement.class);
    98     }
   100     /**
   101      * Returns a set of fields in {@code elements}.
   102      * @return a set of fields in {@code elements}
   103      * @param elements the elements to filter
   104      */
   105     public static Set<VariableElement>
   106             fieldsIn(Set<? extends Element> elements) {
   107         return setFilter(elements, FIELD_KINDS, VariableElement.class);
   108     }
   110     /**
   111      * Returns a list of constructors in {@code elements}.
   112      * @return a list of constructors in {@code elements}
   113      * @param elements the elements to filter
   114      */
   115     public static List<ExecutableElement>
   116             constructorsIn(Iterable<? extends Element> elements) {
   117         return listFilter(elements, CONSTRUCTOR_KIND, ExecutableElement.class);
   118     }
   120     /**
   121      * Returns a set of constructors in {@code elements}.
   122      * @return a set of constructors in {@code elements}
   123      * @param elements the elements to filter
   124      */
   125     public static Set<ExecutableElement>
   126             constructorsIn(Set<? extends Element> elements) {
   127         return setFilter(elements, CONSTRUCTOR_KIND, ExecutableElement.class);
   128     }
   130     /**
   131      * Returns a list of methods in {@code elements}.
   132      * @return a list of methods in {@code elements}
   133      * @param elements the elements to filter
   134      */
   135     public static List<ExecutableElement>
   136             methodsIn(Iterable<? extends Element> elements) {
   137         return listFilter(elements, METHOD_KIND, ExecutableElement.class);
   138     }
   140     /**
   141      * Returns a set of methods in {@code elements}.
   142      * @return a set of methods in {@code elements}
   143      * @param elements the elements to filter
   144      */
   145     public static Set<ExecutableElement>
   146             methodsIn(Set<? extends Element> elements) {
   147         return setFilter(elements, METHOD_KIND, ExecutableElement.class);
   148     }
   150     /**
   151      * Returns a list of types in {@code elements}.
   152      * @return a list of types in {@code elements}
   153      * @param elements the elements to filter
   154      */
   155     public static List<TypeElement>
   156             typesIn(Iterable<? extends Element> elements) {
   157         return listFilter(elements, TYPE_KINDS, TypeElement.class);
   158     }
   160     /**
   161      * Returns a set of types in {@code elements}.
   162      * @return a set of types in {@code elements}
   163      * @param elements the elements to filter
   164      */
   165     public static Set<TypeElement>
   166             typesIn(Set<? extends Element> elements) {
   167         return setFilter(elements, TYPE_KINDS, TypeElement.class);
   168     }
   170     /**
   171      * Returns a list of packages in {@code elements}.
   172      * @return a list of packages in {@code elements}
   173      * @param elements the elements to filter
   174      */
   175     public static List<PackageElement>
   176             packagesIn(Iterable<? extends Element> elements) {
   177         return listFilter(elements, PACKAGE_KIND, PackageElement.class);
   178     }
   180     /**
   181      * Returns a set of packages in {@code elements}.
   182      * @return a set of packages in {@code elements}
   183      * @param elements the elements to filter
   184      */
   185     public static Set<PackageElement>
   186             packagesIn(Set<? extends Element> elements) {
   187         return setFilter(elements, PACKAGE_KIND, PackageElement.class);
   188     }
   190     // Assumes targetKinds and E are sensible.
   191     private static <E extends Element> List<E> listFilter(Iterable<? extends Element> elements,
   192                                                           Set<ElementKind> targetKinds,
   193                                                           Class<E> clazz) {
   194         List<E> list = new ArrayList<E>();
   195         for (Element e : elements) {
   196             if (targetKinds.contains(e.getKind()))
   197                 list.add(clazz.cast(e));
   198         }
   199         return list;
   200     }
   202     // Assumes targetKinds and E are sensible.
   203     private static <E extends Element> Set<E> setFilter(Set<? extends Element> elements,
   204                                                         Set<ElementKind> targetKinds,
   205                                                         Class<E> clazz) {
   206         // Return set preserving iteration order of input set.
   207         Set<E> set = new LinkedHashSet<E>();
   208         for (Element e : elements) {
   209             if (targetKinds.contains(e.getKind()))
   210                 set.add(clazz.cast(e));
   211         }
   212         return set;
   213     }
   214 }

mercurial