-
Bug
-
Resolution: Unresolved
-
P4
-
16, 17, 21, 22, 23
-
generic
-
generic
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
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