Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
/**
* @author sjaakd
*/
@SupportedAnnotationTypes( "org.mapstruct.tools.gem.GemDefinitions" )
@SupportedAnnotationTypes( {"org.mapstruct.tools.gem.GemDefinitions", "org.mapstruct.tools.gem.GemDefinition"} )
public class GemProcessor extends AbstractProcessor {

private Util util;
Expand All @@ -55,24 +55,28 @@ public boolean process(Set<? extends TypeElement> annotationTypes, RoundEnvironm
try {
util = new Util( processingEnv.getTypeUtils(), processingEnv.getElementUtils() );
for ( TypeElement annotationType : annotationTypes ) {

String annotationName = annotationType.getQualifiedName().toString();
for ( Element definingElement : roundEnv.getElementsAnnotatedWith( annotationType ) ) {

// get an annotation mirror on @GemDefinitions
AnnotationMirror gemDefinitionsMirror = definingElement
.getAnnotationMirrors()
.stream()
.filter( t -> util.isSame( t.getAnnotationType(), "org.mapstruct.tools.gem.GemDefinitions" ) )
.filter( t -> util.isSame( t.getAnnotationType(), annotationName ) )
.findFirst()
.orElseThrow( IllegalStateException::new );

// get annotation mirrors on each @GemDefinitions#value
List<AnnotationMirror> gemDefinitionMirrors = util.getAnnotationValue(
gemDefinitionsMirror,
"value",
List.class
);
gemDefinitionMirrors.forEach( m -> addGemInfo( m, definingElement ) );
if ( annotationName.endsWith( "s" ) ) {
// get annotation mirrors on each @GemDefinitions#value
List<AnnotationMirror> gemDefinitionMirrors = util.getAnnotationValue(
gemDefinitionsMirror,
"value",
List.class
);
gemDefinitionMirrors.forEach( m -> addGemInfo( m, definingElement ) );
}
else {
addGemInfo( gemDefinitionsMirror, definingElement );
}
}
}
postProcessGemInfo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,31 @@ void example() throws IOException {
"org.mapstruct.annotations.processor.GemGenerator",
getSource()
);
compile( new GemProcessor(), src );
File generatedDir = compile( new GemProcessor(), src );
assertGeneratedFileContent( "BuilderGem", generatedDir );
assertGeneratedFileContent( "SomeAnnotationGem", generatedDir );
assertGeneratedFileContent( "SomeAnnotationsGem", generatedDir );
assertGeneratedFileContent( "SomeArrayAnnotationGem", generatedDir );
}

@Test
void singleAnnotation() throws IOException {
StringJavaFileObject src = new StringJavaFileObject(
"org.mapstruct.annotations.processor.GemGenerator",
"package org.mapstruct.tools.gem.processor;\n" +
"\n" +
"import org.mapstruct.tools.gem.GemDefinition;\n" +
"import org.mapstruct.tools.gem.test.Builder;\n" +
"\n" +
"@GemDefinition(value = Builder.class)\n" +
"public class GemGenerator {\n" +
"}"
);
File generatedDir = compile( new GemProcessor(), src );
assertGeneratedFileContent( "BuilderGem", generatedDir );
}

private void compile(Processor processor, JavaFileObject... compilationUnits) throws IOException {
private File compile(Processor processor, JavaFileObject... compilationUnits) throws IOException {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
Expand Down Expand Up @@ -71,12 +92,7 @@ private void compile(Processor processor, JavaFileObject... compilationUnits) th
System.err.println( diagnostic );
}
assertThat( success ).isTrue();


assertGeneratedFileContent( "BuilderGem", generatedDir );
assertGeneratedFileContent( "SomeAnnotationGem", generatedDir );
assertGeneratedFileContent( "SomeAnnotationsGem", generatedDir );
assertGeneratedFileContent( "SomeArrayAnnotationGem", generatedDir );
return generatedDir;
}

protected void assertGeneratedFileContent(String gemName, File generatedDir) {
Expand Down