bazel syntax: disallow NestedSet return type in @SkylarkCallable methods

This change causes the processor for @SkylarkCallable annotations to disallow
a declared return type that provably contains no values acceptable by
Starlark.fromJava, by rejecting final types that do not implement
StarlarkValue, String, Integer, Boolean, List, or Map.

In particular, this disallows a return type of NestedSet, and the bulk of
the change is a tedious manual conversion of all such functions to return a
SkylarkNestedSet (aka and soon to be renamed "depset") with an explicit
type symbol. If you have ritalin, take some now.

Previously, the wrapping of NestedSet<T> to depset was done implicitly by
the interpreter, which dug the type argument T out of the representation
of the program for use in the type symbol. This was too clever: widening
the return type to Object (for example to accommodate depset+None) would
change the behavior of the program in surprising ways. Also, the interpreter
should not depend on depset, a Bazelism. The implicit conversion is now removed.

In cases where the Java code relies on function f returning a NestedSet,
we renamed the @SkylarkCallable-annotated function to fForStarlark and made
its implementation delegate to the existing function f then wrap its result
in a depset. Where possible, the visibility of f was reduced: only the
annotated methods need be public.

PiperOrigin-RevId: 281792571
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/FileProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/FileProvider.java
index b94ef10..d71cf86 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/FileProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/FileProvider.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.FileProviderApi;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /**
  * A representation of the concept "this transitive info provider builds these files".
@@ -42,20 +43,23 @@
   /**
    * Returns the set of artifacts that are the "output" of this rule.
    *
-   * <p>The term "output" is somewhat hazily defined; it is vaguely the set of files that are
-   * passed on to dependent rules that list the rule in their {@code srcs} attribute and the
-   * set of files that are built when a rule is mentioned on the command line. It does
-   * <b>not</b> include the runfiles; that is the bailiwick of {@code FilesToRunProvider}.
+   * <p>The term "output" is somewhat hazily defined; it is vaguely the set of files that are passed
+   * on to dependent rules that list the rule in their {@code srcs} attribute and the set of files
+   * that are built when a rule is mentioned on the command line. It does <b>not</b> include the
+   * runfiles; that is the bailiwick of {@code FilesToRunProvider}.
    *
    * <p>Note that the above definition is somewhat imprecise; in particular, when a rule is
-   * mentioned on the command line, some other files are also built
-   * {@code TopLevelArtifactHelper} and dependent rules are free to filter this set of artifacts
-   * e.g. based on their extension.
+   * mentioned on the command line, some other files are also built {@code TopLevelArtifactHelper}
+   * and dependent rules are free to filter this set of artifacts e.g. based on their extension.
    *
    * <p>Also, some rules may generate artifacts that are not listed here by way of defining other
    * implicit targets, for example, deploy jars.
    */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getFilesToBuildForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, filesToBuild);
+  }
+
   public NestedSet<Artifact> getFilesToBuild() {
     return filesToBuild;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index 2fd9ef9..0efe6b5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -39,6 +39,8 @@
 import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SymlinkEntryApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.BufferedReader;
@@ -336,6 +338,10 @@
    * pruning manifest candidates.
    */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getArtifactsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, getArtifacts());
+  }
+
   public NestedSet<Artifact> getArtifacts() {
     NestedSetBuilder<Artifact> allArtifacts = NestedSetBuilder.stableOrder();
     allArtifacts.addTransitive(unconditionalArtifacts);
@@ -347,11 +353,19 @@
 
   /** Returns the symlinks. */
   @Override
+  public SkylarkNestedSet /*<SymlinkEntry>*/ getSymlinksForStarlark() {
+    return SkylarkNestedSet.of(SymlinkEntry.class, symlinks);
+  }
+
   public NestedSet<SymlinkEntry> getSymlinks() {
     return symlinks;
   }
 
   @Override
+  public SkylarkNestedSet /*<String>*/ getEmptyFilenamesForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, getEmptyFilenames());
+  }
+
   public NestedSet<String> getEmptyFilenames() {
     Set<PathFragment> manifestKeys =
         Streams.concat(
@@ -574,6 +588,10 @@
 
   /** Returns the root symlinks. */
   @Override
+  public SkylarkNestedSet /*<SymlinkEntry>*/ getRootSymlinksForStarlark() {
+    return SkylarkNestedSet.of(SymlinkEntry.class, rootSymlinks);
+  }
+
   public NestedSet<SymlinkEntry> getRootSymlinks() {
     return rootSymlinks;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
index 19e4527..051cc78 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidAssetsInfo.java
@@ -110,6 +110,10 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<ParsedAndroidAssets>*/ getDirectParsedAssetsForStarlark() {
+    return SkylarkNestedSet.of(ParsedAndroidAssets.class, directParsedAssets);
+  }
+
   public NestedSet<ParsedAndroidAssets> getDirectParsedAssets() {
     return directParsedAssets;
   }
@@ -125,16 +129,28 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<ParsedAndroidAssets>*/ getTransitiveParsedAssetsForStarlark() {
+    return SkylarkNestedSet.of(ParsedAndroidAssets.class, transitiveParsedAssets);
+  }
+
   public NestedSet<ParsedAndroidAssets> getTransitiveParsedAssets() {
     return transitiveParsedAssets;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getAssetsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveAssets);
+  }
+
   public NestedSet<Artifact> getAssets() {
     return transitiveAssets;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getSymbolsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveSymbols);
+  }
+
   public NestedSet<Artifact> getSymbols() {
     return transitiveSymbols;
   }
@@ -146,7 +162,11 @@
   }
 
   @Override
-  public NestedSet<Artifact> getCompiledSymbols() {
+  public SkylarkNestedSet /*<Artifact>*/ getCompiledSymbolsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveCompiledSymbols);
+  }
+
+  NestedSet<Artifact> getCompiledSymbols() {
     return transitiveCompiledSymbols;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
index 1642ca8..a40b6ea 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdlProvider.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidIdlProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkType;
 
 /**
  * Configured targets implementing this provider can contribute Android IDL information to the
@@ -51,22 +52,38 @@
   }
 
   @Override
-  public NestedSet<String> getTransitiveIdlImportRoots() {
+  public SkylarkNestedSet /*<String>*/ getTransitiveIdlImportRootsForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, transitiveIdlImportRoots);
+  }
+
+  NestedSet<String> getTransitiveIdlImportRoots() {
     return transitiveIdlImportRoots;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveIdlImports() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveIdlImportsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveIdlImports);
+  }
+
+  NestedSet<Artifact> getTransitiveIdlImports() {
     return transitiveIdlImports;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveIdlJars() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveIdlJarsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveIdlJars);
+  }
+
+  NestedSet<Artifact> getTransitiveIdlJars() {
     return transitiveIdlJars;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveIdlPreprocessed() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveIdlPreprocessedForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveIdlPreprocessed);
+  }
+
+  NestedSet<Artifact> getTransitiveIdlPreprocessed() {
     return transitiveIdlPreprocessed;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
index a3ce116..2617fc5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryAarInfo.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidLibraryAarInfoApi;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import java.util.Objects;
 import javax.annotation.Nullable;
 
@@ -79,6 +80,10 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveAarArtifactsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveAarArtifacts);
+  }
+
   public NestedSet<Artifact> getTransitiveAarArtifacts() {
     return transitiveAarArtifacts;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
index 23be2e5..38074bc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryResourceClassJarProvider.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidLibraryResourceClassJarProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import javax.annotation.Nonnull;
 
 /**
  * A provider which contains the resource class jars from android_library rules. See {@link
@@ -52,8 +51,11 @@
         target.get(AndroidLibraryResourceClassJarProvider.PROVIDER.getKey());
   }
 
-  @Nonnull
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getResourceClassJarsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, resourceClassJars);
+  }
+
   public NestedSet<Artifact> getResourceClassJars() {
     return resourceClassJars;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
index 2d6dcb3..eb9247c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNativeLibsInfo.java
@@ -43,7 +43,11 @@
   }
 
   @Override
-  public NestedSet<Artifact> getNativeLibs() {
+  public SkylarkNestedSet /*<Artifact>*/ getNativeLibsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, nativeLibs);
+  }
+
+  NestedSet<Artifact> getNativeLibs() {
     return nativeLibs;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
index 08385a7..d931d07 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidResourcesInfo.java
@@ -111,52 +111,93 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<ValidatedAndroidResources>*/
+      getTransitiveAndroidResourcesForStarlark() {
+    return SkylarkNestedSet.of(ValidatedAndroidResources.class, transitiveAndroidResources);
+  }
+
   public NestedSet<ValidatedAndroidResources> getTransitiveAndroidResources() {
     return transitiveAndroidResources;
   }
 
   @Override
+  public SkylarkNestedSet /*<ValidatedAndroidResources>*/ getDirectAndroidResourcesForStarlark() {
+    return SkylarkNestedSet.of(ValidatedAndroidResources.class, directAndroidResources);
+  }
+
   public NestedSet<ValidatedAndroidResources> getDirectAndroidResources() {
     return directAndroidResources;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveResourcesForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveResources);
+  }
+
   public NestedSet<Artifact> getTransitiveResources() {
     return transitiveResources;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveManifestsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveManifests);
