aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2017-12-01 05:51:04 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-12-01 05:53:06 -0800
commit49008a3c90e65bc4abf5292af823a931b8f4e096 (patch)
tree0896c007b16fe2ad6fc8d9bdfde11c73e997b34d
parent9c97bf96f794e2bea6fcb7fe240a64b3e605e292 (diff)
Avoid NPEs when providers are not found in JavaInfo.
Fixes #4173. RELNOTES: None. PiperOrigin-RevId: 177582228
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java44
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java53
2 files changed, 79 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index d93f4ba52c..7a6815c2fc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -49,6 +49,8 @@ public final class JavaInfo extends NativeInfo {
public static final NativeProvider<JavaInfo> PROVIDER =
new NativeProvider<JavaInfo>(JavaInfo.class, "JavaInfo") {};
+ public static final JavaInfo EMPTY = JavaInfo.Builder.create().build();
+
private static final ImmutableSet<Class<? extends TransitiveInfoProvider>> ALLOWED_PROVIDERS =
ImmutableSet.of(
JavaCompilationArgsProvider.class,
@@ -207,10 +209,11 @@ public final class JavaInfo extends NativeInfo {
structField = true
)
public SkylarkNestedSet getTransitiveRuntimeJars() {
- return SkylarkNestedSet.of(
- Artifact.class,
- providers.getProvider(JavaCompilationArgsProvider.class)
- .getRecursiveJavaCompilationArgs().getRuntimeJars());
+ JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class);
+ NestedSet<Artifact> runtimeJars = provider == null
+ ? NestedSetBuilder.<Artifact>stableOrder().build()
+ : provider.getRecursiveJavaCompilationArgs().getRuntimeJars();
+ return SkylarkNestedSet.of(Artifact.class, runtimeJars);
}
@SkylarkCallable(
@@ -220,10 +223,11 @@ public final class JavaInfo extends NativeInfo {
structField = true
)
public SkylarkNestedSet getTransitiveCompileTimeJars() {
- return SkylarkNestedSet.of(
- Artifact.class,
- providers.getProvider(JavaCompilationArgsProvider.class)
- .getRecursiveJavaCompilationArgs().getCompileTimeJars());
+ JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class);
+ NestedSet<Artifact> compileTimeJars = provider == null
+ ? NestedSetBuilder.<Artifact>stableOrder().build()
+ : provider.getRecursiveJavaCompilationArgs().getCompileTimeJars();
+ return SkylarkNestedSet.of(Artifact.class, compileTimeJars);
}
@SkylarkCallable(
@@ -238,10 +242,11 @@ public final class JavaInfo extends NativeInfo {
structField = true
)
public SkylarkNestedSet getCompileTimeJars() {
- return SkylarkNestedSet.of(
- Artifact.class,
- providers.getProvider(JavaCompilationArgsProvider.class)
- .getJavaCompilationArgs().getCompileTimeJars());
+ JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class);
+ NestedSet<Artifact> compileTimeJars = provider == null
+ ? NestedSetBuilder.<Artifact>stableOrder().build()
+ : provider.getJavaCompilationArgs().getCompileTimeJars();
+ return SkylarkNestedSet.of(Artifact.class, compileTimeJars);
}
@SkylarkCallable(
@@ -255,10 +260,11 @@ public final class JavaInfo extends NativeInfo {
structField = true
)
public SkylarkNestedSet getFullCompileTimeJars() {
- return SkylarkNestedSet.of(
- Artifact.class,
- providers.getProvider(JavaCompilationArgsProvider.class)
- .getJavaCompilationArgs().getFullCompileTimeJars());
+ JavaCompilationArgsProvider provider = getProvider(JavaCompilationArgsProvider.class);
+ NestedSet<Artifact> fullCompileTimeJars = provider == null
+ ? NestedSetBuilder.<Artifact>stableOrder().build()
+ : provider.getJavaCompilationArgs().getFullCompileTimeJars();
+ return SkylarkNestedSet.of(Artifact.class, fullCompileTimeJars);
}
@SkylarkCallable(
@@ -269,8 +275,10 @@ public final class JavaInfo extends NativeInfo {
structField = true
)
public SkylarkList<Artifact> getSourceJars() {
- return SkylarkList.createImmutable(
- providers.getProvider(JavaSourceJarsProvider.class).getSourceJars());
+ JavaSourceJarsProvider provider = providers.getProvider(JavaSourceJarsProvider.class);
+ ImmutableList<Artifact> sourceJars =
+ provider == null ? ImmutableList.of() : provider.getSourceJars();
+ return SkylarkList.createImmutable(sourceJars);
}
@SkylarkCallable(
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java
new file mode 100644
index 0000000000..6d2c5b471b
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaInfoTest.java
@@ -0,0 +1,53 @@
+// Copyright 2017 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.rules.java;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Unit tests for {@link JavaInfo}.
+ */
+@RunWith(JUnit4.class)
+public class JavaInfoTest {
+
+ @Test
+ public void getTransitiveRuntimeJars_noJavaCompilationArgsProvider() {
+ assertThat(JavaInfo.EMPTY.getTransitiveRuntimeJars().isEmpty()).isTrue();
+ }
+
+ @Test
+ public void getTransitiveCompileTimeJarsJars_noJavaCompilationArgsProvider() {
+ assertThat(JavaInfo.EMPTY.getTransitiveCompileTimeJars().isEmpty()).isTrue();
+ }
+
+ @Test
+ public void getCompileTimeJarsJars_noJavaCompilationArgsProvider() {
+ assertThat(JavaInfo.EMPTY.getCompileTimeJars().isEmpty()).isTrue();
+ }
+
+ @Test
+ public void getFullCompileTimeJarsJars_noJavaCompilationArgsProvider() {
+ assertThat(JavaInfo.EMPTY.getFullCompileTimeJars().isEmpty()).isTrue();
+ }
+
+ @Test
+ public void getSourceJars_noJavaSourceJarsProvider() {
+ assertThat(JavaInfo.EMPTY.getSourceJars()).isEmpty();
+ }
+}