@@ -66,13 +66,6 @@ public interface ModuleDescription extends NamedElement,
6666 */
6767 Set <String > getPackages ();
6868
69- /**
70- * Returns all service types that this module uses.
71- *
72- * @return A set of service class names that this module uses.
73- */
74- Set <String > getUses ();
75-
7669 /**
7770 * Returns all package exports of this module.
7871 *
@@ -94,6 +87,13 @@ public interface ModuleDescription extends NamedElement,
9487 */
9588 Map <String , Requires > getRequires ();
9689
90+ /**
91+ * Returns all service types that this module uses.
92+ *
93+ * @return A set of service class names that this module uses.
94+ */
95+ Set <String > getUses ();
96+
9797 /**
9898 * Returns all service implementations provided by this module.
9999 *
@@ -133,6 +133,27 @@ abstract class AbstractBase extends ModifierReviewable.AbstractBase implements E
133133 public boolean isQualified () {
134134 return !getTargets ().isEmpty ();
135135 }
136+
137+ @ Override
138+ public int hashCode () {
139+ int hashCode = getModifiers ();
140+ return hashCode + 17 * getTargets ().hashCode ();
141+ }
142+
143+ @ Override
144+ public boolean equals (Object other ) {
145+ if (!(other instanceof Exports )) return false ;
146+ Exports exports = (Exports ) other ;
147+ return getModifiers () == exports .getModifiers () && getTargets ().equals (exports .getTargets ());
148+ }
149+
150+ @ Override
151+ public String toString () {
152+ return "Opens{"
153+ + "targets=" + getTargets ()
154+ + ",modifiers=" + getModifiers ()
155+ + '}' ;
156+ }
136157 }
137158
138159 /**
@@ -208,6 +229,27 @@ abstract class AbstractBase extends ModifierReviewable.AbstractBase implements O
208229 public boolean isQualified () {
209230 return !getTargets ().isEmpty ();
210231 }
232+
233+ @ Override
234+ public int hashCode () {
235+ int hashCode = getModifiers ();
236+ return hashCode + 17 * getTargets ().hashCode ();
237+ }
238+
239+ @ Override
240+ public boolean equals (Object other ) {
241+ if (!(other instanceof Opens )) return false ;
242+ Opens opens = (Opens ) other ;
243+ return getModifiers () == opens .getModifiers () && getTargets ().equals (opens .getTargets ());
244+ }
245+
246+ @ Override
247+ public String toString () {
248+ return "Opens{"
249+ + "targets=" + getTargets ()
250+ + ",modifiers=" + getModifiers ()
251+ + '}' ;
252+ }
211253 }
212254
213255 /**
@@ -243,13 +285,6 @@ public Set<String> getTargets() {
243285 return targets ;
244286 }
245287
246- /**
247- * {@inheritDoc}
248- */
249- public boolean isQualified () {
250- return !targets .isEmpty ();
251- }
252-
253288 /**
254289 * {@inheritDoc}
255290 */
@@ -273,10 +308,40 @@ interface Requires extends ModifierReviewable.ForModuleRequirement {
273308 @ MaybeNull
274309 String getVersion ();
275310
311+ /**
312+ * An abstract base implementation of {@link Requires}.
313+ */
314+ abstract class AbstractBase extends ModifierReviewable .AbstractBase implements Requires {
315+
316+ @ Override
317+ public int hashCode () {
318+ int hashCode = getModifiers ();
319+ String version = getVersion ();
320+ return version == null ? hashCode : (hashCode + 17 * version .hashCode ());
321+ }
322+
323+ @ Override
324+ public boolean equals (Object other ) {
325+ if (!(other instanceof Requires )) return false ;
326+ Requires requires = (Requires ) other ;
327+ String version = getVersion ();
328+ return getModifiers () == requires .getModifiers () && version == null ? requires .getVersion () == null : version .equals (requires .getVersion ());
329+ }
330+
331+ @ Override
332+ public String toString () {
333+ String version = getVersion ();
334+ return "Requires{"
335+ + "version=" + (version == null ? "" : '"' + version + '\'' )
336+ + ",modifiers=" + getModifiers ()
337+ + '}' ;
338+ }
339+ }
340+
276341 /**
277342 * A simple implementation of {@link Requires}.
278343 */
279- class Simple extends ModifierReviewable . AbstractBase implements Requires {
344+ class Simple extends AbstractBase {
280345
281346 /**
282347 * The version of the required module.
@@ -330,10 +395,33 @@ interface Provides {
330395 */
331396 Set <String > getProviders ();
332397
398+ /**
399+ * An abstract base implementation of {@link Provides}.
400+ */
401+ abstract class AbstractBase implements Provides {
402+
403+ @ Override
404+ public int hashCode () {
405+ return getProviders ().hashCode ();
406+ }
407+
408+ @ Override
409+ public boolean equals (Object other ) {
410+ if (!(other instanceof Provides )) return false ;
411+ Provides provides = (Provides ) other ;
412+ return getProviders ().equals (provides .getProviders ());
413+ }
414+
415+ @ Override
416+ public String toString () {
417+ return "Provides{providers=" + getProviders () + '}' ;
418+ }
419+ }
420+
333421 /**
334422 * A simple implementation of {@link Provides}.
335423 */
336- class Simple implements Provides {
424+ class Simple extends AbstractBase {
337425
338426 /**
339427 * The implementation classes that provide the service.
@@ -358,12 +446,35 @@ public Set<String> getProviders() {
358446 }
359447 }
360448
449+ /**
450+ * An abstract base implementation of a {@link ModuleDescription}.
451+ */
452+ abstract class AbstractBase extends ModifierReviewable .AbstractBase implements ModuleDescription {
453+
454+ @ Override
455+ public int hashCode () {
456+ return 17 * getActualName ().hashCode ();
457+ }
458+
459+ @ Override
460+ public boolean equals (Object other ) {
461+ if (!(other instanceof ModuleDescription )) return false ;
462+ ModuleDescription module = (ModuleDescription ) other ;
463+ return getActualName ().equals (module .getActualName ());
464+ }
465+
466+ @ Override
467+ public String toString () {
468+ return "module " + getActualName ();
469+ }
470+ }
471+
361472 /**
362473 * A {@link ModuleDescription} implementation that represents a loaded Java module.
363474 * This implementation uses reflection and Java dispatchers to access module information
364475 * from the runtime module system.
365476 */
366- class ForLoadedModule extends ModifierReviewable . AbstractBase implements ModuleDescription {
477+ class ForLoadedModule extends AbstractBase {
367478
368479 /**
369480 * A dispatcher for accessing {@code java.lang.Module} methods.
0 commit comments