From 71a7d1d72ba2d2cf8340d86a50bd230a1920e1e8 Mon Sep 17 00:00:00 2001 From: Kengo TODA Date: Fri, 11 Feb 2022 10:11:42 +0800 Subject: [PATCH] fix: throw an exception if user uses unsupoprted Errorprone refs #153 --- .../errorprone/slf4j/IllegalPassedClass.java | 28 +++++++++++++++++-- .../slf4j/IllegalPassedClassTest.java | 10 +++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/jp/skypencil/errorprone/slf4j/IllegalPassedClass.java b/src/main/java/jp/skypencil/errorprone/slf4j/IllegalPassedClass.java index 3f968250..d398374c 100644 --- a/src/main/java/jp/skypencil/errorprone/slf4j/IllegalPassedClass.java +++ b/src/main/java/jp/skypencil/errorprone/slf4j/IllegalPassedClass.java @@ -4,6 +4,7 @@ import com.google.auto.service.AutoService; import com.google.errorprone.BugPattern; +import com.google.errorprone.ErrorProneVersion; import com.google.errorprone.VisitorState; import com.google.errorprone.bugpatterns.BugChecker; import com.google.errorprone.bugpatterns.BugChecker.MethodInvocationTreeMatcher; @@ -97,7 +98,7 @@ private static final class LoggerInitializerVisitor extends TreeScanner { @Override public TypeSymbol visitMethodInvocation(MethodInvocationTree node, VisitorState state) { - if (!isGetLogger.matches(node, state)) { + if (!MatherHolder.isGetLogger.matches(node, state)) { return null; } @@ -106,8 +107,31 @@ public TypeSymbol visitMethodInvocation(MethodInvocationTree node, VisitorState Type typeParameter = type.getTypeArguments().get(0); return typeParameter.asElement(); } + } + + static final class MatherHolder { + static { + boolean supported = + ErrorProneVersion.loadVersionFromPom() + .transform(MatherHolder::checkSupportedVersion) + .or(true); + if (!supported) { + throw new IllegalStateException("Run this rule with Errorprone 2.11.0 or later."); + } + } + + static boolean checkSupportedVersion(String version) { + String[] split = version.split("\\.", 3); + int major = Integer.parseInt(split[0], 10); + if (major > 2) { + // assuming this version uses new API definition + return true; + } + int minor = Integer.parseInt(split[1], 10); + return minor >= 11; + } - private final Matcher isGetLogger = + static Matcher isGetLogger = MethodMatchers.staticMethod() .onClass("org.slf4j.LoggerFactory") .named("getLogger") diff --git a/src/test/java/jp/skypencil/errorprone/slf4j/IllegalPassedClassTest.java b/src/test/java/jp/skypencil/errorprone/slf4j/IllegalPassedClassTest.java index 705c0bdd..7bcbbbb9 100644 --- a/src/test/java/jp/skypencil/errorprone/slf4j/IllegalPassedClassTest.java +++ b/src/test/java/jp/skypencil/errorprone/slf4j/IllegalPassedClassTest.java @@ -1,5 +1,8 @@ package jp.skypencil.errorprone.slf4j; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import com.google.errorprone.BugCheckerRefactoringTestHelper; import com.google.errorprone.BugCheckerRefactoringTestHelper.FixChoosers; import com.google.errorprone.BugCheckerRefactoringTestHelper.TestMode; @@ -9,6 +12,13 @@ import org.junit.Test; public class IllegalPassedClassTest { + @Test + public void testSupportedVersion() { + assertTrue(IllegalPassedClass.MatherHolder.checkSupportedVersion("3.0.0")); + assertTrue(IllegalPassedClass.MatherHolder.checkSupportedVersion("2.11.0")); + assertFalse(IllegalPassedClass.MatherHolder.checkSupportedVersion("2.10.0")); + } + @Test public void testRefactoringInstanceField() throws IOException { BugChecker checker = new IllegalPassedClass();