ModuleElement.java revision 3294:9adfb22ff08f
1/*
2 * Copyright (c) 2005, 2016, 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 */
25
26package javax.lang.model.element;
27
28import java.util.List;
29
30/**
31 * Represents a module program element.  Provides access to information
32 * about the module and its members.
33 *
34 * @see javax.lang.model.util.Elements#getModuleOf
35 * @since 9
36 */  // TODO: add @jls to module section
37public interface ModuleElement extends Element, QualifiedNameable {
38
39    /**
40     * Returns the fully qualified name of this module.
41     *
42     * @return the qualified name of this module, or an
43     * empty name if this is an unnamed module
44     */
45    @Override
46    Name getQualifiedName();
47
48    /**
49     * Returns the simple name of this module.  For an unnamed
50     * module, an empty name is returned.
51     *
52     * @return the simple name of this module or an empty name if
53     * this is an unnamed module
54     */
55    @Override
56    Name getSimpleName();
57
58    /**
59     * Returns the packages within this module.
60     * @return the packages within this module
61     */
62    @Override
63    List<? extends Element> getEnclosedElements();
64
65    /**
66     * Returns {@code true} if this is an unnamed module and {@code
67     * false} otherwise.
68     *
69     * @return {@code true} if this is an unnamed module and {@code
70     * false} otherwise
71     */ // TODO: add @jls to unnamed module section
72    boolean isUnnamed();
73
74    /**
75     * Returns {@code null} since a module is not enclosed by another
76     * element.
77     *
78     * @return {@code null}
79     */
80    @Override
81    Element getEnclosingElement();
82
83    /**
84     * Returns the directives contained in the declaration of this module.
85     * @return  the directives in the declaration of this module
86     */
87    List<? extends Directive> getDirectives();
88
89    /**
90     * The {@code kind} of a directive.
91     *
92     * <p>Note that it is possible additional directive kinds will be added
93     * to accommodate new, currently unknown, language structures added to
94     * future versions of the Java&trade; programming language.
95     *
96     * @since 9
97     */
98    enum DirectiveKind {
99        /** A "requires [public] module-name" directive. */
100        REQUIRES,
101        /** An "exports package-name [to module-name-list]" directive. */
102        EXPORTS,
103        /** A "uses service-name" directive. */
104        USES,
105        /** A "provides service-name with implementation-name" directive. */
106        PROVIDES
107    };
108
109    /**
110     * Represents a "module statement" within the declaration of this module.
111     *
112     * @since 9
113     *
114     */ // TODO: add jls to Module Statement
115    interface Directive {
116        /**
117         * Returns the {@code kind} of this directive.
118         *
119         * @return the kind of this directive
120         */
121        DirectiveKind getKind();
122    }
123
124    /**
125     * A dependency of a module.
126     * @since 9
127     */
128    interface RequiresDirective extends Directive {
129        /**
130         * Returns whether or not this is a public dependency.
131         * @return whether or not this is a public dependency
132         */
133        boolean isPublic();
134
135        /**
136         * Returns the module that is required
137         * @return the module that is required
138         */
139        ModuleElement getDependency();
140    }
141
142    /**
143     * An exported package of a module.
144     * @since 9
145     */
146    interface ExportsDirective extends Directive {
147        /**
148         * Returns the package being exported.
149         * @return the package being exported
150         */
151        PackageElement getPackage();
152
153        /**
154         * Returns the specific modules to which the package is being exported,
155         * or null, if the package is exported to all modules which
156         * have readability to this module.
157         * @return the specific modules to which the package is being exported
158         */
159        List<? extends ModuleElement> getTargetModules();
160    }
161
162    /**
163     * An implementation of a service provided by a module.
164     * @since 9
165     */
166    interface ProvidesDirective extends Directive {
167        /**
168         * Returns the service being provided.
169         * @return the service being provided
170         */
171        TypeElement getService();
172
173        /**
174         * Returns the implementation of the service being provided.
175         * @return the implementation of the service being provided
176         */
177        TypeElement getImplementation();
178    }
179
180    /**
181     * A reference to a service used by a module.
182     * @since 9
183     */
184    interface UsesDirective extends Directive {
185        /**
186         * Returns the service that is used.
187         * @return the service that is used
188         */
189        TypeElement getService();
190    }
191}
192