Add implementation to removed methods to address https://github.com/bazelbuild/bazel/issues/8226
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 119de1b..c9114de 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -748,6 +748,7 @@
         ":python-rules",
         ":testing-support-rules",
         ":util",
+        "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
         "//src/main/java/com/google/devtools/build/lib/actions",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream",
         "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 5201065..9d8b779 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -14,23 +14,54 @@
 
 package com.google.devtools.build.lib.bazel.rules.cpp;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
+import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
+import com.google.devtools.build.lib.analysis.skylark.BazelStarlarkContext;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
+import com.google.devtools.build.lib.rules.cpp.CcCommon;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper;
+import com.google.devtools.build.lib.rules.cpp.CcCompilationHelper.CompilationInfo;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationOutputs;
+import com.google.devtools.build.lib.rules.cpp.CcLinkingHelper;
+import com.google.devtools.build.lib.rules.cpp.CcLinkingHelper.LinkingInfo;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingOutputs;
 import com.google.devtools.build.lib.rules.cpp.CcModule;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainConfigInfo;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
+import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
+import com.google.devtools.build.lib.rules.cpp.CppFileTypes;
+import com.google.devtools.build.lib.rules.cpp.FdoContext;
 import com.google.devtools.build.lib.rules.cpp.FeatureConfigurationForStarlark;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.BazelCcModuleApi;
+import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
+import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Runtime;
 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;
+import com.google.devtools.build.lib.util.FileTypeSet;
+import com.google.devtools.build.lib.util.Pair;
+import com.google.devtools.build.lib.vfs.PathFragment;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * A module that contains Skylark utilities for C++ support.
@@ -40,70 +71,220 @@
  */
 public class BazelCcModule extends CcModule
     implements BazelCcModuleApi<