+  }
+
   public NestedSet<Artifact> getTransitiveManifests() {
     return transitiveManifests;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveAapt2RTxtForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveAapt2RTxt);
+  }
+
   public NestedSet<Artifact> getTransitiveAapt2RTxt() {
     return transitiveAapt2RTxt;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveAapt2ValidationArtifacts() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveAapt2ValidationArtifactsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveAapt2ValidationArtifacts);
+  }
+
+  NestedSet<Artifact> getTransitiveAapt2ValidationArtifacts() {
     return transitiveAapt2ValidationArtifacts;
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveSymbolsBinForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveSymbolsBin);
+  }
+
   public NestedSet<Artifact> getTransitiveSymbolsBin() {
     return transitiveSymbolsBin;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveCompiledSymbols() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveCompiledSymbolsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveCompiledSymbols);
+  }
+
+  NestedSet<Artifact> getTransitiveCompiledSymbols() {
     return transitiveCompiledSymbols;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveStaticLib() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveStaticLibForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveStaticLib);
+  }
+
+  NestedSet<Artifact> getTransitiveStaticLib() {
     return transitiveStaticLib;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveRTxt() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveRTxtForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveRTxt);
+  }
+
+  NestedSet<Artifact> getTransitiveRTxt() {
     return transitiveRTxt;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
index b32a0c5..bc2ae90 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -97,8 +97,9 @@
   }
 
   @Override
-  public NestedSet<Artifact> getResources() {
-    return collectDirectArtifacts(ValidatedAndroidResources::getResources);
+  public SkylarkNestedSet /*<Artifact>*/ getResources() {
+    return SkylarkNestedSet.of(
+        Artifact.TYPE, collectDirectArtifacts(ValidatedAndroidResources::getResources));
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
index 1462874..6e0bcbe 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/databinding/DataBindingV2Provider.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.android.DataBindingV2ProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import javax.annotation.Nullable;
 
 /**
@@ -75,6 +76,10 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveBRFilesForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveBRFiles);
+  }
+
   public NestedSet<Artifact> getTransitiveBRFiles() {
     return transitiveBRFiles;
   }
@@ -86,6 +91,11 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<LabelJavaPackagePair>*/
+      getTransitiveLabelAndJavaPackagesForStarlark() {
+    return SkylarkNestedSet.of(LabelJavaPackagePair.class, transitiveLabelAndJavaPackages);
+  }
+
   public NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages() {
     return transitiveLabelAndJavaPackages;
   }
@@ -96,6 +106,7 @@
       Artifact brFile,
       String label,
       String javaPackage,
+      // ugh these *Api types do not help one bit
       Iterable<? extends DataBindingV2ProviderApi<Artifact>> databindingV2ProvidersInDeps,
       Iterable<? extends DataBindingV2ProviderApi<Artifact>> databindingV2ProvidersInExports) {
 
@@ -126,7 +137,8 @@
 
     if (databindingV2ProvidersInDeps != null) {
 
-      for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInDeps) {
+      for (DataBindingV2ProviderApi<Artifact> p : databindingV2ProvidersInDeps) {
+        DataBindingV2Provider provider = (DataBindingV2Provider) p;
         brFiles.addTransitive(provider.getTransitiveBRFiles());
         transitiveLabelAndJavaPackages.addTransitive(provider.getTransitiveLabelAndJavaPackages());
       }
@@ -136,7 +148,8 @@
 
       // Add all of the information from providers from exported targets, so that targets which
       // depend on this target appear to depend on the exported targets.
-      for (DataBindingV2ProviderApi<Artifact> provider : databindingV2ProvidersInExports) {
+      for (DataBindingV2ProviderApi<Artifact> p : databindingV2ProvidersInExports) {
+        DataBindingV2Provider provider = (DataBindingV2Provider) p;
         setterStoreFiles.addAll(provider.getSetterStores());
         classInfoFiles.addAll(provider.getClassInfos());
         brFiles.addTransitive(provider.getTransitiveBRFiles());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java
index e7eb2fb..81969e4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcSkylarkApiProvider.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcSkylarkApiProviderApi;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.vfs.PathFragment;
 
 /**
@@ -42,14 +43,22 @@
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveHeaders() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveHeadersForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, getTransitiveHeaders());
+  }
+
+  NestedSet<Artifact> getTransitiveHeaders() {
     CcCompilationContext ccCompilationContext =
         getInfo().get(CcInfo.PROVIDER).getCcCompilationContext();
     return ccCompilationContext.getDeclaredIncludeSrcs();
   }
 
   @Override
-  public NestedSet<Artifact> getLibraries() {
+  public SkylarkNestedSet /*<Artifact>*/ getLibrariesForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, getLibraries());
+  }
+
+  NestedSet<Artifact> getLibraries() {
     NestedSetBuilder<Artifact> libs = NestedSetBuilder.linkOrder();
     CcInfo ccInfo = getInfo().get(CcInfo.PROVIDER);
     if (ccInfo == null) {
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
index 5c90696..358c9e6 100644
--- 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
@@ -14,7 +14,6 @@
 
 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;
@@ -239,7 +238,7 @@
     }
 
     @Override
-    public NestedSet<FileApi> getGopackageFiles(
+    public SkylarkNestedSet /*<FileApi>*/ getGopackageFilesForStarlark(
         SkylarkRuleContextApi skylarkRuleContext, FileApi skylarkGopkg) {
       return null;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
index a0931d3..fc69382 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaAnnotationProcessingApi;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import javax.annotation.Nullable;
 
 /** The collection of gen jars from the transitive closure. */
@@ -105,17 +106,29 @@
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveGenClassJars() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveGenClassJarsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveGenClassJars);
+  }
+
+  NestedSet<Artifact> getTransitiveGenClassJars() {
     return transitiveGenClassJars;
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveGenSourceJars() {
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveGenSourceJarsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveGenSourceJars);
+  }
+
+  NestedSet<Artifact> getTransitiveGenSourceJars() {
     return transitiveGenSourceJars;
   }
 
   @Override
-  public NestedSet<Artifact> getProcessorClasspath() {
+  public SkylarkNestedSet /*<Artifact>*/ getProcessorClasspathForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, processorClasspath);
+  }
+
+  NestedSet<Artifact> getProcessorClasspath() {
     return processorClasspath;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
index f2da42e..572fa14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/ProguardSpecProvider.java
@@ -39,6 +39,10 @@
   }
 
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveProguardSpecsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveProguardSpecs);
+  }
+
   public NestedSet<Artifact> getTransitiveProguardSpecs() {
     return transitiveProguardSpecs;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
index 4766f91..89c6823 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
@@ -71,6 +71,10 @@
 
   /** @return the proto jars used to generate the registry. */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getInputsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, inputs);
+  }
+
   public NestedSet<Artifact> getInputs() {
     return inputs;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index 8620829..44c08ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -43,6 +43,7 @@
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collections;
@@ -394,18 +395,26 @@
       ImmutableSet.<Key<?>>of(HEADER, MODULE_MAP, SOURCE);
 
   @Override
+  public SkylarkNestedSet /*<String>*/ defineForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, define());
+  }
+
   public NestedSet<String> define() {
     return get(DEFINE);
   }
 
   @Override
-  public NestedSet<Artifact> dynamicFrameworkFile() {
+  public SkylarkNestedSet /*<Artifact>*/ dynamicFrameworkFileForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, dynamicFrameworkFile());
+  }
+
+  NestedSet<Artifact> dynamicFrameworkFile() {
     return get(DYNAMIC_FRAMEWORK_FILE);
   }
 
   @Override
-  public NestedSet<Artifact> exportedDebugArtifacts() {
-    return get(EXPORTED_DEBUG_ARTIFACTS);
+  public SkylarkNestedSet /*<Artifact>*/ exportedDebugArtifacts() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(EXPORTED_DEBUG_ARTIFACTS));
   }
 
   @Override
@@ -414,12 +423,16 @@
   }
 
   @Override
-  public NestedSet<Artifact> forceLoadLibrary() {
-    return get(FORCE_LOAD_LIBRARY);
+  public SkylarkNestedSet /*<Artifact>*/ forceLoadLibrary() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(FORCE_LOAD_LIBRARY));
   }
 
   @Override
-  public NestedSet<Artifact> header() {
+  public SkylarkNestedSet /*<Artifact>*/ headerForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, header());
+  }
+
+  NestedSet<Artifact> header() {
     return get(HEADER);
   }
 
@@ -429,12 +442,12 @@
   }
 
   @Override
-  public NestedSet<Artifact> importedLibrary() {
-    return get(IMPORTED_LIBRARY);
+  public SkylarkNestedSet /*<Artifact>*/ importedLibrary() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(IMPORTED_LIBRARY));
   }
 
   @Override
