From f0c6c09b4c1e1459524ffd5e517d9714110b0c12 Mon Sep 17 00:00:00 2001 From: Vyacheslav Rusakov Date: Thu, 5 Nov 2020 04:15:57 +0700 Subject: [PATCH] fix class check order to correctly recognize ignoring annotation (fixes #25) --- CHANGELOG.md | 3 ++ .../plugin/animalsniffer/AnimalSniffer.groovy | 31 +++++++++++++-- .../plugin/animalsniffer/AnnKitTest.groovy | 38 +++++++++++++++++++ .../animalsniffer/java/ann4inner/Sample.java | 29 ++++++++++++++ .../animalsniffer/java/ann4inner/Sample2.java | 20 ++++++++++ 5 files changed, 118 insertions(+), 3 deletions(-) create mode 100644 src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample.java create mode 100644 src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample2.java diff --git a/CHANGELOG.md b/CHANGELOG.md index de5bc68..7263022 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +* Fix inner/anonymous classes check order: enclosing class must be processed first + to correctly apply ignoring annotation (#25) + ### 1.5.1 (2020-06-06) * Update animalsniffer 1.16 -> 1.18 (support java > 8) diff --git a/src/main/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnimalSniffer.groovy b/src/main/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnimalSniffer.groovy index b27f5dc..dc4db22 100644 --- a/src/main/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnimalSniffer.groovy +++ b/src/main/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnimalSniffer.groovy @@ -15,6 +15,7 @@ import org.gradle.api.reporting.Reporting import org.gradle.api.tasks.* import org.gradle.internal.reflect.Instantiator import org.gradle.util.ClosureBackedAction +import org.gradle.util.GUtil import ru.vyarus.gradle.plugin.animalsniffer.report.AnimalSnifferReports import ru.vyarus.gradle.plugin.animalsniffer.report.AnimalSnifferReportsImpl import ru.vyarus.gradle.plugin.animalsniffer.report.ReportCollector @@ -136,7 +137,7 @@ class AnimalSniffer extends SourceTask implements VerificationTask, Reporting try { collector.contextSignature(signature.name) ant.animalsniffer(signature: signature.absolutePath, classpath: getClasspath()?.asPath) { - // labda case (Some$$Lambda$1). Ant removes every odd $ in a row - path(path: getSource().asPath.replace('$$', '$$$')) + // the same as getSource().asPath, but have to apply sorting because otherwise + // enclosing class could be parsed after inlined and so ignoring annotation on enclosing class + // would be ignored (actually, this problem appears only on windows) + path(path: sortedPath) getSourcesDirs().srcDirs.each { sourcepath(path: it.absoluteFile) } @@ -233,4 +237,25 @@ class AnimalSniffer extends SourceTask implements VerificationTask, Reporting sortedPath = source + .collect { it.toString() } + .toSorted { a, b -> + if (a.contains(innerIndicator) || b.contains(innerIndicator)) { + String a1 = a.substring(0, a.length() - clsExtSize) // - .class + String b1 = b.substring(0, b.length() - clsExtSize) + // trick is to compare names without extension, so inner class would + // become longer and go last automatically; + // compare: Some.class < Some$1.class, but Some > Some$1 + return a1 <=> b1 + } + return a <=> b + } + // lambda case (Some$$Lambda$1). Ant removes every odd $ in a row + return GUtil.asPath(sortedPath).replace('$$', '$$$') + } } diff --git a/src/test/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnnKitTest.groovy b/src/test/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnnKitTest.groovy index 2c5e7a4..ebadcf7 100644 --- a/src/test/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnnKitTest.groovy +++ b/src/test/groovy/ru/vyarus/gradle/plugin/animalsniffer/AnnKitTest.groovy @@ -52,6 +52,44 @@ class AnnKitTest extends AbstractKitTest { } + def "Check enclosing class annotation detection for inner class"() { + setup: + build """ + plugins { + id 'java' + id 'ru.vyarus.animalsniffer' + } + + animalsniffer { + ignoreFailures = true + } + + repositories { mavenCentral()} + dependencies { + signature 'org.codehaus.mojo.signature:java16-sun:1.0@signature' + compile "org.codehaus.mojo:animal-sniffer-annotations:1.14" + } + + """ + fileFromClasspath('src/main/java/ann/Sample.java', '/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample.java') + fileFromClasspath('src/main/java/ann/Sample2.java', '/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample2.java') +// debug() + + when: "run task" + BuildResult result = run('check') + + then: "task successful" + result.task(':check').outcome == TaskOutcome.SUCCESS + + then: "found no violations" + !result.output.contains("AnimalSniffer violations were found") + + then: "report correct" + File file = file('/build/reports/animalsniffer/main.text') + !file.exists() + } + + def "Check custom annotation detection"() { setup: build """ diff --git a/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample.java b/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample.java new file mode 100644 index 0000000..b1db32a --- /dev/null +++ b/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample.java @@ -0,0 +1,29 @@ +package ann; + +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; + +import java.nio.file.Paths; +import java.util.concurrent.Callable; + +@IgnoreJRERequirement +public class Sample { + + public static void main(String[] args) { + // method added in 1.7 + Boolean.compare(true, true); + } + + public String someth() throws Exception { + // this will compile as separate class file and animalsniffer check order would be important + // (enclosed class must be checked first to apply annotataion) + // https://github.com/xvik/gradle-animalsniffer-plugin/issues/25 + return new Callable() { + @Override + public String call() throws Exception { + // class added in 1.7 + Paths.get("/tmp"); + return "ok"; + } + }.call(); + } +} \ No newline at end of file diff --git a/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample2.java b/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample2.java new file mode 100644 index 0000000..cee5e1a --- /dev/null +++ b/src/test/resources/ru/vyarus/gradle/plugin/animalsniffer/java/ann4inner/Sample2.java @@ -0,0 +1,20 @@ +package ann; + +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; + +import java.nio.file.Paths; + +@IgnoreJRERequirement +public class Sample2 { + + public static void main(String[] args) { + // method added in 1.7 + Boolean.compare(true, true); + } + + public class Inner { + public void someth() { + // class added in 1.7 + } + } +} \ No newline at end of file