-        SkylarkActionFactory,
-        Artifact,
-        SkylarkRuleContext,
-        CcToolchainProvider,
-        FeatureConfigurationForStarlark,
-        CcCompilationContext,
-        CcCompilationOutputs,
-        CcLinkingOutputs,
-        CcLinkingContext,
-        LibraryToLink,
-        CcToolchainVariables,
-        CcToolchainConfigInfo> {
+    Artifact,
+    SkylarkRuleContext,
+    SkylarkActionFactory,
+    CcToolchainProvider,
+    FeatureConfigurationForStarlark,
+    CcCompilationContext,
+    CcCompilationOutputs,
+    CcLinkingContext,
+    LibraryToLink,
+    CcToolchainVariables,
+    CcToolchainConfigInfo> {
+  public static final FileTypeSet ALL_C_CLASS_SOURCE =
+      FileTypeSet.of(
+          CppFileTypes.CPP_SOURCE,
+          CppFileTypes.C_SOURCE,
+          CppFileTypes.OBJCPP_SOURCE,
+          CppFileTypes.OBJC_SOURCE);
 
   @Override
   public Tuple<Object> compile(
-      SkylarkActionFactory skylarkActionFactoryApi,
+      SkylarkActionFactory actions,
       FeatureConfigurationForStarlark skylarkFeatureConfiguration,
       CcToolchainProvider skylarkCcToolchainProvider,
       SkylarkList<Artifact> sources,
       SkylarkList<Artifact> publicHeaders,
       SkylarkList<Artifact> privateHeaders,
-      SkylarkList<String> includes,
-      SkylarkList<String> quoteIncludes,
-      SkylarkList<String> systemIncludes,
-      SkylarkList<String> userCompileFlags,
+      SkylarkList<String> skylarkIncludes,
+      SkylarkList<String> skylarkUserCompileFlags,
       SkylarkList<CcCompilationContext> ccCompilationContexts,
       String name,
-      boolean disallowPicOutputs,
-      boolean disallowNopicOutputs)
+      Location location)
       throws EvalException, InterruptedException {
-    return null;
+    CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
+    FeatureConfigurationForStarlark featureConfiguration =
+        convertFromNoneable(skylarkFeatureConfiguration, null);
+    Pair<List<Artifact>, List<Artifact>> separatedHeadersAndSources =
+        separateSourcesFromHeaders(sources);
+    FdoContext fdoContext = ccToolchainProvider.getFdoContext();
+    // TODO(plf): Need to flatten the nested set to convert the Strings to PathFragment. This could
+    // be avoided if path fragments are ever added to Skylark or in the C++ code we take Strings
+    // instead of PathFragments.
+    List<String> includeDirs = convertSkylarkListOrNestedSetToList(skylarkIncludes, String.class);
+
+    validateExtensions(
+        location,
+        "srcs",
+        sources,
+        ALL_C_CLASS_SOURCE,
+        FileTypeSet.of(CppFileTypes.CPP_SOURCE, CppFileTypes.C_SOURCE));
+    validateExtensions(
+        location,
+        "public_hdrs",
+        publicHeaders,
+        FileTypeSet.of(CppFileTypes.CPP_HEADER),
+        FileTypeSet.of(CppFileTypes.CPP_HEADER));
+    validateExtensions(
+        location,
+        "private_hdrs",
+        privateHeaders,
+        FileTypeSet.of(CppFileTypes.CPP_HEADER),
+        FileTypeSet.of(CppFileTypes.CPP_HEADER));
+
+    Label label = getCallerLabel(location, actions, name);
+    CcCompilationHelper helper =
+        new CcCompilationHelper(
+            actions.asActionRegistry(location, actions),
+            actions.getActionConstructionContext(),
+            label,
+            /* grepIncludes= */ null,
+            BazelCppSemantics.INSTANCE,
+            featureConfiguration.getFeatureConfiguration(),
+            ccToolchainProvider,
+            fdoContext)
+            .addPublicHeaders(publicHeaders)
+            .addIncludeDirs(
+                includeDirs.stream()
+                    .map(PathFragment::create)
+                    .collect(ImmutableList.toImmutableList()))
+            .addPrivateHeaders(separatedHeadersAndSources.first)
+            .addSources(separatedHeadersAndSources.second)
+            .addCcCompilationContexts(ccCompilationContexts)
+            .setCopts(skylarkUserCompileFlags);
+
+    try {
+      CompilationInfo compilationInfo = helper.compile();
+      return Tuple.of(
+          compilationInfo.getCcCompilationContext(), compilationInfo.getCcCompilationOutputs());
+    } catch (RuleErrorException e) {
+      throw new EvalException(location, e);
+    }
   }
 
   @Override
-  public CcLinkingContext createLinkingContextFromCompilationOutputs(
-      SkylarkActionFactory skylarkActionFactoryApi,
+  public Tuple<Object> createLinkingContextFromCompilationOutputs(
+      SkylarkActionFactory actions,
       FeatureConfigurationForStarlark skylarkFeatureConfiguration,
       CcToolchainProvider skylarkCcToolchainProvider,
       CcCompilationOutputs compilationOutputs,
-      SkylarkList userLinkFlags,
+      SkylarkList<String> skylarkUserLinkFlags,
+      SkylarkList<CcLinkingContext> linkingContexts,
       String name,
-      String language,
-      boolean alwayslink,
-      SkylarkList nonCodeInputs,
-      boolean disallowStaticLibraries,
-      boolean disallowDynamicLibraries)
+      Location location,
+      StarlarkContext starlarkContext)
       throws InterruptedException, EvalException {
-    return null;
+    CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
+    FeatureConfigurationForStarlark featureConfiguration =
+        convertFromNoneable(skylarkFeatureConfiguration, null);
+    Label label = getCallerLabel(location, actions, name);
+    FdoContext fdoContext = ccToolchainProvider.getFdoContext();
+    CcLinkingHelper helper =
+        new CcLinkingHelper(
+            actions.getActionConstructionContext().getRuleErrorConsumer(),
+            label,
+            actions.asActionRegistry(location, actions),
+            actions.getActionConstructionContext(),
+            BazelCppSemantics.INSTANCE,
+            featureConfiguration.getFeatureConfiguration(),
+            ccToolchainProvider,
+            fdoContext,
+            actions.getActionConstructionContext().getConfiguration(),
+            actions
+                .getActionConstructionContext()
+                .getConfiguration()
+                .getFragment(CppConfiguration.class),
+            ((BazelStarlarkContext) starlarkContext).getSymbolGenerator())
+            .addLinkopts(skylarkUserLinkFlags)
+            .addCcLinkingContexts(linkingContexts);
+    try {
+      CcLinkingOutputs ccLinkingOutputs = CcLinkingOutputs.EMPTY;
+      ImmutableList<LibraryToLink> libraryToLink = ImmutableList.of();
+      if (!compilationOutputs.isEmpty()) {
+        ccLinkingOutputs = helper.link(compilationOutputs);
+        if (!ccLinkingOutputs.isEmpty()) {
+          libraryToLink =
+              ImmutableList.of(ccLinkingOutputs.getLibraryToLink());
+        }
+      }
+      CcLinkingContext linkingContext =
+          helper.buildCcLinkingContextFromLibrariesToLink(
+              libraryToLink, CcCompilationContext.EMPTY);
+      return Tuple.of(
+          CcLinkingContext.merge(
+              ImmutableList.<CcLinkingContext>builder()
+                  .add(linkingContext)
+                  .addAll(linkingContexts)
+                  .build()),
+          ccLinkingOutputs);
+    } catch (RuleErrorException e) {
+      throw new EvalException(location, e);
+    }
   }
 
-  @Override
-  public CcLinkingOutputs link(
-      SkylarkActionFactory skylarkActionFactoryApi,
-      FeatureConfigurationForStarlark skylarkFeatureConfiguration,
-      CcToolchainProvider skylarkCcToolchainProvider,
-      Object compilationOutputs,
-      SkylarkList userLinkFlags,
-      SkylarkList linkingContexts,
-      String name,
-      String language,
-      String outputType,
-      boolean linkDepsStatically,
-      SkylarkList nonCodeInputs)
-      throws InterruptedException, EvalException {
-    return null;
+  @SuppressWarnings("unchecked")
+  protected static <T> List<T> convertSkylarkListOrNestedSetToList(Object o, Class<T> type) {
+    return o instanceof SkylarkNestedSet
+        ? ((SkylarkNestedSet) o).getSet(type).toList()
+        : ((SkylarkList) o).getImmutableList();
+  }
+
+  private static Pair<List<Artifact>, List<Artifact>> separateSourcesFromHeaders(
+      Iterable<Artifact> artifacts) {
+    List<Artifact> headers = new ArrayList<>();
+    List<Artifact> sources = new ArrayList<>();
+    for (Artifact artifact : artifacts) {
+      if (CppFileTypes.CPP_HEADER.matches(artifact.getExecPath())) {
+        headers.add(artifact);
+      } else {
+        sources.add(artifact);
+      }
+    }
+    return Pair.of(headers, sources);
+  }
+
+
+  @SuppressWarnings("unchecked")
+  protected static <T> NestedSet<T> convertSkylarkListOrNestedSetToNestedSet(
+      Object o, Class<T> type) {
+    return o instanceof SkylarkNestedSet
+        ? ((SkylarkNestedSet) o).getSet(type)
+        : NestedSetBuilder.wrap(Order.COMPILE_ORDER, (SkylarkList<T>) o);
+  }
+
+  private void validateExtensions(
+      Location location,
+      String paramName,
+      List<Artifact> files,
+      FileTypeSet validFileTypeSet,
+      FileTypeSet fileTypeForErrorMessage)
+      throws EvalException {
+    for (Artifact file : files) {
+      if (!validFileTypeSet.matches(file.getFilename())) {
+        throw new EvalException(
+            location,
+            String.format(
+                "'%s' has wrong extension. The list of possible extensions for '"
+                    + paramName
+                    + "' are: %s",
+                file.getExecPathString(),
+                Joiner.on(",").join(fileTypeForErrorMessage.getExtensions())));
+      }
+    }
+  }
+
+  protected Label getCallerLabel(Location location, SkylarkActionFactory actions, String name)
+      throws EvalException {
+    Label label;
+    try {
+      label =
+          Label.create(
+              actions.getActionConstructionContext().getActionOwner().getLabel().getPackageName(),
+              name);
+    } catch (LabelSyntaxException e) {
+      throw new EvalException(location, e);
+    }
+    return label;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
index b01da22..bda6b3e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -21,6 +22,8 @@
 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.StarlarkContext;
+import com.google.devtools.build.lib.syntax.Environment;
 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;
@@ -31,365 +34,187 @@
 @SkylarkModule(
     name = "cc_common",
     doc = "Utilities for C++ compilation, linking, and command line generation.")
+// TODO(b/111365281): Add experimental field once it's available.
 public interface BazelCcModuleApi<
-        SkylarkActionFactoryT extends SkylarkActionFactoryApi,
-        FileT extends FileApi,
-        SkylarkRuleContextT extends SkylarkRuleContextApi,
-        CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
-        FeatureConfigurationT extends FeatureConfigurationApi,
-        CompilationContextT extends CcCompilationContextApi,
-        CompilationOutputsT extends CcCompilationOutputsApi<FileT>,
-        LinkingOutputsT extends CcLinkingOutputsApi<FileT>,
-        LinkingContextT extends CcLinkingContextApi,
-        LibraryToLinkT extends LibraryToLinkApi,
-        CcToolchainVariablesT extends CcToolchainVariablesApi,
-        CcToolchainConfigInfoT extends CcToolchainConfigInfoApi>
+    FileT extends FileApi,
+    SkylarkRuleContextT extends SkylarkRuleContextApi,
+    SkylarkActionFactoryT extends SkylarkActionFactoryApi,
+    CcToolchainProviderT extends CcToolchainProviderApi,
+    FeatureConfigurationT extends FeatureConfigurationApi,
+    CcCompilationContextT extends CcCompilationContextApi,
+    CcCompilationOutputsT extends CcCompilationOutputsApi,
+    LinkingContextT extends CcLinkingContextApi,
+    LibraryToLinkT extends LibraryToLinkApi,
+    CcToolchainVariablesT extends CcToolchainVariablesApi,
+    CcToolchainConfigInfoT extends CcToolchainConfigInfoApi>
     extends CcModuleApi<
-        FileT,
-        CcToolchainProviderT,
-        FeatureConfigurationT,
-        CompilationContextT,
-        LinkingContextT,
-        LibraryToLinkT,
-        CcToolchainVariablesT,
-        SkylarkRuleContextT,
-        CcToolchainConfigInfoT> {
+    FileT,
+    CcToolchainProviderT,
+    FeatureConfigurationT,
+    CcCompilationContextT,
+    LinkingContextT,
+    LibraryToLinkT,
+    CcToolchainVariablesT,
+    SkylarkRuleContextT,
+    CcToolchainConfigInfoT> {
 
   @SkylarkCallable(
       name = "compile",
       documented = false,
+      useLocation = true,
       parameters = {
-        @Param(
-            name = "actions",
-            type = SkylarkActionFactoryApi.class,
-            positional = false,
-            named = true,
-            doc = "<code>actions</code> object."),
-        @Param(
-            name = "feature_configuration",
-            doc = "<code>feature_configuration</code> to be queried.",
-            positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
-        @Param(
-            name = "cc_toolchain",
-            doc = "<code>CcToolchainInfo</code> provider to be used.",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(
-            name = "srcs",
-            doc = "The list of source files to be compiled.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "public_hdrs",
-            doc =
-                "List of headers needed for compilation of srcs and may be included by dependent "
-                    + "rules transitively.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "private_hdrs",
-            doc =
-                "List of headers needed for compilation of srcs and NOT to be included by"
-                    + " dependent rules.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "includes",
-            doc =
-                "Search paths for header files referenced both by angle bracket and quotes. "
-                    + "Usually passed with -I. Propagated to dependents transitively.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "quote_includes",
-            doc =
-                "Search paths for header files referenced by quotes, "
-                    + "e.g. #include \"foo/bar/header.h\". They can be either relative to the exec "
-                    + "root or absolute. Usually passed with -iquote. Propagated to dependents "
-                    + "transitively.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "system_includes",
-            doc =
-                "Search paths for header files referenced by angle brackets, e.g. #include"
-                    + " <foo/bar/header.h>. They can be either relative to the exec root or"
-                    + " absolute. Usually passed with -isystem. Propagated to dependents "
-                    + "transitively.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "user_compile_flags",
-            doc = "Additional list of compilation options.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "compilation_contexts",
-            doc = "Headers from dependencies used for compilation.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "name",
-            doc =
-                "This is used for naming the output artifacts of actions created by this "
-                    + "method.",
-            positional = false,
-            named = true,
-            type = String.class),
-        @Param(
-            name = "disallow_pic_outputs",
-            doc = "Whether PIC outputs should be created.",
-            positional = false,
-            named = true,
-            defaultValue = "False",
-            type = Boolean.class),
-        @Param(
-            name = "disallow_nopic_outputs",
-            doc = "Whether NOPIC outputs should be created.",
-            positional = false,
-            named = true,
-            defaultValue = "False",
-            type = Boolean.class)
+          @Param(
+              name = "actions",
+              type = SkylarkActionFactoryApi.class,
+              positional = false,
+              named = true,
+              doc = "<code>actions</code> object."),
+          @Param(
+              name = "feature_configuration",
+              doc = "Feature configuration to be queried.",
+              positional = false,
+              named = true,
+              type = FeatureConfigurationApi.class),
+          @Param(
+              name = "cc_toolchain",
+              doc = "C++ toolchain provider to be used.",
+              positional = false,
+              named = true,
+              type = CcToolchainProviderApi.class),
+          @Param(
+              name = "srcs",
+              doc = "The list of source files to be compiled, see cc_library.srcs",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "public_hdrs",
+              doc = "The list of public headers to be provided to dependents, see cc_library.hdrs",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "private_hdrs",
+              doc =
+                  "List of headers needed for compilation of srcs and NOT to be included by"
+                      + " dependent rules.",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "includes",
+              doc =
+                  "Search paths for header files referenced both by angle bracket and quotes. "
+                      + "Usually passed with -I. Propagated to dependents transitively.",
+              positional = false,
+              named = true,
+              noneable = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "user_compile_flags",
+              doc = "Additional list of compiler options.",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "compilation_contexts",
+              doc = "compilation_context instances affecting compilation, e.g. from dependencies",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "name",
+              doc =
+                  "This is used for naming the output artifacts of actions created by this "
+                      + "method.",
+              positional = false,
+              named = true,
+              type = String.class),
       })
   Tuple<Object> compile(
-      SkylarkActionFactoryT skylarkActionFactoryApi,
+      SkylarkActionFactoryT skylarkActionFactory,
       FeatureConfigurationT skylarkFeatureConfiguration,
       CcToolchainProviderT skylarkCcToolchainProvider,
       SkylarkList<FileT> sources,
       SkylarkList<FileT> publicHeaders,
       SkylarkList<FileT> privateHeaders,
-      SkylarkList<String> includes,
-      SkylarkList<String> quoteIncludes,
-      SkylarkList<String> systemIncludes,
-      SkylarkList<String> userCompileFlags,
-      SkylarkList<CompilationContextT> ccCompilationContexts,
+      SkylarkList<String> skylarkIncludes,
+      SkylarkList<String> skylarkUserCompileFlags,
+      SkylarkList<CcCompilationContextT> ccCompilationContexts,
       String name,
-      boolean disallowPicOutputs,
-      boolean disallowNopicOutputs)
+      Location location)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
-      name = "link",
-      documented = false,
-      parameters = {
-        @Param(
-            name = "actions",
-            type = SkylarkActionFactoryApi.class,
-            positional = false,
-            named = true,
-            doc = "<code>actions</code> object."),
-        @Param(
-            name = "feature_configuration",
-            doc = "<code>feature_configuration</code> to be queried.",
-            positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
-        @Param(
-            name = "cc_toolchain",
-            doc = "<code>CcToolchainInfo</code> provider to be used.",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(
-            name = "compilation_outputs",
-            doc = "Compilation outputs containing object files to link.",
-            positional = false,
-            named = true,
-            defaultValue = "None",
-            noneable = true,
-            allowedTypes = {
-              @ParamType(type = NoneType.class),
-              @ParamType(type = SkylarkList.class),
-              @ParamType(type = SkylarkNestedSet.class)
-            }),
-        @Param(
-            name = "user_link_flags",
-            doc = "Additional list of linker options.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            noneable = true,
-            type = SkylarkList.class),
-        @Param(
-            name = "linking_contexts",
-            doc =
-                "Libraries from dependencies. These libraries will be linked into the output "
-                    + "artifact of the link() call, be it a binary or a library.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "name",
-            doc =
-                "This is used for naming the output artifacts of actions created by this "
-                    + "method.",
-            positional = false,
-            named = true,
-            type = String.class),
-        @Param(
-            name = "language",
-            doc = "Can be one of C++, objc or objc++.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "'C++'",
-            type = String.class),
-        @Param(
-            name = "output_type",
-            doc = "Can be either 'executable' or 'shared_library'.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "'executable'",
-            type = String.class),
-        @Param(
-            name = "link_deps_statically",
-            doc = " True to link dependencies statically, False dynamically.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "True",
-            type = Boolean.class),
-        @Param(
-            name = "non_code_inputs",
-            doc = "For additional inputs to the linking action, e.g.: linking scripts.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-      })
-  LinkingOutputsT link(
-      SkylarkActionFactoryT skylarkActionFactoryApi,
-      FeatureConfigurationT skylarkFeatureConfiguration,
-      CcToolchainProviderT skylarkCcToolchainProvider,
-      Object compilationOutputs,
-      SkylarkList<String> userLinkFlags,
-      SkylarkList<LinkingContextT> linkingContexts,
-      String name,
-      String language,
-      String outputType,
-      boolean linkDepsStatically,
-      SkylarkList<FileT> nonCodeInputs)
-      throws InterruptedException, EvalException;
-
-  @SkylarkCallable(
       name = "create_linking_context_from_compilation_outputs",
       documented = false,
+      useLocation = true,
+      useContext = true,
       parameters = {
-        @Param(
-            name = "actions",
-            type = SkylarkActionFactoryApi.class,
-            positional = false,
-            named = true,
-            doc = "<code>actions</code> object."),
-        @Param(
-            name = "feature_configuration",
-            doc = "<code>feature_configuration</code> to be queried.",
-            positional = false,
-            named = true,
-            type = FeatureConfigurationApi.class),
-        @Param(
-            name = "cc_toolchain",
-            doc = "<code>CcToolchainInfo</code> provider to be used.",
-            positional = false,
-            named = true,
-            type = CcToolchainProviderApi.class),
-        @Param(
-            name = "compilation_outputs",
-            doc = "Compilation outputs containing object files to link.",
-            positional = false,
-            named = true,
-            type = CcCompilationOutputsApi.class),
-        @Param(
-            name = "user_link_flags",
-            doc = "Additional list of linking options.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            noneable = true,
-            type = SkylarkList.class),
-        @Param(
-            name = "name",
-            doc =
-                "This is used for naming the output artifacts of actions created by this "
-                    + "method.",
-            positional = false,
-            named = true,
-            type = String.class),
-        @Param(
-            name = "language",
-            doc = "Can be one of C++, objc or objc++.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "'C++'",
-            type = String.class),
-        @Param(
-            name = "alwayslink",
-            doc = "Whether this library should always be linked.",
-            positional = false,
-            named = true,
-            noneable = true,
-            defaultValue = "False",
-            type = Boolean.class),
-        @Param(
-            name = "non_code_inputs",
-            doc = "For additional inputs to the linking action, e.g.: linking scripts.",
-            positional = false,
-            named = true,
-            defaultValue = "[]",
-            type = SkylarkList.class),
-        @Param(
-            name = "disallow_static_libraries",
-            doc = "Whether static libraries should be created.",
-            positional = false,
-            named = true,
-            defaultValue = "False",
-            type = Boolean.class),
-        @Param(
-            name = "disallow_dynamic_libraries",
-            doc = "Whether dynamic libraries should be created.",
-            positional = false,
-            named = true,
-            defaultValue = "False",
-            type = Boolean.class)
+          @Param(
+              name = "actions",
+              type = SkylarkActionFactoryApi.class,
+              positional = false,
+              named = true,
+              doc = "<code>actions</code> object."),
+          @Param(
+              name = "feature_configuration",
+              doc = "Feature configuration to be queried.",
+              positional = false,
+              named = true,
+              type = FeatureConfigurationApi.class),
+          @Param(
+              name = "cc_toolchain",
+              doc = "C++ toolchain provider to be used.",
+              positional = false,
+              named = true,
+              type = CcToolchainProviderApi.class),
+          @Param(
+              name = "compilation_outputs",
+              doc = "Compilation outputs containing object files to link.",
+              positional = false,
+              named = true,
+              type = CcCompilationOutputsApi.class),
+          @Param(
+              name = "user_link_flags",
+              doc = "Additional list of linking options.",
+              positional = false,
+              named = true,
+              defaultValue = "[]",
+              noneable = true,
+              type = SkylarkList.class),
+          @Param(
+              name = "linking_contexts",
+              doc = "linking_context instances affecting linking, e.g. from dependencies",
+              positional = false,
+              named = true,
+              noneable = true,
+              defaultValue = "[]",
+              type = SkylarkList.class),
+          @Param(
+              name = "name",
+              doc =
+                  "This is used for naming the output artifacts of actions created by this "
+                      + "method.",
+              positional = false,
+              named = true,
+              type = String.class),
       })
-  LinkingContextT createLinkingContextFromCompilationOutputs(
-      SkylarkActionFactoryT skylarkActionFactoryApi,
+  Tuple<Object> createLinkingContextFromCompilationOutputs(
+      SkylarkActionFactoryT skylarkActionFactory,
       FeatureConfigurationT skylarkFeatureConfiguration,
       CcToolchainProviderT skylarkCcToolchainProvider,
-      CompilationOutputsT compilationOutputs,
+      CcCompilationOutputsT ccCompilationOutputs,
       SkylarkList<String> userLinkFlags,
+      SkylarkList<LinkingContextT> skylarkCcLinkingContexts,
       String name,
-      String language,
-      boolean alwayslink,
-      SkylarkList<FileT> nonCodeInputs,
-      boolean disallowStaticLibraries,
-      boolean disallowDynamicLibraries)
+      Location location,
+      StarlarkContext starlarkContext)
       throws InterruptedException, EvalException;
 }
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 88c36c9..96c18ca 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
@@ -25,34 +25,32 @@
  */
 public class CcBootstrap implements Bootstrap {
   private final BazelCcModuleApi<
-          ? extends SkylarkActionFactoryApi,
-          ? extends FileApi,
-          ? extends SkylarkRuleContextApi,
-          ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
-          ? extends FeatureConfigurationApi,
-          ? extends CcCompilationContextApi,
-          ? extends CcCompilationOutputsApi<? extends FileApi>,
-          ? extends CcLinkingOutputsApi<? extends FileApi>,
-          ? extends CcLinkingContextApi,
-          ? extends LibraryToLinkApi,
-          ? extends CcToolchainVariablesApi,
-          ? extends CcToolchainConfigInfoApi>
+      ? extends FileApi,
+      ? extends SkylarkRuleContextApi,
+      ? extends SkylarkActionFactoryApi,
+      ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
+      ? extends FeatureConfigurationApi,
+      ? extends CcCompilationContextApi,
+      ? extends CcCompilationOutputsApi,
+      ? extends CcLinkingContextApi,
+      ? extends LibraryToLinkApi,
+      ? extends CcToolchainVariablesApi,
+      ? extends CcToolchainConfigInfoApi>
       ccModule;
 
   public CcBootstrap(
       BazelCcModuleApi<
-              ? extends SkylarkActionFactoryApi,
-              ? extends FileApi,
-              ? extends SkylarkRuleContextApi,
-              ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
-              ? extends FeatureConfigurationApi,
-              ? extends CcCompilationContextApi,
-              ? extends CcCompilationOutputsApi<? extends FileApi>,
-              ? extends CcLinkingOutputsApi<? extends FileApi>,
-              ? extends CcLinkingContextApi,
-              ? extends LibraryToLinkApi,
-              ? extends CcToolchainVariablesApi,
-              ? extends CcToolchainConfigInfoApi>
+          ? extends FileApi,
+          ? extends SkylarkRuleContextApi,
+          ? extends SkylarkActionFactoryApi,
+          ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
+          ? extends FeatureConfigurationApi,
+          ? extends CcCompilationContextApi,
+          ? extends CcCompilationOutputsApi,
+          ? extends CcLinkingContextApi,
+          ? extends LibraryToLinkApi,
+          ? extends CcToolchainVariablesApi,
+          ? extends CcToolchainConfigInfoApi>
           ccModule) {
     this.ccModule = ccModule;
   }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index 4e67320..b4110ab 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -42,14 +42,13 @@
 /** Fake implementation of {@link CcModuleApi}. */
 public class FakeCcModule
     implements BazelCcModuleApi<
-        SkylarkActionFactoryApi,
         FileApi,
         SkylarkRuleContextApi,
+        SkylarkActionFactoryApi,
         CcToolchainProviderApi<FeatureConfigurationApi>,
         FeatureConfigurationApi,
         CcCompilationContextApi,
         CcCompilationOutputsApi<FileApi>,
-        CcLinkingOutputsApi<FileApi>,
         CcLinkingContextApi,
         LibraryToLinkApi,
         CcToolchainVariablesApi,
@@ -178,47 +177,25 @@
       SkylarkList<FileApi> publicHeaders,
       SkylarkList<FileApi> privateHeaders,
       SkylarkList<String> includes,
-      SkylarkList<String> quoteIncludes,
-      SkylarkList<String> systemIncludes,
       SkylarkList<String> userCompileFlags,
       SkylarkList<CcCompilationContextApi> ccCompilationContexts,
       String name,
-      boolean disallowPicOutputs,
-      boolean disallowNopicOutputs)
+      Location location)
       throws EvalException, InterruptedException {
     return null;
   }
 
   @Override
-  public CcLinkingContextApi createLinkingContextFromCompilationOutputs(
+  public Tuple<Object> createLinkingContextFromCompilationOutputs(
       SkylarkActionFactoryApi skylarkActionFactoryApi,
       FeatureConfigurationApi skylarkFeatureConfiguration,
       CcToolchainProviderApi<FeatureConfigurationApi> skylarkCcToolchainProvider,
       CcCompilationOutputsApi<FileApi> compilationOutputs,
       SkylarkList<String> userLinkFlags,
+      SkylarkList<CcLinkingContextApi> ccCompilationContexts,
       String name,
-      String language,
-      boolean alwayslink,
-      SkylarkList<FileApi> nonCodeInputs,
-      boolean disallowStaticLibraries,
-      boolean disallowDynamicLibraries)
-      throws InterruptedException, EvalException {
-    return null;
-  }
-
-  @Override
-  public CcLinkingOutputsApi<FileApi> link(
-      SkylarkActionFactoryApi skylarkActionFactoryApi,
-      FeatureConfigurationApi skylarkFeatureConfiguration,
-      CcToolchainProviderApi<FeatureConfigurationApi> skylarkCcToolchainProvider,
-      Object compilationOutputs,
-      SkylarkList<String> userLinkFlags,
-      SkylarkList<CcLinkingContextApi> linkingContexts,
-      String name,
-      String language,
-      String outputType,
-      boolean linkDepsStatically,
-      SkylarkList<FileApi> nonCodeInputs)
+      Location location,
+      StarlarkContext starlarkContext)
       throws InterruptedException, EvalException {
     return null;
   }