-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Introduce ClassRules
Refaster rule collection
#811
Conversation
Looks good. No mutations were possible for these changes. |
/** Prefer {@link Class#isInstance(Object)} over more contrived alternatives. */ | ||
static final class ClassIsInstance<T, S> { | ||
@BeforeTemplate | ||
boolean before(Class<T> clazz, S object) { | ||
return clazz.isAssignableFrom(object.getClass()); | ||
} | ||
|
||
@AfterTemplate | ||
boolean after(Class<T> clazz, S object) { | ||
return clazz.isInstance(object); | ||
} | ||
} | ||
|
||
/** Prefer using the {@code instanceof} keyword over less idiomatic alternatives. */ | ||
static final class Instanceof<T, S> { | ||
@BeforeTemplate | ||
boolean before(S object) { | ||
return Refaster.<T>clazz().isInstance(object); | ||
} | ||
|
||
@AfterTemplate | ||
boolean after(S object) { | ||
return Refaster.<T>isInstance(object); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
These rules are split out, because the second rewrite is possible only for literal class references.
/** Prefer {@link Class#isInstance(Object)} method references over more verbose alternatives. */ | ||
static final class ClassLiteralIsInstancePredicate<T, S> { | ||
@BeforeTemplate | ||
Predicate<S> before() { | ||
return o -> Refaster.<T>isInstance(o); | ||
} | ||
|
||
@AfterTemplate | ||
Predicate<S> after() { | ||
return Refaster.<T>clazz()::isInstance; | ||
} | ||
} | ||
|
||
/** Prefer {@link Class#isInstance(Object)} method references over more verbose alternatives. */ | ||
static final class ClassReferenceIsInstancePredicate<T, S> { | ||
@BeforeTemplate | ||
Predicate<S> before(Class<T> clazz) { | ||
return o -> clazz.isInstance(o); | ||
} | ||
|
||
@AfterTemplate | ||
Predicate<S> after(Class<T> clazz) { | ||
return clazz::isInstance; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I just realized I don't need to split these out; will add another commit. Similarly here: the first case only applies to literal class references.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 👍🏻
|
||
ImmutableSet<Boolean> testInstanceof() throws IOException { | ||
Class<?> clazz = CharSequence.class; | ||
return ImmutableSet.of(CharSequence.class.isInstance("foo"), clazz.isInstance("bar")); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, that means we can actually drop this second test case right? What's the reason for keeping it?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could, but I wanted to be explicit about covering both cases. We could keep just the second, if you prefer, cause that one is more generic (but that's only clear in the context of the other rules).
Sorry, mixing things up (yes, this PR was harder to write than it looks): that second test case is to prove that non-static references are not replaced, as the result wouldn't compile. (Without this extra check one can replace the Refaster.<T>clazz()
with a Class<?>
parameter without the test failing; that's what I want to avoid.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ahh okay clear, let's keep it 😄.
93e3d20
to
658fbcb
Compare
658fbcb
to
f0a9de4
Compare
Looks good. No mutations were possible for these changes. |
Rebased and tweaked suggested commit message. |
Looks good. No mutations were possible for these changes. |
Kudos, SonarCloud Quality Gate passed! 0 Bugs No Coverage information |
Proposal based on this comment.
Suggested commit message: