Add a deprecated.txt report to published docs collecting union of `@Deprecated` and `@Remove`

This commit is contained in:
Steve Ebersole 2022-12-22 16:55:02 -06:00
parent 163d5002f4
commit 51a50bed43
5 changed files with 109 additions and 10 deletions

View File

@ -256,6 +256,7 @@ task renderOrmReports { task ->
dependsOn tasks.generateIncubationReport dependsOn tasks.generateIncubationReport
dependsOn tasks.generateInternalsReport dependsOn tasks.generateInternalsReport
dependsOn tasks.generateDeprecationReport
tasks.buildDocs.dependsOn task tasks.buildDocs.dependsOn task
tasks.buildDocsForPublishing.dependsOn task tasks.buildDocsForPublishing.dependsOn task

View File

@ -13,6 +13,7 @@ import java.io.IOException;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.util.List; import java.util.List;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.function.Consumer;
import javax.inject.Inject; import javax.inject.Inject;
import org.gradle.api.DefaultTask; import org.gradle.api.DefaultTask;
@ -89,16 +90,24 @@ public class AbstractJandexAwareTask extends DefaultTask {
} }
protected void processAnnotations(DotName annotationName, TreeSet<Inclusion> inclusions) { protected void processAnnotations(DotName annotationName, TreeSet<Inclusion> inclusions) {
final Index index = getIndexManager().getIndex(); processAnnotations( inclusions::add, annotationName );
final List<AnnotationInstance> usages = index.getAnnotations( annotationName ); }
usages.forEach( (usage) -> { protected void processAnnotations(Consumer<Inclusion> inclusions, DotName... annotationNames) {
final AnnotationTarget usageLocation = usage.target(); final Index index = getIndexManager().getIndex();
final Inclusion inclusion = determinePath( usageLocation );
if ( inclusion != null ) { for ( int i = 0; i < annotationNames.length; i++ ) {
inclusions.add( inclusion ); final DotName annotationName = annotationNames[ i ];
} final List<AnnotationInstance> usages = index.getAnnotations( annotationName );
} );
usages.forEach( (usage) -> {
final AnnotationTarget usageLocation = usage.target();
final Inclusion inclusion = determinePath( usageLocation );
if ( inclusion != null ) {
inclusions.accept( inclusion );
}
} );
}
} }
protected void writeReport(TreeSet<Inclusion> inclusions) { protected void writeReport(TreeSet<Inclusion> inclusions) {
@ -116,7 +125,13 @@ public class AbstractJandexAwareTask extends DefaultTask {
} }
} }
protected void writeReportHeader(OutputStreamWriter fileWriter) {
// by default, nothing to do
}
private void writeReport(TreeSet<Inclusion> inclusions, OutputStreamWriter fileWriter) { private void writeReport(TreeSet<Inclusion> inclusions, OutputStreamWriter fileWriter) {
writeReportHeader( fileWriter );
String previousPath = null; String previousPath = null;
for ( Inclusion inclusion : inclusions ) { for ( Inclusion inclusion : inclusions ) {
if ( previousPath != null && inclusion.getPath().startsWith( previousPath ) ) { if ( previousPath != null && inclusion.getPath().startsWith( previousPath ) ) {

View File

@ -0,0 +1,65 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html.
*/
package org.hibernate.orm.post;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.TreeSet;
import javax.inject.Inject;
import org.gradle.api.Project;
import org.gradle.api.tasks.TaskAction;
import org.jboss.jandex.DotName;
/**
* @author Steve Ebersole
*/
public class DeprecationReportTask extends AbstractJandexAwareTask {
public static final String REMOVE_ANN_NAME = "org.hibernate.Remove";
public static final String DEPRECATED_ANN_NAME = Deprecated.class.getName();
@Inject
public DeprecationReportTask(IndexManager indexManager, Project project) {
super(
indexManager,
project.getLayout().getBuildDirectory().file( "orm/reports/deprecating.txt" )
);
setDescription( "Generates a report for things considered deprecating" );
}
@TaskAction
public void generateIncubationReport() {
final TreeSet<Inclusion> deprecations = new TreeSet<>( Comparator.comparing( Inclusion::getPath ) );
processAnnotations(
deprecations::add,
DotName.createSimple( REMOVE_ANN_NAME ),
DotName.createSimple( DEPRECATED_ANN_NAME )
);
// NOTE : at this point, `deprecations` contains a set of deprecation
// names ordered alphabetically..
writeReport( deprecations );
}
@Override
protected void writeReportHeader(OutputStreamWriter fileWriter) {
super.writeReportHeader( fileWriter );
try {
fileWriter.write( "# Union of everything annotated @Deprecated and/or @Remove" );
fileWriter.write( '\n' );
fileWriter.write( '\n' );
}
catch (IOException e) {
throw new RuntimeException( e );
}
}
}

View File

@ -43,6 +43,14 @@ public class ReportGenerationPlugin implements Plugin<Project> {
incubatingTask.dependsOn( indexerTask ); incubatingTask.dependsOn( indexerTask );
groupingTask.dependsOn( incubatingTask ); groupingTask.dependsOn( incubatingTask );
final DeprecationReportTask deprecationTask = project.getTasks().create(
"generateDeprecationReport",
DeprecationReportTask.class,
indexManager
);
deprecationTask.dependsOn( indexerTask );
groupingTask.dependsOn( deprecationTask );
final InternalsReportTask internalsTask = project.getTasks().create( final InternalsReportTask internalsTask = project.getTasks().create(
"generateInternalsReport", "generateInternalsReport",
InternalsReportTask.class, InternalsReportTask.class,

View File

@ -283,6 +283,16 @@ task stageOrmInternalsReport(type: Copy) { task ->
into "${buildDir}/documentation/internals" into "${buildDir}/documentation/internals"
} }
task stageOrmDeprecationReport(type: Copy) { task ->
group 'Release'
dependsOn ':documentation:generateDeprecationReport'
tasks.stageOrmReports.dependsOn task
from project( ":documentation" ).tasks.generateDeprecationReport.reportFileReferenceAccess
into "${buildDir}/documentation/deprecated"
}
task stageOrmLoggingReport(type: Copy) { task -> task stageOrmLoggingReport(type: Copy) { task ->
group 'Release' group 'Release'