-  public SkylarkNestedSet include() {
+  public SkylarkNestedSet /*<String>*/ include() {
     return ObjcProviderSkylarkConverters.convertPathFragmentsToSkylark(get(INCLUDE));
   }
 
@@ -449,48 +462,48 @@
   }
 
   @Override
-  public NestedSet<Artifact> j2objcLibrary() {
-    return get(J2OBJC_LIBRARY);
+  public SkylarkNestedSet /*<Artifact>*/ j2objcLibrary() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(J2OBJC_LIBRARY));
   }
 
   @Override
-  public NestedSet<Artifact> jreLibrary() {
-    return get(JRE_LIBRARY);
+  public SkylarkNestedSet /*<Artifact>*/ jreLibrary() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(JRE_LIBRARY));
   }
 
   @Override
-  public NestedSet<Artifact> library() {
-    return get(LIBRARY);
+  public SkylarkNestedSet /*<Artifact>*/ library() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(LIBRARY));
   }
 
   @Override
-  public NestedSet<Artifact> linkInputs() {
-    return get(LINK_INPUTS);
+  public SkylarkNestedSet /*<Artifact>*/ linkInputs() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(LINK_INPUTS));
   }
 
   @Override
-  public NestedSet<Artifact> linkedBinary() {
-    return get(LINKED_BINARY);
+  public SkylarkNestedSet /*<Artifact>*/ linkedBinary() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(LINKED_BINARY));
   }
 
   @Override
-  public NestedSet<Artifact> linkmapFile() {
-    return get(LINKMAP_FILE);
+  public SkylarkNestedSet /*<Artifact>*/ linkmapFile() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(LINKMAP_FILE));
   }
 
   @Override
-  public NestedSet<String> linkopt() {
-    return get(LINKOPT);
+  public SkylarkNestedSet /*<String>*/ linkopt() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, get(LINKOPT));
   }
 
   @Override
-  public NestedSet<Artifact> mergeZip() {
-    return get(MERGE_ZIP);
+  public SkylarkNestedSet /*<Artifact>*/ mergeZip() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(MERGE_ZIP));
   }
 
   @Override
-  public NestedSet<Artifact> moduleMap() {
-    return get(MODULE_MAP);
+  public SkylarkNestedSet /*<Artifact>*/ moduleMap() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(MODULE_MAP));
   }
 
   @Override
@@ -499,23 +512,23 @@
   }
 
   @Override
-  public NestedSet<Artifact> multiArchDynamicLibraries() {
-    return get(MULTI_ARCH_DYNAMIC_LIBRARIES);
+  public SkylarkNestedSet /*<Artifact>*/ multiArchDynamicLibraries() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(MULTI_ARCH_DYNAMIC_LIBRARIES));
   }
 
   @Override
-  public NestedSet<Artifact> multiArchLinkedArchives() {
-    return get(MULTI_ARCH_LINKED_ARCHIVES);
+  public SkylarkNestedSet /*<Artifact>*/ multiArchLinkedArchives() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(MULTI_ARCH_LINKED_ARCHIVES));
   }
 
   @Override
-  public NestedSet<Artifact> multiArchLinkedBinaries() {
-    return get(MULTI_ARCH_LINKED_BINARIES);
+  public SkylarkNestedSet /*<Artifact>*/ multiArchLinkedBinaries() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(MULTI_ARCH_LINKED_BINARIES));
   }
 
   @Override
-  public NestedSet<String> sdkDylib() {
-    return get(SDK_DYLIB);
+  public SkylarkNestedSet /*<String>*/ sdkDylib() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, get(SDK_DYLIB));
   }
 
   @Override
@@ -525,7 +538,11 @@
   }
 
   @Override
-  public NestedSet<Artifact> source() {
+  public SkylarkNestedSet /*<Artifact>*/ sourceForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, source());
+  }
+
+  NestedSet<Artifact> source() {
     return get(SOURCE);
   }
 
@@ -535,13 +552,17 @@
   }
 
   @Override
-  public NestedSet<Artifact> staticFrameworkFile() {
+  public SkylarkNestedSet /*<Artifact>*/ staticFrameworkFileForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, staticFrameworkFile());
+  }
+
+  NestedSet<Artifact> staticFrameworkFile() {
     return get(STATIC_FRAMEWORK_FILE);
   }
 
   @Override
-  public NestedSet<Artifact> umbrellaHeader() {
-    return get(UMBRELLA_HEADER);
+  public SkylarkNestedSet /*<Artifact>*/ umbrellaHeader() {
+    return SkylarkNestedSet.of(Artifact.TYPE, get(UMBRELLA_HEADER));
   }
 
   @Override
@@ -936,22 +957,38 @@
   }
 
   @Override
-  public NestedSet<String> dynamicFrameworkNames() {
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkNamesForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, dynamicFrameworkNames());
+  }
+
+  NestedSet<String> dynamicFrameworkNames() {
     return getFrameworkNames(DYNAMIC_FRAMEWORK_FILE);
   }
 
   @Override
-  public NestedSet<String> dynamicFrameworkPaths() {
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkPathsForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, dynamicFrameworkPaths());
+  }
+
+  NestedSet<String> dynamicFrameworkPaths() {
     return getFrameworkPaths(DYNAMIC_FRAMEWORK_FILE);
   }
 
   @Override
-  public NestedSet<String> staticFrameworkNames() {
+  public SkylarkNestedSet /*<String>*/ staticFrameworkNamesForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, staticFrameworkNames());
+  }
+
+  NestedSet<String> staticFrameworkNames() {
     return getFrameworkNames(STATIC_FRAMEWORK_FILE);
   }
 
   @Override
-  public NestedSet<String> staticFrameworkPaths() {
+  public SkylarkNestedSet /*<String>*/ staticFrameworkPathsForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, staticFrameworkPaths());
+  }
+
+  NestedSet<String> staticFrameworkPaths() {
     return getFrameworkPaths(STATIC_FRAMEWORK_FILE);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
index e6008dd..3fb6b57 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoInfo.java
@@ -24,6 +24,8 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.ProtoInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.proto.ProtoBootstrap;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.util.Pair;
 import javax.annotation.Nullable;
 
@@ -122,6 +124,10 @@
 
   /** The proto sources in the transitive closure of this rule. */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveProtoSourcesForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, getTransitiveProtoSources());
+  }
+
   public NestedSet<Artifact> getTransitiveProtoSources() {
     return transitiveProtoSources;
   }
@@ -131,14 +137,18 @@
    * {@code protoc} in the specified order, via the {@code --proto_path} flag.
    */
   @Override
+  public SkylarkNestedSet /*<String>*/ getTransitiveProtoSourceRootsForStarlark() {
+    return SkylarkNestedSet.of(SkylarkType.STRING, transitiveProtoSourceRoots);
+  }
+
   public NestedSet<String> getTransitiveProtoSourceRoots() {
     return transitiveProtoSourceRoots;
   }
 
   @Deprecated
   @Override
-  public NestedSet<Artifact> getTransitiveImports() {
-    return getTransitiveProtoSources();
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveImports() {
+    return getTransitiveProtoSourcesForStarlark();
   }
 
   /**
@@ -149,6 +159,10 @@
    * direct dependencies, but not from transitive ones)
    */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getStrictImportableProtoSourcesForDependentsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, strictImportableProtoSourcesForDependents);
+  }
+
   public NestedSet<Artifact> getStrictImportableProtoSourcesForDependents() {
     return strictImportableProtoSourcesForDependents;
   }
@@ -217,6 +231,10 @@
    * direct-srcs descriptor set)
    */
   @Override
