Introduce cc-related Google-only interface methods to the Starlark build API

The new interface methods have no Bazel implementation, and are completely unrecognized when --experimental_google_legacy_api is false (the current default). They are introduced as stub methods in Bazel to make different build-API-aware binaries interface-consistent.

RELNOTES: None.
PiperOrigin-RevId: 252714070
diff --git a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
index f90f566..f40b276 100644
--- a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
+++ b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
@@ -51,7 +51,13 @@
 import com.google.devtools.build.skydoc.fakebuildapi.apple.FakeAppleCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigGlobalLibrary;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigSkylarkCommon;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcInfo;
 import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcModule;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcToolchainConfigInfo;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeGoWrapCcHelper;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyCcLinkParamsProvider;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyWrapCcHelper;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyWrapCcInfo;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaCcLinkParamsProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaInfo.FakeJavaInfoProvider;
@@ -187,7 +193,15 @@
     ConfigBootstrap configBootstrap =
         new ConfigBootstrap(new FakeConfigSkylarkCommon(), new FakeConfigApi(),
             new FakeConfigGlobalLibrary());
-    CcBootstrap ccBootstrap = new CcBootstrap(new FakeCcModule());
+    CcBootstrap ccBootstrap =
+        new CcBootstrap(
+            new FakeCcModule(),
+            new FakeCcInfo.Provider(),
+            new FakeCcToolchainConfigInfo.Provider(),
+            new FakePyWrapCcHelper(),
+            new FakeGoWrapCcHelper(),
+            new FakePyWrapCcInfo.Provider(),
+            new FakePyCcLinkParamsProvider.Provider());
     JavaBootstrap javaBootstrap =
         new JavaBootstrap(
             new FakeJavaCommon(),
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 8eba51a..45c39c6 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -1158,6 +1158,7 @@
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/common/options",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
index 5c6bba2..b047f1d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/CcRules.java
@@ -38,6 +38,7 @@
 import com.google.devtools.build.lib.rules.cpp.CpuTransformer;
 import com.google.devtools.build.lib.rules.cpp.FdoPrefetchHintsRule;
 import com.google.devtools.build.lib.rules.cpp.FdoProfileRule;
+import com.google.devtools.build.lib.rules.cpp.GoogleLegacyStubs;
 import com.google.devtools.build.lib.rules.platform.PlatformRules;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcBootstrap;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
@@ -77,10 +78,16 @@
     builder.addRuleDefinition(new CcIncludeScanningRule());
     builder.addRuleDefinition(new FdoProfileRule());
     builder.addRuleDefinition(new FdoPrefetchHintsRule());
+    builder.addSkylarkBootstrap(
+        new CcBootstrap(
+            new BazelCcModule(),
+            CcInfo.PROVIDER,
+            CcToolchainConfigInfo.PROVIDER,
+            new GoogleLegacyStubs.PyWrapCcHelper(),
+            new GoogleLegacyStubs.GoWrapCcHelper(),
+            new GoogleLegacyStubs.PyWrapCcInfoProvider(),
+            new GoogleLegacyStubs.PyCcLinkParamsProvider()));
 
-    builder.addSkylarkBootstrap(new CcBootstrap(new BazelCcModule()));
-    builder.addSkylarkAccessibleTopLevels("CcInfo", CcInfo.PROVIDER);
-    builder.addSkylarkAccessibleTopLevels("CcToolchainConfigInfo", CcToolchainConfigInfo.PROVIDER);
     try {
       builder.addWorkspaceFileSuffix(
           ResourceFileLoader.loadResource(JavaRules.class, "coverage.WORKSPACE"));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
index ae80233..604e16f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -46,6 +46,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go",
         "//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/rules/cpp/CcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
index bc24d1b..4e8f3c0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java
@@ -18,8 +18,8 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
-import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ActionConfig;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ArtifactNamePattern;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.EnvEntry;
@@ -41,9 +41,9 @@
 /** Information describing C++ toolchain derived from CROSSTOOL file. */
 @Immutable
 public class CcToolchainConfigInfo extends NativeInfo implements CcToolchainConfigInfoApi {
-  public static final NativeProvider<CcToolchainConfigInfo> PROVIDER =
-      new NativeProvider<CcToolchainConfigInfo>(
-          CcToolchainConfigInfo.class, "CcToolchainConfigInfo") {};
+
+  /** Singleton provider instance for {@link CcToolchainConfigInfo}. */
+  public static final Provider PROVIDER = new Provider();
 
   private final ImmutableList<ActionConfig> actionConfigs;
   private final ImmutableList<Feature> features;
@@ -357,4 +357,13 @@
         .addAllImplies(actionConfig.getImplies())
         .build();
   }
+
+  /** Provider class for {@link CcToolchainConfigInfo} objects. */
+  public static class Provider extends BuiltinProvider<CcToolchainConfigInfo>
+      implements CcToolchainConfigInfoApi.Provider {
+
+    private Provider() {
+      super("CcToolchainConfigInfo", CcToolchainConfigInfo.class);
+    }
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
index c076a5b..5d44369 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java
@@ -242,6 +242,19 @@
    */
   public static NestedSet<Artifact> getDefaultCcToolchainDynamicRuntimeInputs(
       RuleContext ruleContext) throws RuleErrorException {
+    try {
+      return getDefaultCcToolchainDynamicRuntimeInputsFromStarlark(ruleContext);
+    } catch (EvalException e) {
+      throw ruleContext.throwWithRuleError(e.getMessage());
+    }
+  }
+
+  /**
+   * Convenience function for finding the dynamic runtime inputs for the current toolchain. Useful
+   * for Starlark-defined rules that link against the C++ runtime.
+   */
+  public static NestedSet<Artifact> getDefaultCcToolchainDynamicRuntimeInputsFromStarlark(
+      RuleContext ruleContext) throws EvalException {
     CcToolchainProvider defaultToolchain =
         getToolchainUsingDefaultCcToolchainAttribute(ruleContext);
     if (defaultToolchain == null) {
@@ -249,11 +262,8 @@
     }
     FeatureConfiguration featureConfiguration =
         CcCommon.configureFeaturesOrReportRuleError(ruleContext, defaultToolchain);
-    try {
-      return defaultToolchain.getDynamicRuntimeLinkInputs(featureConfiguration);
-    } catch (EvalException e) {
-      throw ruleContext.throwWithRuleError(e.getMessage());
-    }
+
+    return defaultToolchain.getDynamicRuntimeLinkInputs(featureConfiguration);
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
new file mode 100644
index 0000000..c64b3d6
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
@@ -0,0 +1,271 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.TransitiveInfoCollectionApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CompilationInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoCcLinkParamsInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoWrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoWrapCcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyCcLinkParamsProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.WrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.WrapCcIncludeProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoContextInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoPackageInfoApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/**
+ * Fake stub implementations for C++-related Starlark API which are unsupported without use of
+ * --experimental_google_legacy_api.
+ */
+public final class GoogleLegacyStubs {
+
+  private GoogleLegacyStubs() {}
+
+  private static class WrapCcHelper
+      implements WrapCcHelperApi<
+          FeatureConfigurationApi,
+          SkylarkRuleContextApi,
+          CcToolchainProviderApi<FeatureConfigurationApi>,
+          CompilationInfoApi,
+          FileApi,
+          CcCompilationContextApi,
+          WrapCcIncludeProviderApi> {
+
+    @Override
+    public FeatureConfigurationApi skylarkGetFeatureConfiguration(
+        SkylarkRuleContextApi skylarkRuleContext,
+        CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain)
+        throws EvalException, InterruptedException {
+      return null;
+    }
+
+    @Override
+    public SkylarkNestedSet skylarkCollectTransitiveSwigIncludes(
+        SkylarkRuleContextApi skylarkRuleContext) {
+      return null;
+    }
+
+    @Override
+    public CompilationInfoApi skylarkCreateCompileActions(
+        SkylarkRuleContextApi skylarkRuleContext,
+        FeatureConfigurationApi featureConfiguration,
+        CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+        FileApi ccFile,
+        FileApi headerFile,
+        SkylarkList<CcCompilationContextApi> depCcCompilationContexts,
+        SkylarkList<String> targetCopts)
+        throws EvalException, InterruptedException {
+      return null;
+    }
+
+    @Override
+    public String skylarkGetMangledTargetName(SkylarkRuleContextApi skylarkRuleContext)
+        throws EvalException, InterruptedException {
+      return null;
+    }
+
+    @Override
+    public WrapCcIncludeProviderApi getWrapCcIncludeProvider(
+        SkylarkRuleContextApi skylarkRuleContext, SkylarkNestedSet swigIncludes)
+        throws EvalException, InterruptedException {
+      return null;
+    }
+
+    @Override
+    public void registerSwigAction(
+        SkylarkRuleContextApi skylarkRuleContext,
+        CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+        FeatureConfigurationApi featureConfiguration,
+        CcCompilationContextApi wrapperCcCompilationContext,
+        SkylarkNestedSet swigIncludes,
+        FileApi swigSource,
+        SkylarkList<String> subParameters,
+        FileApi ccFile,
+        FileApi headerFile,
+        SkylarkList<FileApi> outputFiles,
+        Object outDir,
+        Object javaDir,
+        SkylarkNestedSet auxiliaryInputs,
+        String swigAttributeName,
+        Object zipTool)
+        throws EvalException, InterruptedException {}
+  }
+
+  /**
+   * Fake no-op implementation of {@link PyWrapCcHelperApi}. This implementation should be
+   * unreachable without (discouraged) use of --experimental_google_legacy_api.
+   */
+  public static class PyWrapCcHelper extends WrapCcHelper
+      implements PyWrapCcHelperApi<
+          FileApi,
+          SkylarkRuleContextApi,
+          CcInfoApi,
+          FeatureConfigurationApi,
+          CcToolchainProviderApi<FeatureConfigurationApi>,
+          CompilationInfoApi,
+          CcCompilationContextApi,
+          WrapCcIncludeProviderApi> {
+
+    @Override
+    public SkylarkList<String> getPyExtensionLinkopts(SkylarkRuleContextApi skylarkRuleContext) {
+      return null;
+    }
+
+    @Override
+    public SkylarkNestedSet getTransitivePythonSources(
+        SkylarkRuleContextApi skylarkRuleContext, FileApi pyFile) {
+      return null;
+    }
+
+    @Override
+    public RunfilesApi getPythonRunfiles(
+        SkylarkRuleContextApi skylarkRuleContext, SkylarkNestedSet filesToBuild) {
+      return null;
+    }
+
+    @Override
+    public PyWrapCcInfoApi getPyWrapCcInfo(
+        SkylarkRuleContextApi skylarkRuleContext, CcInfoApi ccInfo) {
+      return null;
+    }
+  }
+
+  /**
+   * Fake no-op implementation of {@link GoWrapCcHelperApi}. This implementation should be
+   * unreachable without (discouraged) use of --experimental_google_legacy_api.
+   */
+  public static class GoWrapCcHelper extends WrapCcHelper
+      implements GoWrapCcHelperApi<
+          FileApi,
+          SkylarkRuleContextApi,
+          CcInfoApi,
+          FeatureConfigurationApi,
+          CcToolchainProviderApi<FeatureConfigurationApi>,
+          CcLinkingContextApi<FileApi>,
+          GoConfigurationApi,
+          GoContextInfoApi,
+          TransitiveInfoCollectionApi,
+          CompilationInfoApi,
+          CcCompilationContextApi,
+          WrapCcIncludeProviderApi> {
+
+    @Override
+    public RunfilesApi skylarkGetGoRunfiles(SkylarkRuleContextApi skylarkRuleContext) {
+      return null;
+    }
+
+    @Override
+    public int getArchIntSize(GoConfigurationApi goConfig) {
+      return 0;
+    }
+
+    @Override
+    public GoContextInfoApi skylarkCollectTransitiveGoContextGopkg(
+        SkylarkRuleContextApi skylarkRuleContext,
+        FileApi export,
+        FileApi pkg,
+        FileApi gopkg,
+        Object skylarkWrapContext,
+        CcInfoApi ccInfo) {
+      return null;
+    }
+
+    @Override
+    public GoWrapCcInfoApi getGoWrapCcInfo(
+        SkylarkRuleContextApi skylarkRuleContext, CcInfoApi ccInfo) {
+      return null;
+    }
+
+    @Override
+    public GoCcLinkParamsInfoApi getGoCcLinkParamsProvider(
+        SkylarkRuleContextApi ruleContext, CcLinkingContextApi<FileApi> ccLinkingContext) {
+      return null;
+    }
+
+    @Override
+    public Tuple<FileApi> createGoCompileActions(
+        SkylarkRuleContextApi skylarkRuleContext,
+        CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
+        SkylarkList<FileApi> srcs,
+        SkylarkList<TransitiveInfoCollectionApi> deps) {
+      return null;
+    }
+
+    @Override
+    public Tuple<FileApi> createGoCompileActionsGopkg(
+        SkylarkRuleContextApi skylarkRuleContext,
+        CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
+        SkylarkList<FileApi> srcs,
+        SkylarkList<TransitiveInfoCollectionApi> deps) {
+      return null;
+    }
+
+    @Override
+    public GoPackageInfoApi createTransitiveGopackageInfo(
+        SkylarkRuleContextApi skylarkRuleContext,
+        FileApi skylarkGopkg,
+        FileApi export,
+        FileApi swigOutGo) {
+      return null;
+    }
+
+    @Override
+    public NestedSet<FileApi> getGopackageFiles(
+        SkylarkRuleContextApi skylarkRuleContext, FileApi skylarkGopkg) {
+      return null;
+    }
+  }
+
+  /**
+   * Fake no-op implementation of {@link PyWrapCcInfoApi.Provider}. This implementation should be
+   * unreachable without (discouraged) use of --experimental_google_legacy_api.
+   */
+  public static class PyWrapCcInfoProvider implements PyWrapCcInfoApi.Provider {
+
+    @Override
+    public void repr(SkylarkPrinter printer) {
+      printer.append("<unknown object>");
+    }
+  }
+
+  /**
+   * Fake no-op implementation of {@link PyCcLinkParamsProviderApi.Provider}. This implementation
+   * should be unreachable without (discouraged) use of --experimental_google_legacy_api.
+   */
+  public static class PyCcLinkParamsProvider implements PyCcLinkParamsProviderApi.Provider {
+
+    @Override
+    public void repr(SkylarkPrinter printer) {
+      printer.append("<unknown object>");
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
index 6b382b4..7badc9b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
@@ -14,26 +14,17 @@
 package com.google.devtools.build.lib.rules.python;
 
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
-import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyCcLinkParamsProviderApi;
 
 /** A target that provides C++ libraries to be linked into Python targets. */
 @Immutable
 @AutoCodec
-@SkylarkModule(
-    name = "PyCcLinkParamsProvider",
-    documented = false,
-    category = SkylarkModuleCategory.PROVIDER,
-    doc = "Wrapper for every C++ linking provider")
-public final class PyCcLinkParamsProvider extends NativeInfo {
-  public static final NativeProvider<PyCcLinkParamsProvider> PROVIDER =
-      new NativeProvider<PyCcLinkParamsProvider>(
-          PyCcLinkParamsProvider.class, "PyCcLinkParamsProvider") {};
+public final class PyCcLinkParamsProvider extends NativeInfo implements PyCcLinkParamsProviderApi {
+  public static final Provider PROVIDER = new Provider();
 
   private final CcInfo ccInfo;
 
@@ -42,8 +33,16 @@
     this.ccInfo = CcInfo.builder().setCcLinkingContext(ccInfo.getCcLinkingContext()).build();
   }
 
-  @SkylarkCallable(name = "cc_info", doc = "", structField = true, documented = false)
+  @Override
   public CcInfo getCcInfo() {
     return ccInfo;
   }
+
+  /** Provider class for {@link PyCcLinkParamsProvider} objects. */
+  public static class Provider extends BuiltinProvider<PyCcLinkParamsProvider>
+      implements PyCcLinkParamsProviderApi.Provider {
+    private Provider() {
+      super("PyCcLinkParamsProvider", PyCcLinkParamsProvider.class);
+    }
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
index ff27355..982ca13 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
@@ -18,6 +18,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java:srcs",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository:srcs",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD
index 6f8133b..723bf91 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BUILD
@@ -25,6 +25,7 @@
         "//src/main/java/com/google/devtools/build/lib:syntax",
         "//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/go",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
index 18ebafc..5d1cb65 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
@@ -19,46 +19,77 @@
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * {@link Bootstrap} for skylark objects related to cpp rules.
  */
 public class CcBootstrap implements Bootstrap {
-  private final BazelCcModuleApi<
+  private final CcModuleApi<
           ? extends SkylarkActionFactoryApi,
           ? extends FileApi,
-          ? extends SkylarkRuleContextApi,
           ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
           ? extends FeatureConfigurationApi,
           ? extends CcCompilationContextApi,
-          ? extends CcCompilationOutputsApi<? extends FileApi>,
-          ? extends CcLinkingOutputsApi<? extends FileApi>,
-          ? extends LibraryToLinkApi<? extends FileApi>,
           ? extends CcLinkingContextApi<? extends FileApi>,
+          ? extends LibraryToLinkApi<? extends FileApi>,
           ? extends CcToolchainVariablesApi,
-          ? extends CcToolchainConfigInfoApi>
+          ? extends SkylarkRuleContextApi,
+          ? extends CcToolchainConfigInfoApi,
+          ? extends CcCompilationOutputsApi<? extends FileApi>>
       ccModule;
 
+  private final CcInfoApi.Provider ccInfoProvider;
+  private final CcToolchainConfigInfoApi.Provider ccToolchainConfigInfoProvider;
+  private final PyWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?> pyWrapCcHelper;
+  private final GoWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> goWrapCcHelper;
+  private final PyWrapCcInfoApi.Provider pyWrapCcInfoProvider;
+  private final PyCcLinkParamsProviderApi.Provider pyCcLinkInfoParamsInfoProvider;
+
   public CcBootstrap(
-      BazelCcModuleApi<
+      CcModuleApi<
               ? extends SkylarkActionFactoryApi,
               ? extends FileApi,
-              ? extends SkylarkRuleContextApi,
               ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
               ? extends FeatureConfigurationApi,
               ? extends CcCompilationContextApi,
-              ? extends CcCompilationOutputsApi<? extends FileApi>,
-              ? extends CcLinkingOutputsApi<? extends FileApi>,
-              ? extends LibraryToLinkApi<? extends FileApi>,
               ? extends CcLinkingContextApi<? extends FileApi>,
+              ? extends LibraryToLinkApi<? extends FileApi>,
               ? extends CcToolchainVariablesApi,
-              ? extends CcToolchainConfigInfoApi>
-          ccModule) {
+              ? extends SkylarkRuleContextApi,
+              ? extends CcToolchainConfigInfoApi,
+              ? extends CcCompilationOutputsApi<? extends FileApi>>
+          ccModule,
+      CcInfoApi.Provider ccInfoProvider,
+      CcToolchainConfigInfoApi.Provider ccToolchainConfigInfoProvider,
+      PyWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?> pyWrapCcHelper,
+      GoWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> goWrapCcHelper,
+      PyWrapCcInfoApi.Provider pyWrapCcInfoProvider,
+      PyCcLinkParamsProviderApi.Provider pyCcLinkInfoParamsInfoProvider) {
     this.ccModule = ccModule;
+    this.ccInfoProvider = ccInfoProvider;
+    this.ccToolchainConfigInfoProvider = ccToolchainConfigInfoProvider;
+    this.pyWrapCcHelper = pyWrapCcHelper;
+    this.goWrapCcHelper = goWrapCcHelper;
+    this.pyWrapCcInfoProvider = pyWrapCcInfoProvider;
+    this.pyCcLinkInfoParamsInfoProvider = pyCcLinkInfoParamsInfoProvider;
   }
 
   @Override
   public void addBindingsToBuilder(ImmutableMap.Builder<String, Object> builder) {
     builder.put("cc_common", ccModule);
+    builder.put("CcInfo", ccInfoProvider);
+    builder.put("CcToolchainConfigInfo", ccToolchainConfigInfoProvider);
+    builder.put(
+        "py_wrap_cc_helper_do_not_use",
+        FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(
+            FlagIdentifier.EXPERIMENTAL_GOOGLE_LEGACY_API, pyWrapCcHelper));
+    builder.put(
+        "go_wrap_cc_helper_do_not_use",
+        FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(
+            FlagIdentifier.EXPERIMENTAL_GOOGLE_LEGACY_API, goWrapCcHelper));
+    builder.put("PyWrapCcInfo", pyWrapCcInfoProvider);
+    builder.put("PyCcLinkParamsProvider", pyCcLinkInfoParamsInfoProvider);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainConfigInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainConfigInfoApi.java
index f6a794f..d5cd2b3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainConfigInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainConfigInfoApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -35,4 +36,8 @@
       doc = "Returns CToolchain text proto from the CcToolchainConfigInfo data.",
       structField = true)
   String getProto();
+
+  /** Provider class for {@link CcToolchainConfigInfoApi} objects. */
+  @SkylarkModule(name = "Provider", documented = false, doc = "")
+  public interface Provider extends ProviderApi {}
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoCcLinkParamsInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
new file mode 100644
index 0000000..b31634b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoCcLinkParamsInfoApi.java
@@ -0,0 +1,58 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** A target that provides C++ libraries to be linked into Go targets. */
+@SkylarkModule(
+    name = "GoCcLinkParamsInfo",
+    doc = "",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER)
+public interface GoCcLinkParamsInfoApi extends StructApi {
+
+  /** Provider for GoContextInfo objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider<
+          FileT extends FileApi, CcLinkingContextT extends CcLinkingContextApi<FileT>>
+      extends ProviderApi {
+    @SkylarkCallable(
+        name = "GoCcLinkParamsInfo",
+        doc = "The <code>GoCcLinkParamsInfo</code> constructor.",
+        parameters = {
+          @Param(
+              name = "linking_context",
+              doc = "The CC linking context.",
+              positional = false,
+              named = true,
+              type = CcLinkingContextApi.class),
+        },
+        selfCall = true)
+    @SkylarkConstructor(
+        objectType = GoCcLinkParamsInfoApi.class,
+        receiverNameForDoc = "GoCcLinkParamsInfo")
+    public GoCcLinkParamsInfoApi createInfo(CcLinkingContextT ccLinkingContext)
+        throws EvalException;
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java
new file mode 100644
index 0000000..67c8da4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java
@@ -0,0 +1,222 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.TransitiveInfoCollectionApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoContextInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoPackageInfoApi;
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.ParamType;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Runtime.NoneType;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
+
+/**
+ * Helper class for the C++ functionality needed from Skylark specifically to implement go_wrap_cc.
+ * TODO(b/113797843): Remove class once all the bits and pieces specific to Go can be implemented in
+ * Skylark.
+ */
+@SkylarkModule(
+    name = "go_wrap_cc_helper_do_not_use",
+    documented = false,
+    doc = "",
+    category = SkylarkModuleCategory.TOP_LEVEL_TYPE)
+public interface GoWrapCcHelperApi<
+        FileT extends FileApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        CcInfoT extends CcInfoApi,
+        FeatureConfigurationT extends FeatureConfigurationApi,
+        CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
+        CcLinkingContextT extends CcLinkingContextApi<FileT>,
+        GoConfigurationT extends GoConfigurationApi,
+        GoContextInfoT extends GoContextInfoApi,
+        TransitiveInfoCollectionT extends TransitiveInfoCollectionApi,
+        CompilationInfoT extends CompilationInfoApi,
+        CcCompilationContextT extends CcCompilationContextApi,
+        WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
+    extends WrapCcHelperApi<
+        FeatureConfigurationT,
+        SkylarkRuleContextT,
+        CcToolchainProviderT,
+        CompilationInfoT,
+        FileT,
+        CcCompilationContextT,
+        WrapCcIncludeProviderT> {
+
+  @SkylarkCallable(
+      name = "get_go_runfiles",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+      })
+  // TODO(b/113797843): Not written in Skylark because of GoRunfilesProvider.
+  public RunfilesApi skylarkGetGoRunfiles(SkylarkRuleContextT skylarkRuleContext)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "get_arch_int_size",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "go", positional = false, named = true, type = GoConfigurationApi.class),
+      })
+  // TODO(b/113797843): Not written in Skylark because of GoCompilationHelper.
+  public int getArchIntSize(GoConfigurationT goConfig);
+
+  @SkylarkCallable(
+      name = "collect_transitive_go_context_gopkg",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(name = "export", positional = false, named = true, type = FileApi.class),
+        @Param(name = "pkg", positional = false, named = true, type = FileApi.class),
+        @Param(name = "gopkg", positional = false, named = true, type = FileApi.class),
+        @Param(
+            name = "wrap_context",
+            positional = false,
+            named = true,
+            defaultValue = "None",
+            noneable = true,
+            allowedTypes = {
+              @ParamType(type = NoneType.class),
+              @ParamType(type = GoContextInfoApi.class)
+            }),
+        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+      })
+  public GoContextInfoT skylarkCollectTransitiveGoContextGopkg(
+      SkylarkRuleContextT skylarkRuleContext,
+      FileT export,
+      FileT pkg,
+      FileT gopkg,
+      Object skylarkWrapContext,
+      CcInfoT ccInfo);
+
+  @SkylarkCallable(
+      name = "go_wrap_cc_info",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+      })
+  // TODO(b/113797843): GoWrapCcInfo is not written in Skylark because several native rules use it.
+  public GoWrapCcInfoApi getGoWrapCcInfo(SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "go_cc_link_params_provider",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "linking_context",
+            positional = false,
+            named = true,
+            type = CcLinkingContextApi.class),
+      })
+  public GoCcLinkParamsInfoApi getGoCcLinkParamsProvider(
+      SkylarkRuleContextT ruleContext, CcLinkingContextT ccLinkingContext)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "create_go_compile_actions",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "cc_toolchain",
+            positional = false,
+            named = true,
+            type = CcToolchainProviderApi.class),
+        @Param(name = "srcs", positional = false, named = true, type = SkylarkList.class),
+        @Param(name = "deps", positional = false, named = true, type = SkylarkList.class),
+      })
+  public Tuple<FileT> createGoCompileActions(
+      SkylarkRuleContextT skylarkRuleContext,
+      CcToolchainProviderT ccToolchainProvider,
+      SkylarkList<FileT> srcs,
+      SkylarkList<TransitiveInfoCollectionT> deps)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "create_go_compile_actions_gopkg",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "cc_toolchain",
+            positional = false,
+            named = true,
+            type = CcToolchainProviderApi.class),
+        @Param(name = "srcs", positional = false, named = true, type = SkylarkList.class),
+        @Param(name = "deps", positional = false, named = true, type = SkylarkList.class),
+      })
+  public Tuple<FileT> createGoCompileActionsGopkg(
+      SkylarkRuleContextT skylarkRuleContext,
+      CcToolchainProviderT ccToolchainProvider,
+      SkylarkList<FileT> srcs,
+      SkylarkList<TransitiveInfoCollectionT> deps)
+      throws EvalException;
+
+  @SkylarkCallable(
+      name = "create_transitive_gopackage_info",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "gopkg",
+            positional = false,
+            named = true,
+            defaultValue = "None",
+            noneable = true,
+            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = FileApi.class)}),
+        @Param(name = "export", positional = false, named = true, type = FileApi.class),
+        @Param(name = "swig_out_go", positional = false, named = true, type = FileApi.class),
+      })
+  public GoPackageInfoApi createTransitiveGopackageInfo(
+      SkylarkRuleContextT skylarkRuleContext, FileT skylarkGopkg, FileT export, FileT swigOutGo);
+
+  @SkylarkCallable(
+      name = "get_gopackage_files",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "gopkg",
+            positional = false,
+            named = true,
+            defaultValue = "None",
+            noneable = true,
+            allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = FileApi.class)}),
+      })
+  public NestedSet<FileT> getGopackageFiles(
+      SkylarkRuleContextT skylarkRuleContext, FileT skylarkGopkg);
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java
new file mode 100644
index 0000000..8ccf522
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java
@@ -0,0 +1,44 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/**
+ * Provider returned by go_wrap_cc rules that encapsulates C++ information.
+ *
+ * <p>The provider wrapped is CcInfo. Go SWIG have C++ dependencies that will have to be linked
+ * later, however, we don't want C++ targets to be able to depend on Go SWIG, only Python targets
+ * should be able to do so. Therefore, we wrap the C++ providers in a different provider which C++
+ * rules do not recognize.
+ */
+@SkylarkModule(
+    name = "GoWrapCcInfo",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER,
+    doc = "")
+public interface GoWrapCcInfoApi extends StructApi {
+
+  @SkylarkCallable(name = "cc_info", structField = true, documented = false, doc = "")
+  CcInfoApi getCcInfo();
+
+  /** Provider for GoWrapCcInfo objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider extends ProviderApi {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java
new file mode 100644
index 0000000..ec40ace
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java
@@ -0,0 +1,36 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** A target that provides C++ libraries to be linked into Python targets. */
+@SkylarkModule(
+    name = "PyCcLinkParamsProvider",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER,
+    doc = "Wrapper for every C++ linking provider")
+public interface PyCcLinkParamsProviderApi extends StructApi {
+  @SkylarkCallable(name = "cc_info", doc = "", structField = true, documented = false)
+  CcInfoApi getCcInfo();
+
+  /** Provider for PyCcLinkParamsProvider objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider extends ProviderApi {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java
new file mode 100644
index 0000000..841ae42
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java
@@ -0,0 +1,110 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/**
+ * Helper class for the C++ aspects of {py,java,go}_wrap_cc. Provides methods to create the swig and
+ * C++ actions. The swig action translates the swig declaration of an interface into Python or Java
+ * wrapper code that can then be used to access the wrapped native APIs. The swig action also
+ * creates C++ wrapper code that gets compiled and linked into a library that is interfacing between
+ * the Java and Python wrappers and the actual wrapped APIs.
+ */
+@SkylarkModule(
+    name = "py_wrap_cc_helper_do_not_use",
+    documented = false,
+    doc = "",
+    category = SkylarkModuleCategory.TOP_LEVEL_TYPE)
+public interface PyWrapCcHelperApi<
+        FileT extends FileApi,
+        SkylarkRuleContextT extends SkylarkRuleContextApi,
+        CcInfoT extends CcInfoApi,
+        FeatureConfigurationT extends FeatureConfigurationApi,
+        CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
+        CompilationInfoT extends CompilationInfoApi,
+        CcCompilationContextT extends CcCompilationContextApi,
+        WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
+    extends WrapCcHelperApi<
+        FeatureConfigurationT,
+        SkylarkRuleContextT,
+        CcToolchainProviderT,
+        CompilationInfoT,
+        FileT,
+        CcCompilationContextT,
+        WrapCcIncludeProviderT> {
+
+  @SkylarkCallable(
+      name = "py_extension_linkopts",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+      })
+  // TODO(plf): PyExtension is not in Skylark.
+  public SkylarkList<String> getPyExtensionLinkopts(SkylarkRuleContextT skylarkRuleContext)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "get_transitive_python_sources",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(name = "py_file", positional = false, named = true, type = FileApi.class),
+      })
+  // TODO(plf): Not written in Skylark because of PyCommon.
+  public SkylarkNestedSet getTransitivePythonSources(
+      SkylarkRuleContextT skylarkRuleContext, FileT pyFile)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "get_python_runfiles",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "files_to_build",
+            positional = false,
+            named = true,
+            type = SkylarkNestedSet.class),
+      })
+  // TODO(plf): Not written in Skylark because of PythonRunfilesProvider.
+  public RunfilesApi getPythonRunfiles(
+      SkylarkRuleContextT skylarkRuleContext, SkylarkNestedSet filesToBuild)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "py_wrap_cc_info",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
+      })
+  // TODO(plf): PyWrapCcInfo is not written in Skylark because several native rules use it.
+  public PyWrapCcInfoApi getPyWrapCcInfo(SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
+      throws EvalException, InterruptedException;
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java
new file mode 100644
index 0000000..0883d5e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java
@@ -0,0 +1,44 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/**
+ * Provider returned by py_wrap_cc rules that encapsulates C++ information.
+ *
+ * <p>The provider wrapped is CcInfo. Python SWIG have C++ dependencies that will have to be linked
+ * later, however, we don't want C++ targets to be able to depend on Python SWIG, only Python
+ * targets should be able to do so. Therefore, we wrap the C++ providers in a different provider
+ * which C++ rules do not recognize.
+ */
+@SkylarkModule(
+    name = "PyWrapCcInfo",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER,
+    doc = "")
+public interface PyWrapCcInfoApi extends StructApi {
+
+  @SkylarkCallable(name = "cc_info", documented = false, structField = true, doc = "")
+  CcInfoApi getCcInfo();
+
+  /** Provider for PyWrapCcInfo objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider extends ProviderApi {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
new file mode 100644
index 0000000..b879b4e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
@@ -0,0 +1,212 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.FilesToRunProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkinterface.Param;
+import com.google.devtools.build.lib.skylarkinterface.ParamType;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Runtime.NoneType;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/**
+ * Helper class for the C++ aspects of {py,java,go}_wrap_cc. Provides methods to create the swig and
+ * C++ actions. The swig action translates the swig declaration of an interface into Python or Java
+ * wrapper code that can then be used to access the wrapped native APIs. The swig action also
+ * creates C++ wrapper code that gets compiled and linked into a library that is interfacing between
+ * the Java and Python wrappers and the actual wrapped APIs.
+ */
+@SkylarkModule(name = "WrapCcHelperDoNotUse", doc = "", documented = false)
+public interface WrapCcHelperApi<
+    FeatureConfigurationT extends FeatureConfigurationApi,
+    SkylarkRuleContextT extends SkylarkRuleContextApi,
+    CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
+    CompilationInfoT extends CompilationInfoApi,
+    FileT extends FileApi,
+    CcCompilationContextT extends CcCompilationContextApi,
+    WrapCcIncludeProviderT extends WrapCcIncludeProviderApi> {
+
+  @SkylarkCallable(
+      name = "feature_configuration",
+      documented = false,
+      doc = "",
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "cc_toolchain",
+            positional = false,
+            named = true,
+            type = CcToolchainProviderApi.class),
+      })
+  public FeatureConfigurationT skylarkGetFeatureConfiguration(
+      SkylarkRuleContextT skylarkRuleContext, CcToolchainProviderT ccToolchain)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "collect_transitive_swig_includes",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+      })
+  public SkylarkNestedSet skylarkCollectTransitiveSwigIncludes(
+      SkylarkRuleContextT skylarkRuleContext);
+
+  @SkylarkCallable(
+      name = "create_compile_actions",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "feature_configuration",
+            positional = false,
+            named = true,
+            type = FeatureConfigurationApi.class),
+        @Param(
+            name = "cc_toolchain",
+            positional = false,
+            named = true,
+            type = CcToolchainProviderApi.class),
+        @Param(name = "cc_file", positional = false, named = true, type = FileApi.class),
+        @Param(name = "header_file", positional = false, named = true, type = FileApi.class),
+        @Param(
+            name = "dep_compilation_contexts",
+            positional = false,
+            named = true,
+            type = SkylarkList.class),
+        @Param(name = "target_copts", positional = false, named = true, type = SkylarkList.class),
+      })
+  public CompilationInfoT skylarkCreateCompileActions(
+      SkylarkRuleContextT skylarkRuleContext,
+      FeatureConfigurationT featureConfiguration,
+      CcToolchainProviderT ccToolchain,
+      FileT ccFile,
+      FileT headerFile,
+      SkylarkList<CcCompilationContextT> depCcCompilationContexts,
+      SkylarkList<String> targetCopts)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "mangled_target_name",
+      documented = false,
+      doc = "",
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+      })
+  public String skylarkGetMangledTargetName(SkylarkRuleContextT skylarkRuleContext)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "wrap_cc_include_provider",
+      doc = "",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "swig_includes",
+            positional = false,
+            named = true,
+            type = SkylarkNestedSet.class),
+      })
+  // TODO(plf): Not written in Skylark because of PythonRunfilesProvider.
+  public WrapCcIncludeProviderT getWrapCcIncludeProvider(
+      SkylarkRuleContextT skylarkRuleContext, SkylarkNestedSet swigIncludes)
+      throws EvalException, InterruptedException;
+
+  @SkylarkCallable(
+      name = "register_swig_action",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true, type = SkylarkRuleContextApi.class),
+        @Param(
+            name = "cc_toolchain",
+            positional = false,
+            named = true,
+            type = CcToolchainProviderApi.class),
+        @Param(
+            name = "feature_configuration",
+            positional = false,
+            named = true,
+            noneable = false,
+            type = FeatureConfigurationApi.class),
+        @Param(
+            name = "wrapper_compilation_context",
+            positional = false,
+            named = true,
+            type = CcCompilationContextApi.class),
+        @Param(
+            name = "swig_includes",
+            positional = false,
+            named = true,
+            type = SkylarkNestedSet.class),
+        @Param(name = "swig_source", positional = false, named = true, type = FileApi.class),
+        @Param(name = "sub_parameters", positional = false, named = true, type = SkylarkList.class),
+        @Param(name = "cc_file", positional = false, named = true, type = FileApi.class),
+        @Param(name = "header_file", positional = false, named = true, type = FileApi.class),
+        @Param(name = "output_files", positional = false, named = true, type = SkylarkList.class),
+        @Param(
+            name = "out_dir",
+            positional = false,
+            named = true,
+            noneable = true,
+            defaultValue = "None",
+            allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)}),
+        @Param(
+            name = "java_dir",
+            positional = false,
+            named = true,
+            noneable = true,
+            defaultValue = "None",
+            allowedTypes = {@ParamType(type = String.class), @ParamType(type = NoneType.class)}),
+        @Param(
+            name = "auxiliary_inputs",
+            positional = false,
+            named = true,
+            type = SkylarkNestedSet.class),
+        @Param(name = "swig_attribute_name", positional = false, named = true, type = String.class),
+        @Param(
+            name = "zip_tool",
+            positional = false,
+            named = true,
+            noneable = true,
+            defaultValue = "None",
+            allowedTypes = {
+              @ParamType(type = FilesToRunProviderApi.class),
+              @ParamType(type = NoneType.class)
+            })
+      })
+  // TODO(plf): Write in Skylark when all 3 SWIG rules are in Skylark.
+  public void registerSwigAction(
+      SkylarkRuleContextT skylarkRuleContext,
+      CcToolchainProviderT ccToolchain,
+      FeatureConfigurationT featureConfiguration,
+      CcCompilationContextT wrapperCcCompilationContext,
+      SkylarkNestedSet swigIncludes,
+      FileT swigSource,
+      SkylarkList<String> subParameters,
+      FileT ccFile,
+      FileT headerFile,
+      SkylarkList<FileT> outputFiles,
+      Object outDir,
+      Object javaDir,
+      SkylarkNestedSet auxiliaryInputs,
+      String swigAttributeName,
+      Object zipTool)
+      throws EvalException, InterruptedException;
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcIncludeProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcIncludeProviderApi.java
new file mode 100644
index 0000000..bd5f6bf
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcIncludeProviderApi.java
@@ -0,0 +1,27 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** An info object that provides the included files of a _wrap_cc rule. */
+@SkylarkModule(
+    name = "WrapCcIncludeProvider",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER,
+    doc = "")
+public interface WrapCcIncludeProviderApi extends StructApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/BUILD
new file mode 100644
index 0000000..df961f4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/BUILD
@@ -0,0 +1,26 @@
+# Description:
+#   This package contains interfaces representing the skylark "build API"
+#   (but not the implementation of that API). Ultimately, this package
+#   may be broken out of the Bazel package hierarchy to be standalone.
+#   Thus, this package should not depend on Bazel-specific packages (only
+#   those which contain pure-Skylark concepts, such as the interpreter or
+#   annotation interfaces).
+
+package(default_visibility = ["//src:__subpackages__"])
+
+licenses(["notice"])  # Apache 2.0
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+)
+
+java_library(
+    name = "go",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
+        "//third_party:guava",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java
new file mode 100644
index 0000000..3a72cd3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoConfigurationApi.java
@@ -0,0 +1,25 @@
+// Copyright 2019 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.go;
+
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** A configuration fragment for Go. */
+@SkylarkModule(
+    name = "go",
+    doc = "A configuration fragment for Go.",
+    category = SkylarkModuleCategory.CONFIGURATION_FRAGMENT)
+public interface GoConfigurationApi {}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoContextInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoContextInfoApi.java
new file mode 100644
index 0000000..30df893
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoContextInfoApi.java
@@ -0,0 +1,33 @@
+// Copyright 2019 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.go;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** Information about the transitive closure of a target that is relevant to Go compilation. */
+@SkylarkModule(
+    name = "GoContextInfo",
+    doc = "",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER)
+public interface GoContextInfoApi extends StructApi {
+
+  /** Provider for GoContextInfo objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider extends ProviderApi {}
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoPackageInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoPackageInfoApi.java
new file mode 100644
index 0000000..32fc973
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go/GoPackageInfoApi.java
@@ -0,0 +1,33 @@
+// Copyright 2019 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.go;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+
+/** Contains the metadata for a Go package. Used to generate .gopackage files. */
+@SkylarkModule(
+    name = "GoPackageInfo",
+    doc = "",
+    documented = false,
+    category = SkylarkModuleCategory.PROVIDER)
+public interface GoPackageInfoApi extends StructApi {
+
+  /** Provider for GoPackageInfo objects. */
+  @SkylarkModule(name = "Provider", doc = "", documented = false)
+  public interface Provider extends ProviderApi {}
+}
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 ae0d6f0..325716d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -46,7 +46,6 @@
 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.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.GeneratedExtensionRegistryProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.platform.PlatformBootstrap;
@@ -87,7 +86,13 @@
 import com.google.devtools.build.skydoc.fakebuildapi.apple.FakeAppleCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigGlobalLibrary;
 import com.google.devtools.build.skydoc.fakebuildapi.config.FakeConfigSkylarkCommon;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcInfo;
 import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcModule;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeCcToolchainConfigInfo;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakeGoWrapCcHelper;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyCcLinkParamsProvider;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyWrapCcHelper;
+import com.google.devtools.build.skydoc.fakebuildapi.cpp.FakePyWrapCcInfo;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaCcLinkParamsProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaInfo.FakeJavaInfoProvider;
@@ -527,7 +532,15 @@
     ConfigBootstrap configBootstrap =
         new ConfigBootstrap(
             new FakeConfigSkylarkCommon(), new FakeConfigApi(), new FakeConfigGlobalLibrary());
-    CcBootstrap ccBootstrap = new CcBootstrap(new FakeCcModule());
+    CcBootstrap ccBootstrap =
+        new CcBootstrap(
+            new FakeCcModule(),
+            new FakeCcInfo.Provider(),
+            new FakeCcToolchainConfigInfo.Provider(),
+            new FakePyWrapCcHelper(),
+            new FakeGoWrapCcHelper(),
+            new FakePyWrapCcInfo.Provider(),
+            new FakePyCcLinkParamsProvider.Provider());
     JavaBootstrap javaBootstrap =
         new JavaBootstrap(
             new FakeJavaCommon(),
@@ -589,7 +602,6 @@
     AndroidBinaryDataInfoApi.NAME,
     "ProtoRegistryAspect",
     "JspbInfo",
-    CcInfoApi.NAME,
   };
 
   /**
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
index 8c0e01b..aea062c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/BUILD
@@ -16,8 +16,10 @@
         "//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/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/go",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
         "//third_party:guava",
     ],
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
new file mode 100644
index 0000000..acc9742
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
@@ -0,0 +1,67 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.Environment;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** Fake implementation of {@link CcInfoApi}. */
+public class FakeCcInfo implements CcInfoApi {
+
+  @Override
+  public CcCompilationContextApi getCcCompilationContext() {
+    return null;
+  }
+
+  @Override
+  public CcLinkingContextApi<?> getCcLinkingContext() {
+    return null;
+  }
+
+  @Override
+  public String toProto(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public String toJson(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public void repr(SkylarkPrinter printer) {}
+
+  /** Fake implementation of {@link CcInfoApi.Provider}. */
+  public static class Provider implements CcInfoApi.Provider {
+
+    @Override
+    public CcInfoApi createInfo(
+        Object ccCompilationContext,
+        Object ccLinkingInfo,
+        Location location,
+        Environment environment)
+        throws EvalException {
+      return new FakeCcInfo();
+    }
+
+    @Override
+    public void repr(SkylarkPrinter printer) {}
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
new file mode 100644
index 0000000..6f9207e
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
@@ -0,0 +1,49 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainConfigInfoApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** Fake implementation of {@link CcToolchainConfigInfoApi}. */
+public class FakeCcToolchainConfigInfo implements CcToolchainConfigInfoApi {
+
+  @Override
+  public String getProto() {
+    return null;
+  }
+
+  @Override
+  public String toProto(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public String toJson(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public void repr(SkylarkPrinter printer) {}
+
+  /** Fake implementation of {@link CcToolchainConfigInfoApi.Provider}. */
+  public static class Provider implements CcToolchainConfigInfoApi.Provider {
+
+    @Override
+    public void repr(SkylarkPrinter printer) {}
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
new file mode 100644
index 0000000..84ad6c3
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
@@ -0,0 +1,174 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.TransitiveInfoCollectionApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CompilationInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoCcLinkParamsInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoWrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.GoWrapCcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.WrapCcIncludeProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoContextInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.go.GoPackageInfoApi;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/** Fake implementation of {@link GoWrapCcHelperApi}. */
+public class FakeGoWrapCcHelper
+    implements GoWrapCcHelperApi<
+        FileApi,
+        SkylarkRuleContextApi,
+        CcInfoApi,
+        FeatureConfigurationApi,
+        CcToolchainProviderApi<FeatureConfigurationApi>,
+        CcLinkingContextApi<FileApi>,
+        GoConfigurationApi,
+        GoContextInfoApi,
+        TransitiveInfoCollectionApi,
+        CompilationInfoApi,
+        CcCompilationContextApi,
+        WrapCcIncludeProviderApi> {
+
+  @Override
+  public RunfilesApi skylarkGetGoRunfiles(SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public int getArchIntSize(GoConfigurationApi goConfig) {
+    return 0;
+  }
+
+  @Override
+  public GoContextInfoApi skylarkCollectTransitiveGoContextGopkg(
+      SkylarkRuleContextApi skylarkRuleContext,
+      FileApi export,
+      FileApi pkg,
+      FileApi gopkg,
+      Object skylarkWrapContext,
+      CcInfoApi ccInfo) {
+    return null;
+  }
+
+  @Override
+  public GoWrapCcInfoApi getGoWrapCcInfo(
+      SkylarkRuleContextApi skylarkRuleContext, CcInfoApi ccInfo) {
+    return null;
+  }
+
+  @Override
+  public GoCcLinkParamsInfoApi getGoCcLinkParamsProvider(
+      SkylarkRuleContextApi ruleContext, CcLinkingContextApi<FileApi> ccLinkingContext) {
+    return null;
+  }
+
+  @Override
+  public Tuple<FileApi> createGoCompileActions(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
+      SkylarkList<FileApi> srcs,
+      SkylarkList<TransitiveInfoCollectionApi> deps) {
+    return null;
+  }
+
+  @Override
+  public Tuple<FileApi> createGoCompileActionsGopkg(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
+      SkylarkList<FileApi> srcs,
+      SkylarkList<TransitiveInfoCollectionApi> deps) {
+    return null;
+  }
+
+  @Override
+  public GoPackageInfoApi createTransitiveGopackageInfo(
+      SkylarkRuleContextApi skylarkRuleContext,
+      FileApi skylarkGopkg,
+      FileApi export,
+      FileApi swigOutGo) {
+    return null;
+  }
+
+  @Override
+  public NestedSet<FileApi> getGopackageFiles(
+      SkylarkRuleContextApi skylarkRuleContext, FileApi skylarkGopkg) {
+    return null;
+  }
+
+  @Override
+  public FeatureConfigurationApi skylarkGetFeatureConfiguration(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain) {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet skylarkCollectTransitiveSwigIncludes(
+      SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public CompilationInfoApi skylarkCreateCompileActions(
+      SkylarkRuleContextApi skylarkRuleContext,
+      FeatureConfigurationApi featureConfiguration,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+      FileApi ccFile,
+      FileApi headerFile,
+      SkylarkList<CcCompilationContextApi> depCcCompilationContexts,
+      SkylarkList<String> targetCopts) {
+    return null;
+  }
+
+  @Override
+  public String skylarkGetMangledTargetName(SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public WrapCcIncludeProviderApi getWrapCcIncludeProvider(
+      SkylarkRuleContextApi skylarkRuleContext, SkylarkNestedSet swigIncludes) {
+    return null;
+  }
+
+  @Override
+  public void registerSwigAction(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+      FeatureConfigurationApi featureConfiguration,
+      CcCompilationContextApi wrapperCcCompilationContext,
+      SkylarkNestedSet swigIncludes,
+      FileApi swigSource,
+      SkylarkList<String> subParameters,
+      FileApi ccFile,
+      FileApi headerFile,
+      SkylarkList<FileApi> outputFiles,
+      Object outDir,
+      Object javaDir,
+      SkylarkNestedSet auxiliaryInputs,
+      String swigAttributeName,
+      Object zipTool) {}
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
new file mode 100644
index 0000000..d8e84a5
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
@@ -0,0 +1,50 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyCcLinkParamsProviderApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** Fake implementation of {@link PyCcLinkParamsProviderApi}. */
+public class FakePyCcLinkParamsProvider implements PyCcLinkParamsProviderApi {
+
+  @Override
+  public CcInfoApi getCcInfo() {
+    return null;
+  }
+
+  @Override
+  public String toProto(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public String toJson(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public void repr(SkylarkPrinter printer) {}
+
+  /** Fake implementation of {@link PyCcLinkParamsProviderApi.Provider}. */
+  public static class Provider implements PyCcLinkParamsProviderApi.Provider {
+
+    @Override
+    public void repr(SkylarkPrinter printer) {}
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
new file mode 100644
index 0000000..7010a7f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
@@ -0,0 +1,119 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CompilationInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.FeatureConfigurationApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.WrapCcIncludeProviderApi;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+
+/** Fake implementation of {@link PyWrapCcHelperApi}. */
+public class FakePyWrapCcHelper
+    implements PyWrapCcHelperApi<
+        FileApi,
+        SkylarkRuleContextApi,
+        CcInfoApi,
+        FeatureConfigurationApi,
+        CcToolchainProviderApi<FeatureConfigurationApi>,
+        CompilationInfoApi,
+        CcCompilationContextApi,
+        WrapCcIncludeProviderApi> {
+
+  @Override
+  public SkylarkList<String> getPyExtensionLinkopts(SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet getTransitivePythonSources(
+      SkylarkRuleContextApi skylarkRuleContext, FileApi pyFile) {
+    return null;
+  }
+
+  @Override
+  public RunfilesApi getPythonRunfiles(
+      SkylarkRuleContextApi skylarkRuleContext, SkylarkNestedSet filesToBuild) {
+    return null;
+  }
+
+  @Override
+  public PyWrapCcInfoApi getPyWrapCcInfo(
+      SkylarkRuleContextApi skylarkRuleContext, CcInfoApi ccInfo) {
+    return null;
+  }
+
+  @Override
+  public FeatureConfigurationApi skylarkGetFeatureConfiguration(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain) {
+    return null;
+  }
+
+  @Override
+  public SkylarkNestedSet skylarkCollectTransitiveSwigIncludes(
+      SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public String skylarkGetMangledTargetName(SkylarkRuleContextApi skylarkRuleContext) {
+    return null;
+  }
+
+  @Override
+  public WrapCcIncludeProviderApi getWrapCcIncludeProvider(
+      SkylarkRuleContextApi skylarkRuleContext, SkylarkNestedSet swigIncludes) {
+    return null;
+  }
+
+  @Override
+  public void registerSwigAction(
+      SkylarkRuleContextApi skylarkRuleContext,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+      FeatureConfigurationApi featureConfiguration,
+      CcCompilationContextApi wrapperCcCompilationContext,
+      SkylarkNestedSet swigIncludes,
+      FileApi swigSource,
+      SkylarkList<String> subParameters,
+      FileApi ccFile,
+      FileApi headerFile,
+      SkylarkList<FileApi> outputFiles,
+      Object outDir,
+      Object javaDir,
+      SkylarkNestedSet auxiliaryInputs,
+      String swigAttributeName,
+      Object zipTool) {}
+
+  @Override
+  public CompilationInfoApi skylarkCreateCompileActions(
+      SkylarkRuleContextApi skylarkRuleContext,
+      FeatureConfigurationApi featureConfiguration,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
+      FileApi ccFile,
+      FileApi headerFile,
+      SkylarkList<CcCompilationContextApi> depCcCompilationContexts,
+      SkylarkList<String> targetCopts) {
+    return null;
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
new file mode 100644
index 0000000..8f2071f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
@@ -0,0 +1,51 @@
+// Copyright 2019 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.cpp;
+
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcHelperApi;
+import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcInfoApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.EvalException;
+
+/** Fake implementation of {@link PyWrapCcHelperApi}. */
+public class FakePyWrapCcInfo implements PyWrapCcInfoApi {
+
+  @Override
+  public CcInfoApi getCcInfo() {
+    return null;
+  }
+
+  @Override
+  public void repr(SkylarkPrinter printer) {}
+
+  @Override
+  public String toProto(Location loc) throws EvalException {
+    return null;
+  }
+
+  @Override
+  public String toJson(Location loc) throws EvalException {
+    return null;
+  }
+
+  /** Fake implementation of {@link PyWrapCcInfoApi.Provider}. */
+  public static class Provider implements PyWrapCcInfoApi.Provider {
+
+    @Override
+    public void repr(SkylarkPrinter printer) {}
+  }
+}