Create and integrate JavaBootstrap, and use fake top-level Java skylark objects for Skydoc.

RELNOTES: None.
PiperOrigin-RevId: 202697176
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index ec1cc12..eae6943 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -658,6 +658,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
index e670f9f..84f1661 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/JavaRules.java
@@ -43,6 +43,7 @@
 import com.google.devtools.build.lib.rules.java.JavaToolchainRule;
 import com.google.devtools.build.lib.rules.java.ProguardLibraryRule;
 import com.google.devtools.build.lib.rules.java.proto.JavaProtoSkylarkCommon;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaBootstrap;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import java.io.IOException;
 
@@ -85,10 +86,10 @@
     builder.addRuleDefinition(new ExtraActionRule());
     builder.addRuleDefinition(new ActionListenerRule());
 
-    builder.addSkylarkAccessibleTopLevels("java_common",
-        new JavaSkylarkCommon(BazelJavaSemantics.INSTANCE));
-    builder.addSkylarkAccessibleTopLevels("JavaInfo", JavaInfo.PROVIDER);
-    builder.addSkylarkAccessibleTopLevels("java_proto_common", new JavaProtoSkylarkCommon());
+    builder.addSkylarkBootstrap(new JavaBootstrap(
+        new JavaSkylarkCommon(BazelJavaSemantics.INSTANCE),
+        JavaInfo.PROVIDER,
+        new JavaProtoSkylarkCommon()));
 
     try {
       builder.addWorkspaceFilePrefix(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java
new file mode 100644
index 0000000..bb65735
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java
@@ -0,0 +1,44 @@
+// Copyright 2018 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.skylarkbuildapi.java;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.skylarkbuildapi.Bootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaInfoApi.JavaInfoProviderApi;
+
+/**
+ * {@link Bootstrap} for skylark objects related to the java language.
+ */
+public class JavaBootstrap implements Bootstrap {
+
+  private final JavaCommonApi<?, ?, ?, ?, ?> javaCommonApi;
+  private final JavaInfoProviderApi javaInfoProviderApi;
+  private final JavaProtoCommonApi<?, ?, ?> javaProtoCommonApi;
+
+  public JavaBootstrap(JavaCommonApi<?, ?, ?, ?, ?> javaCommonApi,
+      JavaInfoProviderApi javaInfoProviderApi,
+      JavaProtoCommonApi<?, ?, ?> javaProtoCommonApi) {
+    this.javaCommonApi = javaCommonApi;
+    this.javaInfoProviderApi = javaInfoProviderApi;
+    this.javaProtoCommonApi = javaProtoCommonApi;
+  }
+
+  @Override
+  public void addBindingsToBuilder(ImmutableMap.Builder<String, Object> builder) {
+    builder.put("java_common", javaCommonApi);
+    builder.put("JavaInfo", javaInfoProviderApi);
+    builder.put("java_proto_common", javaProtoCommonApi);
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/BUILD b/src/main/java/com/google/devtools/build/skydoc/BUILD
index 6299f09..3573bb5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/BUILD
@@ -20,6 +20,7 @@
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple:srcs",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config:srcs",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp:srcs",
+        "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java:srcs",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/platform:srcs",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository:srcs",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test:srcs",
@@ -46,6 +47,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test",
@@ -55,6 +57,7 @@
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/platform",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test",
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index 34e98bc..c47a20a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.apple.AppleBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcBootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.platform.PlatformBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.repository.RepositoryBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.test.TestingBootstrap;
@@ -55,6 +56,9 @@
 import com.google.devtools.build.skydoc.fakebuildapi.apple.FakeAppleCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigSkylarkCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcModule;
+import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaCommon;
+import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaInfo.FakeJavaInfoProvider;
+import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaProtoCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.platform.FakePlatformCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.repository.FakeRepositoryModule;
 import com.google.devtools.build.skydoc.fakebuildapi.test.FakeTestingModule;
@@ -252,6 +256,9 @@
     AppleBootstrap appleBootstrap = new AppleBootstrap(new FakeAppleCommon());
     ConfigBootstrap configBootstrap = new ConfigBootstrap(new FakeConfigSkylarkCommon());
     CcBootstrap ccBootstrap = new CcBootstrap(new FakeCcModule());
+    JavaBootstrap javaBootstrap = new JavaBootstrap(new FakeJavaCommon(),
+        new FakeJavaInfoProvider(),
+        new FakeJavaProtoCommon());
     PlatformBootstrap platformBootstrap = new PlatformBootstrap(new FakePlatformCommon());
     RepositoryBootstrap repositoryBootstrap = new RepositoryBootstrap(new FakeRepositoryModule());
     TestingBootstrap testingBootstrap = new TestingBootstrap(new FakeTestingModule());
@@ -265,6 +272,7 @@
     appleBootstrap.addBindingsToBuilder(envBuilder);
     ccBootstrap.addBindingsToBuilder(envBuilder);
     configBootstrap.addBindingsToBuilder(envBuilder);
+    javaBootstrap.addBindingsToBuilder(envBuilder);
     platformBootstrap.addBindingsToBuilder(envBuilder);
     repositoryBootstrap.addBindingsToBuilder(envBuilder);
     testingBootstrap.addBindingsToBuilder(envBuilder);
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
new file mode 100644
index 0000000..37cb809
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
@@ -0,0 +1,27 @@
+package(
+    default_visibility = ["//src:__subpackages__"],
+)
+
+licenses(["notice"])  # Apache 2.0
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+)
+
+java_library(
+    name = "java",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:events",
+        "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
+        "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
+        "//third_party:guava",
+        "//third_party:jsr305",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
new file mode 100644
index 0000000..8ca3718
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
@@ -0,0 +1,103 @@
+// Copyright 2018 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.skydoc.fakebuildapi.java;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.TransitiveInfoCollectionApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaCommonApi;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
+import javax.annotation.Nullable;
+
+/**
+ * Fake implementation of {@link JavaCommonApi}.
+ */
+public class FakeJavaCommon implements JavaCommonApi<FileApi, FakeJavaInfo, SkylarkRuleContextApi,
+    TransitiveInfoCollectionApi, SkylarkActionFactoryApi> {
+
+  @Override
+  public FakeJavaInfo create(@Nullable Object actionsUnchecked, Object compileTimeJars,
+      Object runtimeJars, Boolean useIjar, @Nullable Object javaToolchainUnchecked,
+      Object transitiveCompileTimeJars, Object transitiveRuntimeJars, Object sourceJars,
+      Location location, Environment environment) throws EvalException {
+    return new FakeJavaInfo();
+  }
+
+  @Override
+  public ProviderApi getJavaProvider() {
+    return new FakeProviderApi();
+  }
+
+  @Override
+  public FakeJavaInfo createJavaCompileAction(SkylarkRuleContextApi skylarkRuleContext,
+      SkylarkList<FileApi> sourceJars, SkylarkList<FileApi> sourceFiles, FileApi outputJar,
+      SkylarkList<String> javacOpts, SkylarkList<FakeJavaInfo> deps,
+      SkylarkList<FakeJavaInfo> exports, SkylarkList<FakeJavaInfo> plugins,
+      SkylarkList<FakeJavaInfo> exportedPlugins, String strictDepsMode,
+      TransitiveInfoCollectionApi javaToolchain, TransitiveInfoCollectionApi hostJavabase,
+      SkylarkList<FileApi> sourcepathEntries, SkylarkList<FileApi> resources, Boolean neverlink,
+      Environment environment) throws EvalException, InterruptedException {
+    return new FakeJavaInfo();
+  }
+
+  @Override
+  public FileApi runIjar(SkylarkActionFactoryApi actions, FileApi jar, Object targetLabel,
+      TransitiveInfoCollectionApi javaToolchain) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public FileApi stampJar(SkylarkActionFactoryApi actions, FileApi jar, Label targetLabel,
+      TransitiveInfoCollectionApi javaToolchain) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public FileApi packSources(SkylarkActionFactoryApi actions, FileApi outputJar,
+      SkylarkList<FileApi> sourceFiles, SkylarkList<FileApi> sourceJars,
+      TransitiveInfoCollectionApi javaToolchain, TransitiveInfoCollectionApi hostJavabase)
+      throws EvalException {
+    return null;
+  }
+
+  @Override
+  public ImmutableList<String> getDefaultJavacOpts(SkylarkRuleContextApi skylarkRuleContext,
+      String javaToolchainAttr) throws EvalException {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public FakeJavaInfo mergeJavaProviders(SkylarkList<FakeJavaInfo> providers) {
+    return new FakeJavaInfo();
+  }
+
+  @Override
+  public FakeJavaInfo makeNonStrict(FakeJavaInfo javaInfo) {
+    return new FakeJavaInfo();
+  }
+
+  @Override
+  public ProviderApi getJavaRuntimeProvider() {
+    return new FakeProviderApi();
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
new file mode 100644
index 0000000..ee09908
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
@@ -0,0 +1,131 @@
+// Copyright 2018 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.skydoc.fakebuildapi.java;
+
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaAnnotationProcessingApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaCompilationInfoProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaRuleOutputJarsProviderApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/**
+ * Fake implementation of {@link JavaInfoApi}.
+ */
+public class FakeJavaInfo implements JavaInfoApi<FileApi> {
+
+  @Override
+  public SkylarkNestedSet getTransitiveRuntimeJars() {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet getTransitiveCompileTimeJars() {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet getCompileTimeJars() {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet getFullCompileTimeJars() {
+    return null;
+  }
+
+  @Override
+  public SkylarkList<FileApi> getSourceJars() {
+    return null;
+  }
+
+  @Override
+  public JavaRuleOutputJarsProviderApi<?> getOutputJars() {
+    return null;
+  }
+
+  @Override
+  public JavaAnnotationProcessingApi<?> getGenJarsProvider() {
+    return null;
+  }
+
+  @Override
+  public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider() {
+    return null;
+  }
+
+  @Override
+  public SkylarkList<FileApi> getRuntimeOutputJars() {
+    return null;
+  }
+
+  @Override
+  public NestedSet<FileApi> getTransitiveDeps() {
+    return null;
+  }
+
+  @Override
+  public NestedSet<FileApi> getTransitiveRuntimeDeps() {
+    return null;
+  }
+
+  @Override
+  public NestedSet<FileApi> getTransitiveSourceJars() {
+    return null;
+  }
+
+  @Override
+  public NestedSet<Label> getTransitiveExports() {
+    return null;
+  }
+
+  @Override
+  public String toProto(Location loc) throws EvalException {
+    return "";
+  }
+
+  @Override
+  public String toJson(Location loc) throws EvalException {
+    return "";
+  }
+
+  @Override
+  public void repr(SkylarkPrinter printer) {}
+
+  /**
+   * Fake implementation of {@link JavaInfoProviderApi}.
+   */
+  public static class FakeJavaInfoProvider implements JavaInfoProviderApi {
+
+    @Override
+    public JavaInfoApi<?> javaInfo(FileApi outputJarApi, Object compileJarApi, Object sourceJarApi,
+        Boolean neverlink, SkylarkList<?> deps, SkylarkList<?> runtimeDeps, SkylarkList<?> exports,
+        Object actionsApi, Object sourcesApi, Object sourceJarsApi, Object useIjarApi,
+        Object javaToolchainApi, Object hostJavabaseApi, Object jdepsApi, Location loc,
+        Environment env) throws EvalException {
+      return new FakeJavaInfo();
+    }
+
+    @Override
+    public void repr(SkylarkPrinter printer) {}
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java
new file mode 100644
index 0000000..49af579
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaProtoCommon.java
@@ -0,0 +1,52 @@
+// Copyright 2018 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.skydoc.fakebuildapi.java;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.TransitiveInfoCollectionApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.java.JavaProtoCommonApi;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/**
+ * Fake implementation of {@link JavaProtoCommonApi}.
+ */
+public class FakeJavaProtoCommon
+    implements JavaProtoCommonApi<FileApi, SkylarkRuleContextApi, TransitiveInfoCollectionApi> {
+
+  @Override
+  public void createProtoCompileAction(SkylarkRuleContextApi skylarkRuleContext,
+      TransitiveInfoCollectionApi target, FileApi sourceJar, String protoToolchainAttr,
+      String flavour) throws EvalException {}
+
+  @Override
+  public boolean hasProtoSources(TransitiveInfoCollectionApi target) {
+    return false;
+  }
+
+  @Override
+  public JavaInfoApi<FileApi> getRuntimeToolchainProvider(SkylarkRuleContextApi skylarkRuleContext,
+      String protoToolchainAttr) throws EvalException {
+    return new FakeJavaInfo();
+  }
+
+  @Override
+  public ImmutableList<String> getJavacOpts(SkylarkRuleContextApi skylarkRuleContext,
+      String javaToolchainAttr) throws EvalException {
+    return ImmutableList.of();
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/skydoc/BUILD b/src/test/java/com/google/devtools/build/skydoc/BUILD
index 1c495da..d235bf8 100644
--- a/src/test/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/test/java/com/google/devtools/build/skydoc/BUILD
@@ -67,6 +67,13 @@
 )
 
 skydoc_test(
+    name = "java_basic_test",
+    golden_file = "testdata/java_basic_test/golden.txt",
+    input_file = "testdata/java_basic_test/input.bzl",
+    skydoc = "//src/main/java/com/google/devtools/build/skydoc",
+)
+
+skydoc_test(
     name = "multiple_files_test",
     golden_file = "testdata/multiple_files_test/golden.txt",
     input_file = "testdata/multiple_files_test/input.bzl",
diff --git a/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/golden.txt b/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/golden.txt
new file mode 100644
index 0000000..274e1f2
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/golden.txt
@@ -0,0 +1,4 @@
+java_related_rule
+This rule does java-related things.
+first,second,third,fourth
+
diff --git a/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/input.bzl b/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/input.bzl
new file mode 100644
index 0000000..f724b7d
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/skydoc/testdata/java_basic_test/input.bzl
@@ -0,0 +1,21 @@
+def exercise_the_api():
+    var1 = java_common.JavaRuntimeInfo
+    var2 = JavaInfo
+    var3 = java_proto_common
+
+exercise_the_api()
+
+def my_rule_impl(ctx):
+    return struct()
+
+
+java_related_rule = rule(
+    implementation = my_rule_impl,
+    doc = "This rule does java-related things.",
+    attrs = {
+        "first": attr.label(mandatory = True, allow_files = True, single_file = True),
+        "second": attr.string_dict(mandatory = True),
+        "third": attr.output(mandatory = True),
+        "fourth": attr.bool(default = False, mandatory = False),
+    },
+)