diff options
author | Ram Peri <ramperi@google.com> | 2023-05-23 14:53:28 -0400 |
---|---|---|
committer | Ram Peri <ramperi@google.com> | 2023-05-23 16:35:02 -0400 |
commit | 8793b94bf5d4134f2adf1d6216fce8c9cb2aa3ba (patch) | |
tree | 6e6dbf0dd32afbddde5f8f7694e5497df2216e6b /processor | |
parent | 7a4fa77f02cc6d37ad958998dc1649bb52c1e6f6 (diff) | |
parent | f2327eec5beaf1cad4d2cc8b394484fa210fa36a (diff) | |
download | robolectric-8793b94bf5d4134f2adf1d6216fce8c9cb2aa3ba.tar.gz |
Merge branch 'upstream-google' into tm_sync
Test: atest -c MyRoboTests
Bug: 281899632
Change-Id: Ic205da6e976c3c7cb1b91c332ddfd22d906ffe51
Diffstat (limited to 'processor')
5 files changed, 71 insertions, 15 deletions
diff --git a/processor/build.gradle b/processor/build.gradle index ac14e4282..9185d088a 100644 --- a/processor/build.gradle +++ b/processor/build.gradle @@ -35,21 +35,21 @@ dependencies { api project(":annotations") api project(":shadowapi") - compileOnly "com.google.code.findbugs:jsr305:3.0.2" - api "org.ow2.asm:asm:${asmVersion}" - api "org.ow2.asm:asm-commons:${asmVersion}" - api "com.google.guava:guava:$guavaJREVersion" - api "com.google.code.gson:gson:2.10.1" - implementation 'com.google.auto:auto-common:1.1.2' + compileOnly libs.findbugs.jsr305 + api libs.asm + api libs.asm.commons + api libs.guava + api libs.gson + implementation libs.auto.common def toolsJar = Jvm.current().getToolsJar() if (toolsJar != null) { implementation files(toolsJar) } - testImplementation "javax.annotation:jsr250-api:1.0" - testImplementation "junit:junit:${junitVersion}" - testImplementation "org.mockito:mockito-core:${mockitoVersion}" - testImplementation "com.google.testing.compile:compile-testing:0.21.0" - testImplementation "com.google.truth:truth:${truthVersion}" + testImplementation libs.javax.annotation.jsr250.api + testImplementation libs.junit4 + testImplementation libs.mockito + testImplementation libs.compile.testing + testImplementation libs.truth } diff --git a/processor/src/main/java/org/robolectric/annotation/processing/RobolectricModel.java b/processor/src/main/java/org/robolectric/annotation/processing/RobolectricModel.java index fd5e77dd2..d9905f6cf 100644 --- a/processor/src/main/java/org/robolectric/annotation/processing/RobolectricModel.java +++ b/processor/src/main/java/org/robolectric/annotation/processing/RobolectricModel.java @@ -1,5 +1,6 @@ package org.robolectric.annotation.processing; +import static com.google.common.base.Preconditions.checkState; import static com.google.common.collect.Maps.newHashMap; import static com.google.common.collect.Maps.newTreeMap; import static com.google.common.collect.Sets.newTreeSet; @@ -127,6 +128,10 @@ public class RobolectricModel { } public void addResetter(TypeElement shadowTypeElement, ExecutableElement elem) { + checkState( + !resetterMap.containsKey(shadowTypeElement.getQualifiedName().toString()), + "Trying to register a duplicate resetter on %s", + shadowTypeElement.getQualifiedName()); registerType(shadowTypeElement); resetterMap.put(shadowTypeElement.getQualifiedName().toString(), diff --git a/processor/src/main/java/org/robolectric/annotation/processing/validator/ResetterValidator.java b/processor/src/main/java/org/robolectric/annotation/processing/validator/ResetterValidator.java index d409f8396..39df257f9 100644 --- a/processor/src/main/java/org/robolectric/annotation/processing/validator/ResetterValidator.java +++ b/processor/src/main/java/org/robolectric/annotation/processing/validator/ResetterValidator.java @@ -1,6 +1,9 @@ package org.robolectric.annotation.processing.validator; +import java.util.HashMap; import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.Set; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.ExecutableElement; @@ -13,6 +16,9 @@ import org.robolectric.annotation.processing.RobolectricModel; * Validator that checks usages of {@link org.robolectric.annotation.Resetter}. */ public class ResetterValidator extends FoundOnImplementsValidator { + + private final Map<TypeElement, ExecutableElement> resetterMethodsByClass = new HashMap<>(); + public ResetterValidator(RobolectricModel.Builder modelBuilder, ProcessingEnvironment env) { super(modelBuilder, env, "org.robolectric.annotation.Resetter"); } @@ -35,7 +41,19 @@ public class ResetterValidator extends FoundOnImplementsValidator { error("@Resetter methods must not have parameters"); error = true; } + if (resetterMethodsByClass.containsKey(parent)) { + error( + String.format( + Locale.US, + "Duplicate @Resetter methods found on %s: %s() and %s(). Only one @Resetter method" + + " is permitted on each shadow.", + parent.getQualifiedName(), + resetterMethodsByClass.get(parent).getSimpleName(), + elem.getSimpleName())); + error = true; + } if (!error) { + resetterMethodsByClass.put(parent, elem); modelBuilder.addResetter(parent, elem); } } diff --git a/processor/src/test/java/org/robolectric/annotation/processing/validator/ResetterValidatorTest.java b/processor/src/test/java/org/robolectric/annotation/processing/validator/ResetterValidatorTest.java index 68900409b..c7924e8b0 100644 --- a/processor/src/test/java/org/robolectric/annotation/processing/validator/ResetterValidatorTest.java +++ b/processor/src/test/java/org/robolectric/annotation/processing/validator/ResetterValidatorTest.java @@ -12,7 +12,8 @@ import org.junit.runners.JUnit4; public class ResetterValidatorTest { @Test public void resetterWithoutImplements_shouldNotCompile() { - final String testClass = "org.robolectric.annotation.processing.shadows.ShadowResetterWithoutImplements"; + final String testClass = + "org.robolectric.annotation.processing.shadows.ShadowResetterWithoutImplements"; assertAbout(singleClass()) .that(testClass) .failsToCompile() @@ -22,7 +23,8 @@ public class ResetterValidatorTest { @Test public void nonStaticResetter_shouldNotCompile() { - final String testClass = "org.robolectric.annotation.processing.shadows.ShadowResetterNonStatic"; + final String testClass = + "org.robolectric.annotation.processing.shadows.ShadowResetterNonStatic"; assertAbout(singleClass()) .that(testClass) .failsToCompile() @@ -32,7 +34,8 @@ public class ResetterValidatorTest { @Test public void nonPublicResetter_shouldNotCompile() { - final String testClass = "org.robolectric.annotation.processing.shadows.ShadowResetterNonPublic"; + final String testClass = + "org.robolectric.annotation.processing.shadows.ShadowResetterNonPublic"; assertAbout(singleClass()) .that(testClass) .failsToCompile() @@ -42,7 +45,8 @@ public class ResetterValidatorTest { @Test public void resetterWithParameters_shouldNotCompile() { - final String testClass = "org.robolectric.annotation.processing.shadows.ShadowResetterWithParameters"; + final String testClass = + "org.robolectric.annotation.processing.shadows.ShadowResetterWithParameters"; assertAbout(singleClass()) .that(testClass) .failsToCompile() @@ -51,6 +55,20 @@ public class ResetterValidatorTest { } @Test + public void twoValidResetters_shouldNotCompile() { + final String testClass = "org.robolectric.annotation.processing.shadows.ShadowWithTwoResetters"; + + assertAbout(singleClass()) + .that(testClass) + .failsToCompile() + .withErrorContaining( + "Duplicate @Resetter methods found on" + + " org.robolectric.annotation.processing.shadows.ShadowWithTwoResetters:" + + " resetter_method_one() and resetter_method_two().") + .onLine(13); + } + + @Test public void goodResetter_shouldCompile() { final String testClass = "org.robolectric.annotation.processing.shadows.ShadowDummy"; assertAbout(singleClass()) diff --git a/processor/src/test/resources/org/robolectric/annotation/processing/shadows/ShadowWithTwoResetters.java b/processor/src/test/resources/org/robolectric/annotation/processing/shadows/ShadowWithTwoResetters.java new file mode 100644 index 000000000..8183073b6 --- /dev/null +++ b/processor/src/test/resources/org/robolectric/annotation/processing/shadows/ShadowWithTwoResetters.java @@ -0,0 +1,15 @@ +package org.robolectric.annotation.processing.shadows; + +import com.example.objects.Dummy; +import org.robolectric.annotation.Implements; +import org.robolectric.annotation.Resetter; + +@Implements(Dummy.class) +public class ShadowWithTwoResetters { + + @Resetter + public static void resetter_method_one() {} + + @Resetter + public static void resetter_method_two() {} +} |