+  public SkylarkNestedSet /*<Artifact>*/ getTransitiveDescriptorSetsForStarlark() {
+    return SkylarkNestedSet.of(Artifact.TYPE, transitiveDescriptorSets);
+  }
+
   public NestedSet<Artifact> getTransitiveDescriptorSets() {
     return transitiveDescriptorSets;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
index c645e58..e4c2700 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/FileProviderApi.java
@@ -14,11 +14,11 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 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.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** A representation of the concept "this builds these files". */
 @SkylarkModule(
@@ -43,5 +43,5 @@
    * implicit targets, for example, deploy jars.
    */
   @SkylarkCallable(name = "files_to_build", documented = false, structField = true)
-  NestedSet<? extends FileApi> getFilesToBuild();
+  SkylarkNestedSet /*<? extends FileApi>*/ getFilesToBuildForStarlark();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoInfoApi.java
index 66d542b..3e61b2a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/ProtoInfoApi.java
@@ -15,10 +15,10 @@
 package com.google.devtools.build.lib.skylarkbuildapi;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 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.SkylarkNestedSet;
 
 /** Info object propagating information about protocol buffer sources. */
 @SkylarkModule(
@@ -43,7 +43,7 @@
       name = "transitive_imports",
       doc = "Transitive imports including weak dependencies.",
       structField = true)
-  public NestedSet<FileT> getTransitiveImports();
+  public SkylarkNestedSet /*<FileT>*/ getTransitiveImports();
 
   @SkylarkCallable(
       name = "transitive_sources",
@@ -52,7 +52,7 @@
   // TODO(bazel-team): The difference between transitive imports and transitive proto sources
   // should never be used by Skylark or by an Aspect. One of these two should be removed,
   // preferably soon, before Skylark users start depending on them.
-  public NestedSet<FileT> getTransitiveProtoSources();
+  public SkylarkNestedSet /*<FileT>*/ getTransitiveProtoSourcesForStarlark();
 
   @SkylarkCallable(
       name = "direct_sources",
@@ -67,7 +67,7 @@
               + "that has no sources, it contains the check_deps_sources "
               + "from this library's direct deps.",
       structField = true)
-  public NestedSet<FileT> getStrictImportableProtoSourcesForDependents();
+  public SkylarkNestedSet /*<FileT>*/ getStrictImportableProtoSourcesForDependentsForStarlark();
 
   @SkylarkCallable(
       name = "direct_descriptor_set",
@@ -87,13 +87,13 @@
               + " as passing --include_imports to proto-compiler. Will be empty if no"
               + " dependencies.",
       structField = true)
-  public NestedSet<FileT> getTransitiveDescriptorSets();
+  public SkylarkNestedSet /*<FileT>*/ getTransitiveDescriptorSetsForStarlark();
 
   @SkylarkCallable(
       name = "transitive_proto_path",
       doc = "A set of proto source roots collected from the transitive closure of this rule.",
       structField = true)
-  public NestedSet<String> getTransitiveProtoSourceRoots();
+  public SkylarkNestedSet /*<String>*/ getTransitiveProtoSourceRootsForStarlark();
 
   @SkylarkCallable(
       name = "proto_source_root",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
index d868e33..c41e2b0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/RunfilesApi.java
@@ -14,12 +14,12 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 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.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** An interface for a set of runfiles. */
 @SkylarkModule(
@@ -33,27 +33,25 @@
 public interface RunfilesApi extends SkylarkValue {
 
   @SkylarkCallable(
-    name = "files",
-    doc = "Returns the set of runfiles as files.",
-    structField = true
-  )
-  public NestedSet<? extends FileApi> getArtifacts();
+      name = "files",
+      doc = "Returns the set of runfiles as files.",
+      structField = true)
+  public SkylarkNestedSet /*<? extends FileApi>*/ getArtifactsForStarlark();
 
   @SkylarkCallable(name = "symlinks", doc = "Returns the set of symlinks.", structField = true)
-  public NestedSet<? extends SymlinkEntryApi> getSymlinks();
+  public SkylarkNestedSet /*<? extends SymlinkEntryApi>*/ getSymlinksForStarlark();
 
   @SkylarkCallable(
       name = "root_symlinks",
       doc = "Returns the set of root symlinks.",
       structField = true)
-  public NestedSet<? extends SymlinkEntryApi> getRootSymlinks();
+  public SkylarkNestedSet /*<? extends SymlinkEntryApi>*/ getRootSymlinksForStarlark();
 
   @SkylarkCallable(
-    name = "empty_filenames",
-    doc = "Returns names of empty files to create.",
-    structField = true
-  )
-  public NestedSet<String> getEmptyFilenames();
+      name = "empty_filenames",
+      doc = "Returns names of empty files to create.",
+      structField = true)
+  public SkylarkNestedSet /*<String>*/ getEmptyFilenamesForStarlark();
 
   @SkylarkCallable(
     name = "merge",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidAssetsInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidAssetsInfoApi.java
index 91867a0..a32a1d1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidAssetsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidAssetsInfoApi.java
@@ -15,7 +15,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -62,7 +61,7 @@
   FileApi getValidationResult();
 
   @SkylarkCallable(name = "direct_parsed_assets", structField = true, doc = "", documented = false)
-  NestedSet<AssetsT> getDirectParsedAssets();
+  SkylarkNestedSet /*<AssetsT>*/ getDirectParsedAssetsForStarlark();
 
   /** Returns the local assets for the target. */
   @SkylarkCallable(
@@ -87,16 +86,16 @@
       structField = true,
       doc = "",
       documented = false)
-  NestedSet<AssetsT> getTransitiveParsedAssets();
+  SkylarkNestedSet /*<AssetsT>*/ getTransitiveParsedAssetsForStarlark();
 
   @SkylarkCallable(name = "assets", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getAssets();
+  SkylarkNestedSet /*<FileT>*/ getAssetsForStarlark();
 
   @SkylarkCallable(name = "symbols", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getSymbols();
+  SkylarkNestedSet /*<FileT>*/ getSymbolsForStarlark();
 
   @SkylarkCallable(name = "compiled_symbols", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getCompiledSymbols();
+  SkylarkNestedSet /*<FileT>*/ getCompiledSymbolsForStarlark();
 
   /** The provider implementing this can construct the AndroidAssetsInfo provider. */
   @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidIdlProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidIdlProviderApi.java
index 2d57de2..f1ce426 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidIdlProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidIdlProviderApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -48,7 +47,7 @@
       structField = true,
       doc = "Returns a depset of strings of all the idl import roots.",
       documented = false)
-  NestedSet<String> getTransitiveIdlImportRoots();
+  SkylarkNestedSet /*<String>*/ getTransitiveIdlImportRootsForStarlark();
 
   /** The IDL files in the transitive closure. */
   @SkylarkCallable(
@@ -56,7 +55,7 @@
       structField = true,
       doc = "Returns a depset of artifacts of all the idl imports.",
       documented = false)
-  NestedSet<FileT> getTransitiveIdlImports();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveIdlImportsForStarlark();
 
   /** The IDL jars in the transitive closure, both class and source jars. */
   @SkylarkCallable(
@@ -64,7 +63,7 @@
       structField = true,
       doc = "Returns a depset of artifacts of all the idl class and source jars.",
       documented = false)
-  NestedSet<FileT> getTransitiveIdlJars();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveIdlJarsForStarlark();
 
   /** The preprocessed IDL files in the transitive closure. */
   @SkylarkCallable(
@@ -72,7 +71,7 @@
       structField = true,
       doc = "Returns a depset of artifacts of all the idl preprocessed files.",
       documented = false)
-  NestedSet<FileT> getTransitiveIdlPreprocessed();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveIdlPreprocessedForStarlark();
 
   /** The provider implementing this can construct the AndroidIdlInfo provider. */
   @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryAarInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryAarInfoApi.java
index d2467f9..229d9f1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryAarInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryAarInfoApi.java
@@ -13,12 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 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;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** A target that can provide the aar artifact of Android libraries */
 @SkylarkModule(
@@ -47,5 +47,5 @@
       doc = "",
       documented = false,
       structField = true)
-  NestedSet<FileT> getTransitiveAarArtifacts();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveAarArtifactsForStarlark();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
index 6b6a87f..5041f11 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidLibraryResourceClassJarProviderApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -40,7 +39,7 @@
   String NAME = "AndroidLibraryResourceClassJarProvider";
 
   @SkylarkCallable(name = "jars", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getResourceClassJars();
+  SkylarkNestedSet /*<FileT>*/ getResourceClassJarsForStarlark();
 
   /** The provider implementing this can construct the AndroidLibraryResourceClassJarProvider. */
   @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java
index d6781221..4b1b7f7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidNativeLibsInfoApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -46,7 +45,7 @@
       doc = "Returns the native libraries produced by the rule.",
       documented = false,
       structField = true)
-  NestedSet<FileT> getNativeLibs();
+  SkylarkNestedSet /*<FileT>*/ getNativeLibsForStarlark();
 
   /** Provider for {@link AndroidNativeLibsInfoApi}. */
   @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidResourcesInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidResourcesInfoApi.java
index e13e67b..2ac36ba 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidResourcesInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidResourcesInfoApi.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -74,7 +73,7 @@
       doc = "Returns the transitive ResourceContainers for the label.",
       documented = false,
       structField = true)
-  NestedSet<ValidatedAndroidDataT> getTransitiveAndroidResources();
+  SkylarkNestedSet /*<ValidatedAndroidDataT>*/ getTransitiveAndroidResourcesForStarlark();
 
   /** Returns the immediate ResourceContainers for the label. */
   @SkylarkCallable(
@@ -82,44 +81,44 @@
       doc = "Returns the immediate ResourceContainers for the label.",
       documented = false,
       structField = true)
-  NestedSet<ValidatedAndroidDataT> getDirectAndroidResources();
+  SkylarkNestedSet /*<ValidatedAndroidDataT>*/ getDirectAndroidResourcesForStarlark();
 
   @SkylarkCallable(name = "transitive_resources", doc = "", documented = false, structField = true)
-  NestedSet<FileT> getTransitiveResources();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveResourcesForStarlark();
 
   @SkylarkCallable(name = "transitive_manifests", doc = "", documented = false, structField = true)
-  NestedSet<FileT> getTransitiveManifests();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveManifestsForStarlark();
 
   @SkylarkCallable(
       name = "transitive_aapt2_r_txt",
       doc = "",
       documented = false,
       structField = true)
-  NestedSet<FileT> getTransitiveAapt2RTxt();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveAapt2RTxtForStarlark();
 
   // TODO(b/132383435): remove this
   @SkylarkCallable(name = "validation_artifacts", doc = "", documented = false, structField = true)
-  NestedSet<FileT> getTransitiveAapt2ValidationArtifacts();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveAapt2ValidationArtifactsForStarlark();
 
   @SkylarkCallable(
       name = "transitive_symbols_bin",
       doc = "",
       documented = false,
       structField = true)
-  NestedSet<FileT> getTransitiveSymbolsBin();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveSymbolsBinForStarlark();
 
   @SkylarkCallable(
       name = "transitive_compiled_symbols",
       doc = "",
       documented = false,
       structField = true)
-  NestedSet<FileT> getTransitiveCompiledSymbols();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveCompiledSymbolsForStarlark();
 
   @SkylarkCallable(name = "transitive_static_lib", doc = "", documented = false, structField = true)
-  NestedSet<FileT> getTransitiveStaticLib();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveStaticLibForStarlark();
 
   @SkylarkCallable(name = "transitive_r_txt", doc = "", documented = false, structField = true)
-  NestedSet<FileT> getTransitiveRTxt();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveRTxtForStarlark();
 
   /** Provider for {@link AndroidResourcesInfoApi}. */
   @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
index 5c3bf0f..90969a0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidSkylarkApiProviderApi.java
@@ -15,7 +15,6 @@
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.OutputJarApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -125,7 +124,7 @@
       structField = true,
       doc = "Returns resources defined by this target.",
       documented = false)
-  NestedSet<FileT> getResources();
+  SkylarkNestedSet /*<FileT>*/ getResources();
 
   @SkylarkCallable(
       name = "resource_jar",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
index ee3544c..aee7c21 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/DataBindingV2ProviderApi.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -25,6 +24,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import javax.annotation.Nullable;
 
 /**
@@ -92,18 +92,18 @@
 
   /** Returns the BR files from this rule and its dependencies. */
   @SkylarkCallable(name = "transitive_br_files", structField = true, doc = "", documented = false)
-  NestedSet<T> getTransitiveBRFiles();
+  SkylarkNestedSet /*<T>*/ getTransitiveBRFilesForStarlark();
 
   /**
    * Returns a NestedSet containing the label and java package for this rule and its transitive
    * dependencies.
-   * */
+   */
   @SkylarkCallable(
       name = "transitive_label_and_java_packages",
       structField = true,
       doc = "",
       documented = false)
-  NestedSet<LabelJavaPackagePair> getTransitiveLabelAndJavaPackages();
+  SkylarkNestedSet /*<LabelJavaPackagePair>*/ getTransitiveLabelAndJavaPackagesForStarlark();
 
   /**
    * Returns the label and java package for this rule and any rules that this rule exports.
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
index 1e023fc..308d022 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.apple;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -34,12 +33,13 @@
 )
 public interface ObjcProviderApi<FileApiT extends FileApi> extends SkylarkValue {
 
-  @SkylarkCallable(name = "define",
+  @SkylarkCallable(
+      name = "define",
       structField = true,
-      doc = "A set of strings from 'defines' attributes. These are to be passed as '-D' flags to "
-          + "all invocations of the compiler for this target and all depending targets."
-  )
-  public NestedSet<String> define();
+      doc =
+          "A set of strings from 'defines' attributes. These are to be passed as '-D' flags to "
+              + "all invocations of the compiler for this target and all depending targets.")
+  public SkylarkNestedSet /*<String>*/ defineForStarlark();
 
   @SkylarkCallable(
       name = "dynamic_framework_file",
@@ -47,32 +47,33 @@
       doc =
           "The library files in .framework directories belonging to a dynamically linked "
               + "framework.")
-  public NestedSet<FileApiT> dynamicFrameworkFile();
+  public SkylarkNestedSet /*<FileApiT>*/ dynamicFrameworkFileForStarlark();
 
-  @SkylarkCallable(name = "exported_debug_artifacts",
+  @SkylarkCallable(
+      name = "exported_debug_artifacts",
       structField = true,
-      doc = "Debug files that should be exported by the top-level target."
-  )
-  public NestedSet<FileApiT> exportedDebugArtifacts();
+      doc = "Debug files that should be exported by the top-level target.")
+  public SkylarkNestedSet /*<FileApiT>*/ exportedDebugArtifacts();
 
-  @SkylarkCallable(name = "framework_search_path_only",
+  @SkylarkCallable(
+      name = "framework_search_path_only",
       structField = true,
-      doc = "Exec paths of .framework directories corresponding to frameworks to include "
-          + "in search paths, but not to link."
-  )
-  public SkylarkNestedSet frameworkSearchPathOnly();
+      doc =
+          "Exec paths of .framework directories corresponding to frameworks to include "
+              + "in search paths, but not to link.")
+  public SkylarkNestedSet /*<String>*/ frameworkSearchPathOnly();
 
-  @SkylarkCallable(name = "force_load_library",
+  @SkylarkCallable(
+      name = "force_load_library",
       structField = true,
-      doc = "Libraries to load with -force_load."
-  )
-  public NestedSet<FileApiT> forceLoadLibrary();
+      doc = "Libraries to load with -force_load.")
+  public SkylarkNestedSet /*<FileApiT>*/ forceLoadLibrary();
 
-  @SkylarkCallable(name = "header",
+  @SkylarkCallable(
+      name = "header",
       structField = true,
-      doc = "All header files. These may be either public or private headers."
-  )
-  public NestedSet<FileApiT> header();
+      doc = "All header files. These may be either public or private headers.")
+  public SkylarkNestedSet /*<FileApiT>*/ headerForStarlark();
 
   @SkylarkCallable(
       name = "direct_headers",
@@ -82,11 +83,11 @@
               + "These may be either public or private headers.")
   public Sequence<FileApiT> directHeaders();
 
-  @SkylarkCallable(name = "imported_library",
+  @SkylarkCallable(
+      name = "imported_library",
       structField = true,
-      doc = "Imported precompiled static libraries (.a files) to be linked into the binary."
-  )
-  public NestedSet<FileApiT> importedLibrary();
+      doc = "Imported precompiled static libraries (.a files) to be linked into the binary.")
+  public SkylarkNestedSet /*<FileApiT>*/ importedLibrary();
 
   @SkylarkCallable(name = "include",
       structField = true,
@@ -107,51 +108,50 @@
   )
   public SkylarkNestedSet iquote();
 
-  @SkylarkCallable(name = "j2objc_library",
+  @SkylarkCallable(
+      name = "j2objc_library",
       structField = true,
-      doc = "Static libraries that are built from J2ObjC-translated Java code."
-  )
-  public NestedSet<FileApiT> j2objcLibrary();
+      doc = "Static libraries that are built from J2ObjC-translated Java code.")
+  public SkylarkNestedSet /*<FileApiT>*/ j2objcLibrary();
 
-  @SkylarkCallable(name = "jre_library",
+  @SkylarkCallable(
+      name = "jre_library",
       structField = true,
-      doc = "J2ObjC JRE emulation libraries and their dependencies."
-  )
-  public NestedSet<FileApiT> jreLibrary();
+      doc = "J2ObjC JRE emulation libraries and their dependencies.")
+  public SkylarkNestedSet /*<FileApiT>*/ jreLibrary();
 
-  @SkylarkCallable(name = "library",
+  @SkylarkCallable(
+      name = "library",
       structField = true,
-      doc = "Library (.a) files compiled by dependencies of the current target."
-  )
-  public NestedSet<FileApiT> library();
+      doc = "Library (.a) files compiled by dependencies of the current target.")
+  public SkylarkNestedSet /*<FileApiT>*/ library();
 
-  @SkylarkCallable(name = "link_inputs",
+  @SkylarkCallable(
+      name = "link_inputs",
       structField = true,
-      doc = "Link time artifacts from dependencies that do not fall into any other category such "
-          + "as libraries or archives. This catch-all provides a way to add arbitrary data (e.g. "
-          + "Swift AST files) to the linker. The rule that adds these is also responsible to "
-          + "add the necessary linker flags to 'linkopt'."
-  )
-  public NestedSet<FileApiT> linkInputs();
+      doc =
+          "Link time artifacts from dependencies that do not fall into any other category such as"
+              + " libraries or archives. This catch-all provides a way to add arbitrary data (e.g."
+              + " Swift AST files) to the linker. The rule that adds these is also responsible to"
+              + " add the necessary linker flags to 'linkopt'.")
+  public SkylarkNestedSet /*<FileApiT>*/ linkInputs();
 
-  @SkylarkCallable(name = "linked_binary",
+  @SkylarkCallable(
+      name = "linked_binary",
       structField = true,
-      doc = "Single-architecture linked binaries to be combined for the final multi-architecture "
-          + "binary."
-  )
-  public NestedSet<FileApiT> linkedBinary();
+      doc =
+          "Single-architecture linked binaries to be combined for the final multi-architecture "
+              + "binary.")
+  public SkylarkNestedSet /*<FileApiT>*/ linkedBinary();
 
-  @SkylarkCallable(name = "linkmap_file",
+  @SkylarkCallable(
+      name = "linkmap_file",
       structField = true,
-      doc = "Single-architecture link map for a binary."
-  )
-  public NestedSet<FileApiT> linkmapFile();
+      doc = "Single-architecture link map for a binary.")
+  public SkylarkNestedSet /*<FileApiT>*/ linkmapFile();
 
-  @SkylarkCallable(name = "linkopt",
-      structField = true,
-      doc = "Linking options."
-  )
-  public NestedSet<String> linkopt();
+  @SkylarkCallable(name = "linkopt", structField = true, doc = "Linking options.")
+  public SkylarkNestedSet /*<String>*/ linkopt();
 
   @SkylarkCallable(
       name = "merge_zip",
@@ -160,13 +160,13 @@
           "Merge zips to include in the bundle. The entries of these zip files are included "
               + "in the final bundle with the same path. The entries in the merge zips should not "
               + "include the bundle root path (e.g. 'Foo.app').")
-  public NestedSet<FileApiT> mergeZip();
+  public SkylarkNestedSet /*<FileApiT>*/ mergeZip();
 
-  @SkylarkCallable(name = "module_map",
+  @SkylarkCallable(
+      name = "module_map",
       structField = true,
-      doc = "Clang module maps, used to enforce proper use of private header files."
-  )
-  public NestedSet<FileApiT> moduleMap();
+      doc = "Clang module maps, used to enforce proper use of private header files.")
+  public SkylarkNestedSet /*<FileApiT>*/ moduleMap();
 
   @SkylarkCallable(
       name = "direct_module_maps",
@@ -176,29 +176,29 @@
               + "Used to enforce proper use of private header files and for Swift compilation.")
   public Sequence<FileApiT> directModuleMaps();
 
-  @SkylarkCallable(name = "multi_arch_dynamic_libraries",
+  @SkylarkCallable(
+      name = "multi_arch_dynamic_libraries",
       structField = true,
-      doc = "Combined-architecture dynamic libraries to include in the final bundle."
-  )
-  public NestedSet<FileApiT> multiArchDynamicLibraries();
+      doc = "Combined-architecture dynamic libraries to include in the final bundle.")
+  public SkylarkNestedSet /*<FileApiT>*/ multiArchDynamicLibraries();
 
-  @SkylarkCallable(name = "multi_arch_linked_archives",
+  @SkylarkCallable(
+      name = "multi_arch_linked_archives",
       structField = true,
-      doc = "Combined-architecture archives to include in the final bundle."
-  )
-  public NestedSet<FileApiT> multiArchLinkedArchives();
+      doc = "Combined-architecture archives to include in the final bundle.")
+  public SkylarkNestedSet /*<FileApiT>*/ multiArchLinkedArchives();
 
-  @SkylarkCallable(name = "multi_arch_linked_binaries",
+  @SkylarkCallable(
+      name = "multi_arch_linked_binaries",
       structField = true,
-      doc = "Combined-architecture binaries to include in the final bundle."
-  )
-  public NestedSet<FileApiT> multiArchLinkedBinaries();
+      doc = "Combined-architecture binaries to include in the final bundle.")
+  public SkylarkNestedSet /*<FileApiT>*/ multiArchLinkedBinaries();
 
-  @SkylarkCallable(name = "sdk_dylib",
+  @SkylarkCallable(
+      name = "sdk_dylib",
       structField = true,
-      doc = "Names of SDK .dylib libraries to link with. For instance, 'libz' or 'libarchive'."
-  )
-  public NestedSet<String> sdkDylib();
+      doc = "Names of SDK .dylib libraries to link with. For instance, 'libz' or 'libarchive'.")
+  public SkylarkNestedSet /*<String>*/ sdkDylib();
 
   @SkylarkCallable(name = "sdk_framework",
       structField = true,
@@ -206,11 +206,8 @@
   )
   public SkylarkNestedSet sdkFramework();
 
-  @SkylarkCallable(name = "source",
-      structField = true,
-      doc = "All transitive source files."
-  )
-  public NestedSet<FileApiT> source();
+  @SkylarkCallable(name = "source", structField = true, doc = "All transitive source files.")
+  public SkylarkNestedSet /*<FileApiT>*/ sourceForStarlark();
 
   @SkylarkCallable(
       name = "direct_sources",
@@ -222,14 +219,15 @@
       name = "static_framework_file",
       structField = true,
       doc = "The library files in .framework directories that should be statically linked.")
-  public NestedSet<FileApiT> staticFrameworkFile();
+  public SkylarkNestedSet /*<FileApiT>*/ staticFrameworkFileForStarlark();
 
-  @SkylarkCallable(name = "umbrella_header",
+  @SkylarkCallable(
+      name = "umbrella_header",
       structField = true,
-      doc = "Clang umbrella header. Public headers are #included in umbrella headers to be "
-          + "compatible with J2ObjC segmented headers."
-  )
-  public NestedSet<FileApiT> umbrellaHeader();
+      doc =
+          "Clang umbrella header. Public headers are #included in umbrella headers to be "
+              + "compatible with J2ObjC segmented headers.")
+  public SkylarkNestedSet /*<FileApiT>*/ umbrellaHeader();
 
   @SkylarkCallable(
       name = "weak_sdk_framework",
@@ -244,23 +242,23 @@
       name = "dynamic_framework_names",
       structField = true,
       doc = "Returns all names of dynamic frameworks in this provider.")
-  public NestedSet<String> dynamicFrameworkNames();
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkNamesForStarlark();
 
   @SkylarkCallable(
       name = "dynamic_framework_paths",
       structField = true,
       doc = "Returns all framework paths to dynamic frameworks in this provider.")
-  public NestedSet<String> dynamicFrameworkPaths();
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkPathsForStarlark();
 
   @SkylarkCallable(
       name = "static_framework_names",
       structField = true,
       doc = "Returns all names of static frameworks in this provider.")
-  public NestedSet<String> staticFrameworkNames();
+  public SkylarkNestedSet /*<String>*/ staticFrameworkNamesForStarlark();
 
   @SkylarkCallable(
       name = "static_framework_paths",
       structField = true,
       doc = "Returns all framework paths to static frameworks in this provider.")
-  public NestedSet<String> staticFrameworkPaths();
+  public SkylarkNestedSet /*<String>*/ staticFrameworkPathsForStarlark();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
index 3788c1b..13869ef 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcSkylarkApiProviderApi.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 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.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** Object with information about C++ rules. Every C++-related target should provide this. */
 @SkylarkModule(
@@ -39,7 +39,7 @@
           "Returns a <a href=\"depset.html\">depset</a> of headers that have been declared in the "
               + " <code>src</code> or <code>headers</code> attribute"
               + "(possibly empty but never <code>None</code>).")
-  public NestedSet<FileT> getTransitiveHeaders();
+  public SkylarkNestedSet /*<FileT>*/ getTransitiveHeadersForStarlark();
 
   @SkylarkCallable(
       name = "libs",
@@ -49,7 +49,7 @@
               + "<code>FULLY STATIC</code> mode (<code>linkopts=[\"-static\"]</code>) or "
               + "<code>MOSTLY STATIC</code> mode (<code>linkstatic=1</code>) "
               + "(possibly empty but never <code>None</code>)")
-  public NestedSet<FileT> getLibraries();
+  public SkylarkNestedSet /*<FileT>*/ getLibrariesForStarlark();
 
   @SkylarkCallable(
       name = "link_flags",
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
index 37d4010..c67f048 100644
--- 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
@@ -14,7 +14,6 @@
 
 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;
@@ -30,6 +29,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.NoneType;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import com.google.devtools.build.lib.syntax.Tuple;
 
 /**
@@ -213,6 +213,6 @@
             named = true,
             allowedTypes = {@ParamType(type = NoneType.class), @ParamType(type = FileApi.class)}),
       })
-  public NestedSet<FileT> getGopackageFiles(
+  public SkylarkNestedSet /*<FileT>*/ getGopackageFilesForStarlark(
       SkylarkRuleContextT skylarkRuleContext, FileT skylarkGopkg);
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
index e5ecec9..633f427 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/GeneratedExtensionRegistryProviderApi.java
@@ -14,7 +14,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.java;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -49,7 +48,7 @@
   FileT getSrcJar();
 
   @SkylarkCallable(name = "inputs", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getInputs();
+  SkylarkNestedSet /*<FileT>*/ getInputsForStarlark();
 
   /** The provider implementing this can construct the GeneratedExtensionRegistryProvider. */
   @SkylarkModule(name = "Provider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
index 6be778c..9317502 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaAnnotationProcessingApi.java
@@ -15,12 +15,12 @@
 package com.google.devtools.build.lib.skylarkbuildapi.java;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 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.skylarkinterface.SkylarkValue;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 import javax.annotation.Nullable;
 
 /**
@@ -59,29 +59,26 @@
   public FileTypeT getGenSourceJar();
 
   @SkylarkCallable(
-    name = "transitive_class_jars",
-    structField = true,
-    doc =
-        "Returns a transitive set of class file jars resulting from annotation "
-            + "processing of this rule and its dependencies."
-  )
-  public NestedSet<FileTypeT> getTransitiveGenClassJars();
+      name = "transitive_class_jars",
+      structField = true,
+      doc =
+          "Returns a transitive set of class file jars resulting from annotation "
+              + "processing of this rule and its dependencies.")
+  public SkylarkNestedSet /*<FileTypeT>*/ getTransitiveGenClassJarsForStarlark();
 
   @SkylarkCallable(
-    name = "transitive_source_jars",
-    structField = true,
-    doc =
-        "Returns a transitive set of source archives resulting from annotation processing "
-            + "of this rule and its dependencies."
-  )
-  public NestedSet<FileTypeT> getTransitiveGenSourceJars();
+      name = "transitive_source_jars",
+      structField = true,
+      doc =
+          "Returns a transitive set of source archives resulting from annotation processing "
+              + "of this rule and its dependencies.")
+  public SkylarkNestedSet /*<FileTypeT>*/ getTransitiveGenSourceJarsForStarlark();
 
   @SkylarkCallable(
-    name = "processor_classpath",
-    structField = true,
-    doc = "Returns a classpath of annotation processors applied to this rule."
-  )
-  public NestedSet<FileTypeT> getProcessorClasspath();
+      name = "processor_classpath",
+      structField = true,
+      doc = "Returns a classpath of annotation processors applied to this rule.")
+  public SkylarkNestedSet /*<FileTypeT>*/ getProcessorClasspathForStarlark();
 
   @SkylarkCallable(
     name = "processor_classnames",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java
index 4e20a0f..8985e03 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/ProguardSpecProviderApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.java;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
@@ -35,7 +34,7 @@
   public static final String NAME = "ProguardSpecProvider";
 
   @SkylarkCallable(name = "specs", structField = true, doc = "", documented = false)
-  NestedSet<FileT> getTransitiveProguardSpecs();
+  SkylarkNestedSet /*<FileT>*/ getTransitiveProguardSpecsForStarlark();
 
   /** The provider implementing this can construct the ProguardSpecProvider. */
   @SkylarkModule(name = "Provider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java
index e65decf..9e30dd7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java
@@ -14,13 +14,13 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.proto;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 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;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
 
 /** Provides information about flavors for all built protos. */
 @SkylarkModule(
@@ -30,7 +30,7 @@
 public interface ProtoRegistryProviderApi<FileT extends FileApi> extends StructApi {
 
   @SkylarkCallable(name = "jars", documented = false, doc = "", structField = true)
-  NestedSet<FileT> getJars();
+  SkylarkNestedSet /*<FileT>*/ getJars();
 
   @SkylarkCallable(name = "flavors", documented = false, doc = "", structField = true)
   Sequence<String> getFlavors();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
index d7930e3..64bb882 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
@@ -37,8 +37,11 @@
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.MirroredTypeException;
+import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.type.WildcardType;
+import javax.lang.model.util.Elements;
+import javax.lang.model.util.Types;
 import javax.tools.Diagnostic;
 
 /**
@@ -74,6 +77,8 @@
  *   <li>A method annotated with selfCall=true must have a non-empty name.
  *   <li>A method annotated with selfCall=true must have structField=false.
  *   <li>The method's class must implement SkylarkValue.
+ *   <li>The class of the declared result type, if final, must be accepted by {@link
+ *       Starlark#fromJava}.
  * </ul>
  *
  * <p>These properties can be relied upon at runtime without additional checks.
@@ -84,7 +89,6 @@
   "com.google.devtools.build.lib.skylarkinterface.SkylarkModule"
 })
 public final class SkylarkCallableProcessor extends AbstractProcessor {
-  private ProcessingEnvironment env;
   private Messager messager;
 
   // A set containing the names of all classes which have a method with @SkylarkCallable.selfCall.
@@ -93,6 +97,9 @@
   // that class (where "method name" is @SkylarkCallable.name").
   private SetMultimap<String, String> processedClassMethods;
 
+  private Types types;
+  private Elements elements;
+
   private static final String SKYLARK_LIST = "com.google.devtools.build.lib.syntax.Sequence<?>";
   private static final String SKYLARK_DICT = "com.google.devtools.build.lib.syntax.Dict<?,?>";
   private static final String LOCATION = "com.google.devtools.build.lib.events.Location";
@@ -101,8 +108,6 @@
       "com.google.devtools.build.lib.syntax.StarlarkThread";
   private static final String STARLARK_SEMANTICS =
       "com.google.devtools.build.lib.syntax.StarlarkSemantics";
-  private static final String SKYLARK_VALUE =
-      "com.google.devtools.build.lib.skylarkinterface.SkylarkValue";
 
   @Override
   public SourceVersion getSupportedSourceVersion() {
@@ -112,22 +117,30 @@
   @Override
   public synchronized void init(ProcessingEnvironment env) {
     super.init(env);
-    this.env = env;
+    this.types = env.getTypeUtils();
+    this.elements = env.getElementUtils();
     messager = env.getMessager();
     classesWithSelfcall = new HashSet<>();
     processedClassMethods = LinkedHashMultimap.create();
   }
 
+  private TypeMirror getType(String name) {
+    return elements.getTypeElement(name).asType();
+  }
+
   @Override
   public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
+    TypeMirror stringType = getType("java.lang.String");
+    TypeMirror integerType = getType("java.lang.Integer");
+    TypeMirror booleanType = getType("java.lang.Boolean");
+    TypeMirror listType = getType("java.util.List");
+    TypeMirror mapType = getType("java.util.Map");
+    TypeMirror skylarkValueType =
+        getType("com.google.devtools.build.lib.skylarkinterface.SkylarkValue");
+
     // Ensure SkylarkModule-annotated classes implement SkylarkValue.
-    TypeElement skylarkValueType = env.getElementUtils().getTypeElement(SKYLARK_VALUE);
-    if (skylarkValueType == null) {
-      messager.printMessage(Diagnostic.Kind.ERROR, "no SkylarkValue type in compilation unit");
-      return true;
-    }
     for (Element cls : roundEnv.getElementsAnnotatedWith(SkylarkModule.class)) {
-      if (!env.getTypeUtils().isAssignable(cls.asType(), skylarkValueType.asType())) {
+      if (!types.isAssignable(cls.asType(), skylarkValueType)) {
         error(
             cls,
             String.format(
@@ -175,11 +188,31 @@
         error(exception.methodElement, exception.errorMessage);
       }
 
+      // Verify that result type, if final, might satisfy Starlark.fromJava.
+      // (If the type is non-final we can't prove that all subclasses are invalid.)
+      TypeMirror ret = methodElement.getReturnType();
+      if (ret.getKind() == TypeKind.DECLARED) {
+        DeclaredType obj = (DeclaredType) ret;
+        if (obj.asElement().getModifiers().contains(Modifier.FINAL)
+            && !types.isSameType(ret, stringType)
+            && !types.isSameType(ret, integerType)
+            && !types.isSameType(ret, booleanType)
+            && !types.isAssignable(obj, skylarkValueType)
+            && !types.isAssignable(obj, listType)
+            && !types.isAssignable(obj, mapType)) {
+          error(
+              methodElement,
+              String.format(
+                  "@SkylarkCallable-annotated method %s returns %s, which has no legal Starlark"
+                      + " values (see Starlark.fromJava)",
+                  methodElement.getSimpleName(), ret));
+        }
+      }
+
       // Check that the method's class is SkylarkGlobalLibrary-annotated,
       // or implements SkylarkValue, or an error has already been reported.
       Element cls = methodElement.getEnclosingElement();
-      if (okClasses.add(cls)
-          && !env.getTypeUtils().isAssignable(cls.asType(), skylarkValueType.asType())) {
+      if (okClasses.add(cls) && !types.isAssignable(cls.asType(), skylarkValueType)) {
         error(
             cls,
             String.format(
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
index c1414a2..978075d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
@@ -17,14 +17,10 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.WildcardType;
 import java.util.Arrays;
 
 /**
@@ -165,38 +161,10 @@
       }
     }
 
-    // TODO(adonovan): eliminate this hack.
-    // There are about a dozen methods that return NestedSet directly.
-    if (result instanceof NestedSet<?>) {
-      return SkylarkNestedSet.of(resultType(), (NestedSet<?>) result);
-    }
-
     // Careful: thread may be null when we are called by invokeStructField.
     return Starlark.fromJava(result, thread != null ? thread.mutability() : null);
   }
 
-  // legacy hack for NestedSet
-  private SkylarkType resultType() {
-    // This is where we can infer generic type information, so SkylarkNestedSets can be
-    // created in a safe way. Eventually we should probably do something with Lists and Maps too.
-    ParameterizedType t = (ParameterizedType) method.getGenericReturnType();
-    Type type = t.getActualTypeArguments()[0];
-    if (type instanceof Class) {
-      return SkylarkType.of((Class<?>) type);
-    }
-    if (type instanceof WildcardType) {
-      WildcardType wildcard = (WildcardType) type;
-      Type upperBound = wildcard.getUpperBounds()[0];
-      if (upperBound instanceof Class) {
-        // i.e. List<? extends SuperClass>
-        return SkylarkType.of((Class<?>) upperBound);
-      }
-    }
-    // It means someone annotated a method with @SkylarkCallable with no specific generic type info.
-    // We shouldn't annotate methods which return List<?> or List<T>.
-    throw new IllegalStateException("Cannot infer type from method signature " + method);
-  }
-
   /** @see SkylarkCallable#name() */
   public String getName() {
     return name;
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
index c93e0a4..539f495 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidNativeLibsInfoApi;
@@ -28,7 +27,7 @@
 public class FakeAndroidNativeLibsInfo implements AndroidNativeLibsInfoApi<FileApi> {
 
   @Override
-  public NestedSet<FileApi> getNativeLibs() {
+  public SkylarkNestedSet /*<FileApi>*/ getNativeLibsForStarlark() {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
index 87d706c..3e974a9 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidManifestInfoApi;
@@ -53,52 +52,53 @@
   }
 
   @Override
-  public NestedSet<FakeValidatedAndroidDataApi> getTransitiveAndroidResources() {
+  public SkylarkNestedSet /*<FakeValidatedAndroidDataApi>*/
+      getTransitiveAndroidResourcesForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FakeValidatedAndroidDataApi> getDirectAndroidResources() {
+  public SkylarkNestedSet /*<FakeValidatedAndroidDataApi>*/ getDirectAndroidResourcesForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveResources() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveResourcesForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveManifests() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveManifestsForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveAapt2RTxt() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveAapt2RTxtForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveAapt2ValidationArtifacts() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveAapt2ValidationArtifactsForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveSymbolsBin() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveSymbolsBinForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveCompiledSymbols() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveCompiledSymbolsForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveStaticLib() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveStaticLibForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> getTransitiveRTxt() {
+  public SkylarkNestedSet /*<FileApi>*/ getTransitiveRTxtForStarlark() {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
index 1a5f330..d463ed2 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeObjcProvider.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.apple;
 
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
@@ -27,17 +26,17 @@
 public class FakeObjcProvider implements ObjcProviderApi<FileApi> {
 
   @Override
-  public NestedSet<String> define() {
+  public SkylarkNestedSet /*<String>*/ defineForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> dynamicFrameworkFile() {
+  public SkylarkNestedSet /*<FileApi>*/ dynamicFrameworkFileForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> exportedDebugArtifacts() {
+  public SkylarkNestedSet /*<FileApi>*/ exportedDebugArtifacts() {
     return null;
   }
 
@@ -47,12 +46,12 @@
   }
 
   @Override
-  public NestedSet<FileApi> forceLoadLibrary() {
+  public SkylarkNestedSet /*<FileApi>*/ forceLoadLibrary() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> header() {
+  public SkylarkNestedSet /*<FileApi>*/ headerForStarlark() {
     return null;
   }
 
@@ -62,7 +61,7 @@
   }
 
   @Override
-  public NestedSet<FileApi> importedLibrary() {
+  public SkylarkNestedSet /*<FileApi>*/ importedLibrary() {
     return null;
   }
 
@@ -82,47 +81,47 @@
   }
 
   @Override
-  public NestedSet<FileApi> j2objcLibrary() {
+  public SkylarkNestedSet /*<FileApi>*/ j2objcLibrary() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> jreLibrary() {
+  public SkylarkNestedSet /*<FileApi>*/ jreLibrary() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> library() {
+  public SkylarkNestedSet /*<FileApi>*/ library() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> linkInputs() {
+  public SkylarkNestedSet /*<FileApi>*/ linkInputs() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> linkedBinary() {
+  public SkylarkNestedSet /*<FileApi>*/ linkedBinary() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> linkmapFile() {
+  public SkylarkNestedSet /*<FileApi>*/ linkmapFile() {
     return null;
   }
 
   @Override
-  public NestedSet<String> linkopt() {
+  public SkylarkNestedSet /*<String>*/ linkopt() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> mergeZip() {
+  public SkylarkNestedSet /*<FileApi>*/ mergeZip() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> moduleMap() {
+  public SkylarkNestedSet /*<FileApi>*/ moduleMap() {
     return null;
   }
 
@@ -132,22 +131,22 @@
   }
 
   @Override
-  public NestedSet<FileApi> multiArchDynamicLibraries() {
+  public SkylarkNestedSet /*<FileApi>*/ multiArchDynamicLibraries() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> multiArchLinkedArchives() {
+  public SkylarkNestedSet /*<FileApi>*/ multiArchLinkedArchives() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> multiArchLinkedBinaries() {
+  public SkylarkNestedSet /*<FileApi>*/ multiArchLinkedBinaries() {
     return null;
   }
 
   @Override
-  public NestedSet<String> sdkDylib() {
+  public SkylarkNestedSet /*<String>*/ sdkDylib() {
     return null;
   }
 
@@ -157,7 +156,7 @@
   }
 
   @Override
-  public NestedSet<FileApi> source() {
+  public SkylarkNestedSet /*<FileApi>*/ sourceForStarlark() {
     return null;
   }
 
@@ -167,12 +166,12 @@
   }
 
   @Override
-  public NestedSet<FileApi> staticFrameworkFile() {
+  public SkylarkNestedSet /*<FileApi>*/ staticFrameworkFileForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<FileApi> umbrellaHeader() {
+  public SkylarkNestedSet /*<FileApi>*/ umbrellaHeader() {
     return null;
   }
 
@@ -182,22 +181,22 @@
   }
 
   @Override
-  public NestedSet<String> dynamicFrameworkNames() {
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkNamesForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<String> dynamicFrameworkPaths() {
+  public SkylarkNestedSet /*<String>*/ dynamicFrameworkPathsForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<String> staticFrameworkNames() {
+  public SkylarkNestedSet /*<String>*/ staticFrameworkNamesForStarlark() {
     return null;
   }
 
   @Override
-  public NestedSet<String> staticFrameworkPaths() {
+  public SkylarkNestedSet /*<String>*/ staticFrameworkPathsForStarlark() {
     return null;
   }
 
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 f12e540..4a297ef 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
@@ -112,7 +112,7 @@
 
   @Override
   public CcToolchainVariablesApi getCompileBuildVariables(
-      CcToolchainProviderApi ccToolchainProvider,
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
       FeatureConfigurationApi featureConfiguration,
       Object sourceFile,
       Object outputFile,
@@ -129,12 +129,21 @@
   }
 
   @Override
-  public CcToolchainVariablesApi getLinkBuildVariables(CcToolchainProviderApi ccToolchainProvider,
-      FeatureConfigurationApi featureConfiguration, Object librarySearchDirectories,
-      Object runtimeLibrarySearchDirectories, Object userLinkFlags, Object outputFile,
-      Object paramFile, Object defFile, boolean isUsingLinkerNotArchiver,
-      boolean isCreatingSharedLibrary, boolean mustKeepDebug, boolean useTestOnlyFlags,
-      boolean isStaticLinkingMode) throws EvalException {
+  public CcToolchainVariablesApi getLinkBuildVariables(
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchainProvider,
+      FeatureConfigurationApi featureConfiguration,
+      Object librarySearchDirectories,
+      Object runtimeLibrarySearchDirectories,
+      Object userLinkFlags,
+      Object outputFile,
+      Object paramFile,
+      Object defFile,
+      boolean isUsingLinkerNotArchiver,
+      boolean isCreatingSharedLibrary,
+      boolean mustKeepDebug,
+      boolean useTestOnlyFlags,
+      boolean isStaticLinkingMode)
+      throws EvalException {
     return null;
   }
 
@@ -144,7 +153,7 @@
   }
 
   @Override
-  public LibraryToLinkApi createLibraryLinkerInput(
+  public LibraryToLinkApi<FileApi> createLibraryLinkerInput(
       Object actions,
       Object featureConfiguration,
       Object ccToolchainProvider,
@@ -170,7 +179,7 @@
   }
 
   @Override
-  public CcLinkingContextApi createCcLinkingInfo(
+  public CcLinkingContextApi<FileApi> createCcLinkingInfo(
       Object linkerInputs,
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
@@ -199,7 +208,8 @@
   }
 
   @Override
-  public String legacyCcFlagsMakeVariable(CcToolchainProviderApi ccToolchain) {
+  public String legacyCcFlagsMakeVariable(
+      CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain) {
     return "";
   }
 
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
index 422c0dd..9e03434 100644
--- 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
@@ -14,7 +14,6 @@
 
 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;
@@ -113,7 +112,7 @@
   }
 
   @Override
-  public NestedSet<FileApi> getGopackageFiles(
+  public SkylarkNestedSet /*<FileApi>*/ getGopackageFilesForStarlark(
       SkylarkRuleContextApi skylarkRuleContext, FileApi skylarkGopkg) {
     return null;
   }