diff options
author | 2015-12-04 20:53:54 +0000 | |
---|---|---|
committer | 2015-12-07 21:14:43 +0000 | |
commit | 9f13600cb64f572a8ded7cd6cee802240f3f81d6 (patch) | |
tree | e3fc26e51d237c0720181bad5ccb7b0a2beb0569 /src | |
parent | 0d2e409ec8eeadfde90b1860935af65d76c90966 (diff) |
Allow @AutoValue-ed classes as provider keys. Also, reject the generated AutoValue_* classes from being provider keys.
--
MOS_MIGRATED_REVID=109440137
Diffstat (limited to 'src')
3 files changed, 58 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java index 95b510257b..0d5bfa35da 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java @@ -25,12 +25,10 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; -import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.vfs.PathFragment; -import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collection; @@ -136,9 +134,10 @@ public final class AnalysisUtils { public static <T extends TransitiveInfoProvider> void checkProvider(Class<T> clazz) { if (!clazz.isInterface()) { Preconditions.checkArgument( - Modifier.isFinal(clazz.getModifiers()), "%s has to be final", clazz.getName()); - Preconditions.checkArgument(clazz.isAnnotationPresent(Immutable.class), - "%s has to be tagged with @Immutable", clazz.getName()); + !clazz.getSimpleName().startsWith("AutoValue_") || clazz.getSuperclass() == null, + "%s is generated by @AutoValue - you should use %s instead", + clazz.getSimpleName(), + clazz.getSuperclass().getSimpleName()); } } } diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index b02e782756..367a32192d 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -485,6 +485,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/build/skyframe", + "//third_party:auto_value", "//third_party:guava", "//third_party:guava-testlib", "//third_party:jsr305", diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AnalysisUtilsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisUtilsTest.java new file mode 100644 index 0000000000..d64f971e59 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/analysis/AnalysisUtilsTest.java @@ -0,0 +1,53 @@ +// Copyright 2015 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.analysis; + +import static com.google.common.truth.Truth.assertThat; +import static com.google.devtools.build.lib.analysis.AnalysisUtils.checkProvider; +import static org.junit.Assert.fail; + +import com.google.auto.value.AutoValue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class AnalysisUtilsTest { + + @Test + public void checkProviderSucceedsOnClassAnnotatedWithAutoValue() { + checkProvider(AutoValuedClass.class); + } + + @Test + public void checkProviderFailsOnClassGeneratredByAutoValue() { + try { + checkProvider(AutoValue_AnalysisUtilsTest_AutoValuedClass.class); + fail("Expected IllegalArgumentException, but nothing was thrown."); + } catch (IllegalArgumentException e) { + assertThat(e.getMessage()).isEqualTo( + "AutoValue_AnalysisUtilsTest_AutoValuedClass is generated by @AutoValue - " + + "you should use AutoValuedClass instead"); + } + } + + // Note: this has to be defined outside of checkProviderFailsOnClassGeneratredByAutoValue() so it + // can be static, which is required by @AutoValue. + @AutoValue + abstract static class AutoValuedClass implements TransitiveInfoProvider { + abstract int foo(); + } +}
\ No newline at end of file |