Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8321322

javax.lang.model.element.ModuleElement.getDirectives returns duplicate provides

XMLWordPrintable

      A DESCRIPTION OF THE PROBLEM :
      javax.lang.model.element.ModuleElement#getDirectives returns duplicates

      a example directive looks like this in the module-info

       provides javax.sound.midi.spi.MidiDeviceProvider with
              com.sun.media.sound.MidiInDeviceProvider,
              com.sun.media.sound.MidiOutDeviceProvider,
              com.sun.media.sound.RealTimeSequencerProvider,
              com.sun.media.sound.SoftProvider;

      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      mvn clean install for the complete Project is all that is needed. Annotation processors are basically Compiler plugins. The Code in "processor" will get executed when "processed" gets build.


      @SupportedSourceVersion(SourceVersion.RELEASE_11)
      @SupportedAnnotationTypes("*")
      public class Processor extends AbstractProcessor
      {
         @Override
         public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
         {
            if (!roundEnv.processingOver())
            {
               return false;
            }

            ModuleElement javaDesktop = processingEnv.getElementUtils().getModuleElement("java.desktop");
            javaDesktop.getDirectives()
                       .stream()
                       .filter(directive -> directive.getKind().equals(ModuleElement.DirectiveKind.PROVIDES))
                       .map(ModuleElement.ProvidesDirective.class::cast)
                       .filter(providesDirective -> providesDirective.getService()
                                                                     .getQualifiedName()
                                                                     .toString()
                                                                     .equals("javax.sound.midi.spi.MidiDeviceProvider"))
                       .forEach(providesDirective -> processingEnv.getMessager()
                                                                  .printMessage(Diagnostic.Kind.MANDATORY_WARNING, providesDirective.toString()));

            return false;
         }
      }

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      [WARNING] Provides[javax.sound.midi.spi.MidiDeviceProvider,com.sun.media.sound.MidiInDeviceProvider,com.sun.media.sound.MidiOutDeviceProvider,com.sun.media.sound.RealTimeSequencerProvider,com.sun.media.sound.SoftProvider]
      ACTUAL -
      [WARNING] Provides[javax.sound.midi.spi.MidiDeviceProvider,com.sun.media.sound.MidiInDeviceProvider]
      [WARNING] Provides[javax.sound.midi.spi.MidiDeviceProvider,com.sun.media.sound.MidiInDeviceProvider,com.sun.media.sound.MidiOutDeviceProvider]
      [WARNING] Provides[javax.sound.midi.spi.MidiDeviceProvider,com.sun.media.sound.MidiInDeviceProvider,com.sun.media.sound.MidiOutDeviceProvider,com.sun.media.sound.RealTimeSequencerProvider]
      [WARNING] Provides[javax.sound.midi.spi.MidiDeviceProvider,com.sun.media.sound.MidiInDeviceProvider,com.sun.media.sound.MidiOutDeviceProvider,com.sun.media.sound.RealTimeSequencerProvider,com.sun.media.sound.SoftProvider]

      ---------- BEGIN SOURCE ----------
      See attached zip file.

      @SupportedSourceVersion(SourceVersion.RELEASE_11)
      @SupportedAnnotationTypes("*")
      public class Processor extends AbstractProcessor
      {
         @Override
         public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv)
         {
            if (!roundEnv.processingOver())
            {
               return false;
            }

            ModuleElement javaDesktop = processingEnv.getElementUtils().getModuleElement("java.desktop");
            javaDesktop.getDirectives()
                       .stream()
                       .filter(directive -> directive.getKind().equals(ModuleElement.DirectiveKind.PROVIDES))
                       .map(ModuleElement.ProvidesDirective.class::cast)
                       .filter(providesDirective -> providesDirective.getService()
                                                                     .getQualifiedName()
                                                                     .toString()
                                                                     .equals("javax.sound.midi.spi.MidiDeviceProvider"))
                       .forEach(providesDirective -> processingEnv.getMessager()
                                                                  .printMessage(Diagnostic.Kind.MANDATORY_WARNING, providesDirective.toString()));

            return false;
         }
      }
      ---------- END SOURCE ----------

      FREQUENCY : always


            darcy Joe Darcy
            webbuggrp Webbug Group
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated: