bazel: turn unchecked/rawtypes warnings into errors

...in analysis, packages, skyframe directories.

Also, fix or suppress all existing violations.

See[]

PiperOrigin-RevId: 278441648
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Actions.java b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
index 1726fc9..ca6c2d2 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Actions.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Actions.java
@@ -327,7 +327,7 @@
     }
 
     // Keep deterministic ordering of bad actions.
-    Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> badActions = new LinkedHashMap();
+    Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> badActions = new LinkedHashMap<>();
     Iterator<PathFragment> iter = artifactPathMap.keySet().iterator();
 
     // Report an error for every derived artifact which is a prefix of another.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectCompleteEvent.java
index 007531e..a93111c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectCompleteEvent.java
@@ -57,7 +57,7 @@
     this.aspectValue = aspectValue;
     this.rootCauses =
         (rootCauses == null) ? NestedSetBuilder.<Cause>emptySet(Order.STABLE_ORDER) : rootCauses;
-    ImmutableList.Builder postedAfterBuilder = ImmutableList.builder();
+    ImmutableList.Builder<BuildEventId> postedAfterBuilder = ImmutableList.builder();
     for (Cause cause : getRootCauses()) {
       postedAfterBuilder.add(BuildEventId.fromCause(cause));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
index ffee316..e54b211 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
@@ -58,7 +58,7 @@
 
   @Override
   public Collection<BuildEventId> getChildrenEvents() {
-    ImmutableList.Builder childrenBuilder = ImmutableList.builder();
+    ImmutableList.Builder<BuildEventId> childrenBuilder = ImmutableList.builder();
     for (BuildConfiguration config : configurations) {
       if (config != null) {
         childrenBuilder.add(BuildEventId.targetCompleted(target, config.getEventId()));
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
index 778c20b..a168439 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
@@ -19,7 +19,6 @@
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.skylarkbuildapi.DefaultInfoApi;
-import com.google.devtools.build.lib.skylarkbuildapi.FilesToRunProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
@@ -83,7 +82,7 @@
   }
 
   @Override
-  public FilesToRunProviderApi getFilesToRun() {
+  public FilesToRunProvider getFilesToRun() {
     return filesToRunProvider;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
index bc3ef54..d572e82 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
@@ -53,7 +53,7 @@
                         } else if (TransitiveInfoProvider.class.isAssignableFrom(clazz)) {
                           result.addAll(
                               getDirectImplementations(
-                                  (Class<? extends TransitiveInfoProvider>) clazz));
+                                  clazz.asSubclass(TransitiveInfoProvider.class)));
                         }
                       }
 
@@ -62,7 +62,7 @@
                           && TransitiveInfoProvider.class.isAssignableFrom(superclass)) {
                         result.addAll(
                             getDirectImplementations(
-                                (Class<? extends TransitiveInfoProvider>) superclass));
+                                superclass.asSubclass(TransitiveInfoProvider.class)));
                       }
                       return result;
                     }
@@ -83,10 +83,12 @@
                   });
 
   // TODO(arielb): see if these can be made private?
+  @SuppressWarnings("unchecked")
   static <T extends TransitiveInfoProvider> Class<T> get(T provider) {
     return get((Class<T>) provider.getClass());
   }
 
+  @SuppressWarnings("unchecked")
   static <T extends TransitiveInfoProvider> Class<T> get(Class<T> providerClass) {
     return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
index 1eb6640..3d87e47 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
@@ -101,7 +101,7 @@
 
   @Nullable
   public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
-    return (P) providers.get(providerClass);
+    return providerClass.cast(providers.get(providerClass));
   }
 
   @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ProtoDeterministicWriter.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ProtoDeterministicWriter.java
index 41a4fa2..39ad794 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ProtoDeterministicWriter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ProtoDeterministicWriter.java
@@ -24,7 +24,7 @@
   private final MessageSupplier messageSupplier;
 
   /** Constructs a {@link ProtoDeterministicWriter} with an eagerly constructed message. */
-  public ProtoDeterministicWriter(AbstractMessageLite message) {
+  public ProtoDeterministicWriter(AbstractMessageLite<?, ?> message) {
     this.messageSupplier = () -> message;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index dd9f39c..539dd82 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -204,6 +204,7 @@
      */
     // TODO(bazel-team): integrate dict-of-dicts return type with ctx.split_attr
     @Override
+    @SuppressWarnings("rawtypes")
     public ImmutableList<Map<String, Object>> evaluate(
         Map<String, Object> previousSettings, StructImpl attributeMapper)
         throws EvalException, InterruptedException {
@@ -214,8 +215,8 @@
         throw new EvalException(impl.getLocation(), e.getMessage());
       }
 
-      if (result instanceof SkylarkDict<?, ?>) {
-        // If we're recieving an empty dictionary, it's an error. Even if a
+      if (result instanceof SkylarkDict) {
+        // If we're receiving an empty dictionary, it's an error. Even if a
         // transition function sometimes evaluates to a no-op, it needs to return the passed in
         // settings. Return early for now since better error reporting will happen in
         // {@link FunctionTransitionUtil#validateFunctionOutputsMatchesDeclaredOutputs}
@@ -225,14 +226,16 @@
         // TODO(bazel-team): integrate keys with ctx.split_attr. Currently ctx.split_attr always
         // keys on cpu value - we should be able to key on the keys returned here.
         try {
+          @SuppressWarnings("rawtypes")
           Map<String, SkylarkDict> dictOfDict =
               ((SkylarkDict<?, ?>) result)
                   .getContents(
                       String.class, SkylarkDict.class, "dictionary of options dictionaries");
           ImmutableList.Builder<Map<String, Object>> builder = ImmutableList.builder();
-          for (Map.Entry<String, SkylarkDict> entry : dictOfDict.entrySet()) {
+          for (Map.Entry<String, SkylarkDict> entry : dictOfDict.entrySet()) { // rawtypes error
             Map<String, Object> dict =
-                entry.getValue().getContents(String.class, Object.class, "an option dictionary");
+                ((SkylarkDict<?, ?>) entry.getValue())
+                    .getContents(String.class, Object.class, "an option dictionary");
             builder.add(dict);
           }
           return builder.build();
@@ -246,7 +249,7 @@
         } catch (EvalException e) {
           throw new EvalException(impl.getLocation(), e.getMessage());
         }
-      } else if (result instanceof SkylarkList<?>) {
+      } else if (result instanceof SkylarkList) {
         ImmutableList.Builder<Map<String, Object>> builder = ImmutableList.builder();
         try {
           for (SkylarkDict<?, ?> toOptions :
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
index f5db821..38e5e01 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionFactories.java
@@ -38,7 +38,7 @@
     } else if (transition instanceof SplitTransition) {
       return split((SplitTransition) transition);
     }
-    return new AutoValue_TransitionFactories_IdentityFactory(transition);
+    return new AutoValue_TransitionFactories_IdentityFactory<T>(transition);
   }
 
   /** Returns a {@link TransitionFactory} that wraps a static split transition. */
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransitionFactory.java
index bf9f3e9..c550d45 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/transitions/ComposingTransitionFactory.java
@@ -74,7 +74,7 @@
 
   private static <T> TransitionFactory<T> create(
       TransitionFactory<T> transitionFactory1, TransitionFactory<T> transitionFactory2) {
-    return new AutoValue_ComposingTransitionFactory(transitionFactory1, transitionFactory2);
+    return new AutoValue_ComposingTransitionFactory<T>(transitionFactory1, transitionFactory2);
   }
 
   abstract TransitionFactory<T> transitionFactory1();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
index 4efadf6..bf5df35 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/PackageGroupConfiguredTarget.java
@@ -98,7 +98,7 @@
   @Override
   public <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
     if (provider == FileProvider.class) {
-      return (P) NO_FILES;
+      return provider.cast(NO_FILES); // can't fail
     } else {
       return super.getProvider(provider);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
index 9299346..9988ca8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
@@ -281,7 +281,7 @@
 
   @Override
   public void run(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object unusedInputsList,
       Object executableUnchecked,
@@ -298,7 +298,7 @@
     context.checkMutable("actions.run");
     StarlarkAction.Builder builder = new StarlarkAction.Builder();
 
-    SkylarkList argumentsList = ((SkylarkList) arguments);
+    SkylarkList<?> argumentsList = ((SkylarkList) arguments);
     buildCommandLine(builder, argumentsList);
     if (executableUnchecked instanceof Artifact) {
       Artifact executable = (Artifact) executableUnchecked;
@@ -367,7 +367,7 @@
 
   @Override
   public void runShell(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object toolsUnchecked,
       Object arguments,
@@ -383,7 +383,7 @@
       throws EvalException {
     context.checkMutable("actions.run_shell");
 
-    SkylarkList argumentList = (SkylarkList) arguments;
+    SkylarkList<?> argumentList = (SkylarkList) arguments;
     StarlarkAction.Builder builder = new StarlarkAction.Builder();
     buildCommandLine(builder, argumentList);
 
@@ -416,12 +416,11 @@
                 + " is deprecated. To temporarily disable this check,"
                 + " set --incompatible_objc_framework_cleanup=false.");
       }
-      SkylarkList commandList = (SkylarkList) commandUnchecked;
+      SkylarkList<?> commandList = (SkylarkList) commandUnchecked;
       if (argumentList.size() > 0) {
         throw new EvalException(location,
             "'arguments' must be empty if 'command' is a sequence of strings");
       }
-      @SuppressWarnings("unchecked")
       List<String> command = commandList.getContents(String.class, "command");
       builder.setShellCommand(command);
     } else {
@@ -452,7 +451,7 @@
         builder);
   }
 
-  private void buildCommandLine(SpawnAction.Builder builder, SkylarkList argumentsList)
+  private static void buildCommandLine(SpawnAction.Builder builder, SkylarkList<?> argumentsList)
       throws EvalException {
     List<String> stringArgs = new ArrayList<>();
     for (Object value : argumentsList) {
@@ -484,7 +483,7 @@
    * <p>{@code builder} should have either executable or a command set.
    */
   private void registerStarlarkAction(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object unusedInputsList,
       Object toolsUnchecked,
@@ -499,7 +498,7 @@
       throws EvalException {
     Iterable<Artifact> inputArtifacts;
     if (inputs instanceof SkylarkList) {
-      inputArtifacts = ((SkylarkList) inputs).getContents(Artifact.class, "inputs");
+      inputArtifacts = ((SkylarkList<?>) inputs).getContents(Artifact.class, "inputs");
       builder.addInputs(inputArtifacts);
     } else {
       NestedSet<Artifact> inputSet =
@@ -508,7 +507,6 @@
       inputArtifacts = inputSet;
     }
 
-    @SuppressWarnings("unchecked")
     List<Artifact> outputArtifacts = outputs.getContents(Artifact.class, "outputs");
     if (outputArtifacts.isEmpty()) {
       throw new EvalException(location, "param 'outputs' may not be empty");
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
index ef2a8c2..7a16632 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
 import com.google.devtools.build.lib.packages.Attribute.ImmutableAttributeFactory;
 import com.google.devtools.build.lib.packages.Attribute.SkylarkComputedDefaultTemplate;
+import com.google.devtools.build.lib.packages.AttributeTransitionData;
 import com.google.devtools.build.lib.packages.AttributeValueSource;
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -116,6 +117,7 @@
     return createAttribute(type, doc, arguments, ast, thread, name).buildPartial();
   }
 
+  @SuppressWarnings("unchecked")
   private static Attribute.Builder<?> createAttribute(
       Type<?> type,
       String doc,
@@ -144,7 +146,7 @@
             new SkylarkComputedDefaultTemplate(
                 type, callback.getParameterNames(), callback, ast.getLocation()));
       } else if (defaultValue instanceof SkylarkLateBoundDefault) {
-        builder.value((SkylarkLateBoundDefault) defaultValue);
+        builder.value((SkylarkLateBoundDefault) defaultValue); // unchecked cast
       } else {
         builder.defaultValue(
             defaultValue,
@@ -271,7 +273,7 @@
       } else if (trans instanceof SplitTransition) {
         builder.cfg(TransitionFactories.of((SplitTransition) trans));
       } else if (trans instanceof TransitionFactory) {
-        builder.cfg((TransitionFactory) trans);
+        builder.cfg((TransitionFactory<AttributeTransitionData>) trans); // unchecked cast
       } else if (trans instanceof StarlarkDefinedConfigTransition) {
         StarlarkDefinedConfigTransition starlarkDefinedTransition =
             (StarlarkDefinedConfigTransition) trans;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttributesCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttributesCollection.java
index 558b6a2..5077f53 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttributesCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttributesCollection.java
@@ -146,6 +146,7 @@
       this.context = ruleContext;
     }
 
+    @SuppressWarnings("unchecked")
     public void addAttribute(Attribute a, Object val) {
       Type<?> type = a.getType();
       String skyname = a.getPublicName();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
index bfacc14..03d961f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
@@ -192,6 +192,7 @@
       BaseFunction mapEach =
           ((features & HAS_MAP_EACH) != 0) ? (BaseFunction) arguments.get(argi++) : null;
       if ((features & IS_NESTED_SET) != 0) {
+        @SuppressWarnings("unchecked")
         NestedSet<Object> nestedSet = (NestedSet<Object>) arguments.get(argi++);
         originalValues = nestedSet.toList();
       } else {
@@ -218,7 +219,7 @@
                   location,
                   null));
         }
-        List resultAsList = (List) result;
+        List<?> resultAsList = (List) result;
         if (resultAsList.size() != expandedValues.size()) {
           throw new CommandLineExpansionException(
               errorMessage(
@@ -382,7 +383,7 @@
       BaseFunction mapEach =
           ((features & HAS_MAP_EACH) != 0) ? (BaseFunction) arguments.get(argi++) : null;
       if ((features & IS_NESTED_SET) != 0) {
-        NestedSet<Object> values = (NestedSet<Object>) arguments.get(argi++);
+        NestedSet<?> values = (NestedSet) arguments.get(argi++);
         if (mapEach != null) {
           CommandLineItem.MapFn<Object> commandLineItemMapFn =
               new CommandLineItemMapEachAdaptor(mapEach, location, starlarkSemantics);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkLateBoundDefault.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkLateBoundDefault.java
index 63bd132..8c26b50 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkLateBoundDefault.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkLateBoundDefault.java
@@ -58,7 +58,6 @@
 
   @Override
   public Label resolve(Rule rule, AttributeMap attributes, FragmentT config) {
-    Class<?> fragmentClass = config.getClass();
     try {
       Object result = method.invoke(config);
       return (Label) result;
@@ -224,26 +223,24 @@
               });
 
   /**
-   * Returns a {@link LateBoundDefault} which obtains a late-bound attribute value
-   * (of type 'label') specifically by skylark configuration fragment name and field name, as
-   * registered by {@link SkylarkConfigurationField}.
+   * Returns a {@link LateBoundDefault} which obtains a late-bound attribute value (of type 'label')
+   * specifically by skylark configuration fragment name and field name, as registered by {@link
+   * SkylarkConfigurationField}.
    *
    * @param fragmentClass the configuration fragment class, which must have a valid skylark name
-   * @param fragmentFieldName the configuration field name, as registered by
-   *     {@link SkylarkConfigurationField} annotation
+   * @param fragmentFieldName the configuration field name, as registered by {@link
+   *     SkylarkConfigurationField} annotation
    * @param toolsRepository the Bazel tools repository path fragment
-   *
    * @throws InvalidConfigurationFieldException if there is no valid configuration field with the
    *     given fragment class and field name
    */
+  @SuppressWarnings("unchecked")
   public static <FragmentT> SkylarkLateBoundDefault<FragmentT> forConfigurationField(
-      Class<FragmentT> fragmentClass,
-      String fragmentFieldName,
-      String toolsRepository) throws InvalidConfigurationFieldException {
+      Class<FragmentT> fragmentClass, String fragmentFieldName, String toolsRepository)
+      throws InvalidConfigurationFieldException {
     try {
       CacheKey cacheKey = new CacheKey(fragmentClass, toolsRepository);
-      SkylarkLateBoundDefault resolver =
-          fieldCache.get(cacheKey).get(fragmentFieldName);
+      SkylarkLateBoundDefault<?> resolver = fieldCache.get(cacheKey).get(fragmentFieldName);
       if (resolver == null) {
         SkylarkModule moduleAnnotation = SkylarkInterfaceUtils.getSkylarkModule(fragmentClass);
         if (moduleAnnotation == null) {
@@ -253,7 +250,7 @@
             String.format("invalid configuration field name '%s' on fragment '%s'",
                 fragmentFieldName, moduleAnnotation.name()));
       }
-      return resolver;
+      return (SkylarkLateBoundDefault<FragmentT>) resolver; // unchecked cast
     } catch (ExecutionException e) {
       throw new IllegalStateException("method invocation failed: " + e);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index 52a5c8b..a481b98 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -270,8 +270,6 @@
 
   // TODO(bazel-team): implement attribute copy and other rule properties
   @Override
-  @SuppressWarnings({"rawtypes", "unchecked"}) // castMap produces
-  // an Attribute.Builder instead of a Attribute.Builder<?> but it's OK.
   public BaseFunction rule(
       StarlarkFunction implementation,
       Boolean test,
@@ -663,6 +661,7 @@
         }
       }
 
+      @SuppressWarnings("unchecked")
       BuildLangTypedAttributeValuesMap attributeValues =
           new BuildLangTypedAttributeValuesMap((Map<String, Object>) args[0]);
       try {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
index 1cd9136..afb841c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
@@ -349,7 +349,7 @@
         oldStyleProviders = struct;
 
         if (struct.hasField("providers")) {
-          Iterable iterable = cast("providers", struct, Iterable.class, loc);
+          Iterable<?> iterable = cast("providers", struct, Iterable.class, loc);
           for (Object o : iterable) {
             InfoInterface declaredProvider =
                 SkylarkType.cast(
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 63d4a71..5196387 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -783,7 +783,7 @@
   private static <T> T assertTypeForNewFile(Object obj, Class<T> type, Location loc,
       String errorMessage) throws EvalException {
     if (type.isInstance(obj)) {
-      return (T) obj;
+      return type.cast(obj);
     } else {
       throw new EvalException(loc, errorMessage);
     }
@@ -876,7 +876,7 @@
    */
   @Override
   public Runtime.NoneType action(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object executableUnchecked,
       Object toolsUnchecked,
@@ -937,7 +937,8 @@
 
   @Override
   public String expandLocation(
-      String input, SkylarkList targets, Location loc, StarlarkThread thread) throws EvalException {
+      String input, SkylarkList<?> targets, Location loc, StarlarkThread thread)
+      throws EvalException {
     checkMutable("expand_location");
     try {
       return LocationExpander.withExecPaths(
@@ -986,7 +987,7 @@
 
   @Override
   public Runfiles runfiles(
-      SkylarkList files,
+      SkylarkList<?> files,
       Object transitiveFiles,
       Boolean collectData,
       Boolean collectDefault,
@@ -1040,7 +1041,7 @@
       Object attributeUnchecked,
       Boolean expandLocations,
       Object makeVariablesUnchecked,
-      SkylarkList tools,
+      SkylarkList<?> tools,
       SkylarkDict<?, ?> labelDictUnchecked,
       SkylarkDict<?, ?> executionRequirementsUnchecked,
       Location loc,
@@ -1095,7 +1096,7 @@
   }
 
   @Override
-  public Tuple<Object> resolveTools(SkylarkList tools) throws ConversionException, EvalException {
+  public Tuple<Object> resolveTools(SkylarkList<?> tools) throws EvalException {
     checkMutable("resolve_tools");
     CommandHelper helper =
         CommandHelper.builder(getRuleContext())
@@ -1116,7 +1117,6 @@
    * Returns a corresponding map where any sets are replaced by iterables.
    */
   // TODO(bazel-team): find a better way to typecheck this argument.
-  @SuppressWarnings("unchecked")
   private static Map<Label, Iterable<Artifact>> checkLabelDict(
       Map<?, ?> labelDict, Location loc, StarlarkThread thread) throws EvalException {
     Map<Label, Iterable<Artifact>> convertedMap = new HashMap<>();
diff --git a/src/main/java/com/google/devtools/build/lib/collect/compacthashmap/CompactHashMap.java b/src/main/java/com/google/devtools/build/lib/collect/compacthashmap/CompactHashMap.java
index 2cf2a62..ce13579 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/compacthashmap/CompactHashMap.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/compacthashmap/CompactHashMap.java
@@ -563,6 +563,7 @@
   }
 
   @Override
+  @SuppressWarnings("unchecked") // keys/values only contains Ks/Vs
   public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
     checkNotNull(function);
     for (int i = 0; i < size; i++) {
@@ -641,6 +642,7 @@
   }
 
   @Override
+  @SuppressWarnings("unchecked") // keys/values contains only Ks/Vs
   public void forEach(BiConsumer<? super K, ? super V> action) {
     checkNotNull(action);
     for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
@@ -817,6 +819,7 @@
     }
 
     @Override
+    @SuppressWarnings("unchecked") // values contains only Vs
     public void forEach(Consumer<? super V> action) {
       checkNotNull(action);
       for (int i = firstEntryIndex(); i >= 0; i = getSuccessor(i)) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 79a5ec5..89201b3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -2204,7 +2204,7 @@
    */
   public ImmutableList<Aspect> getAspects(Rule rule) {
     ImmutableList.Builder<Aspect> builder = null;
-    for (RuleAspect aspect : aspects) {
+    for (RuleAspect<?> aspect : aspects) {
       Aspect a = aspect.getAspect(rule);
       if (a != null) {
         if (builder == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
index ffa6b65..b8c59f9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ConfiguredAttributeMapper.java
@@ -89,10 +89,11 @@
   }
 
   /**
-   * Variation of {@link #get} that throws an informative exception if the attribute
-   * can't be resolved due to intrinsic contradictions in the configuration.
+   * Variation of {@link #get} that throws an informative exception if the attribute can't be
+   * resolved due to intrinsic contradictions in the configuration.
    */
-  private <T> T getAndValidate(String attributeName, Type<T> type) throws EvalException  {
+  @SuppressWarnings("unchecked")
+  private <T> T getAndValidate(String attributeName, Type<T> type) throws EvalException {
     SelectorList<T> selectorList = getSelectorList(attributeName, type);
     if (selectorList == null) {
       // This is a normal attribute.
@@ -109,7 +110,7 @@
         // do that anyway, so that isn't a loss.
         Attribute attr = getAttributeDefinition(attributeName);
         Verify.verify(attr.getCondition() == Predicates.<AttributeMap>alwaysTrue());
-        resolvedList.add((T) attr.getDefaultValue(null));
+        resolvedList.add((T) attr.getDefaultValue(null)); // unchecked cast
       } else {
         resolvedList.add(resolvedPath.value);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
index 7068a15..58a0ae0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
@@ -106,7 +106,7 @@
           }
           ImmutableMap.Builder<String, Object> entryBuilder
               = new ImmutableMap.Builder<String, Object>();
-          for (Map.Entry<Object, Object> keyValue : ((Map<Object, Object>) entry).entrySet()) {
+          for (Map.Entry<?, ?> keyValue : ((Map<?, ?>) entry).entrySet()) {
             Object attribute = keyValue.getKey();
             if (!(attribute instanceof String)) {
               throw resolvedValueError(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java b/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
index 335d6eb..7afb652 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
@@ -95,12 +95,13 @@
   }
 
   @Override
+  @SuppressWarnings("unchecked")
   public Collection<Dirent> readdir(Path path) throws IOException {
     Object result = readdirCache.getUnchecked(path);
     if (result instanceof IOException) {
       throw (IOException) result;
     }
-    return (Collection<Dirent>) result;
+    return (Collection<Dirent>) result; // unchecked cast
   }
 
   @Override
@@ -114,12 +115,13 @@
   }
 
   @Override
+  @SuppressWarnings("unchecked")
   public Dirent.Type getType(Path path, Symlinks symlinks) throws IOException {
     // Use a cached stat call if we have one. This is done first so that we don't need to iterate
     // over a list of directory entries as we do for cached readdir() entries. We don't ever expect
     // to get a cache hit if symlinks == Symlinks.NOFOLLOW and so we don't bother to check.
     if (symlinks == Symlinks.FOLLOW) {
-      Pair key = Pair.of(path, symlinks);
+      Pair<Path, Symlinks> key = Pair.of(path, symlinks);
       Object result = statCache.getIfPresent(key);
       if (result != null && !(result instanceof IOException)) {
         if (result == NO_STATUS) {
@@ -144,7 +146,7 @@
     // stat.
     Object result = readdirCache.getIfPresent(parent);
     if (result != null && !(result instanceof IOException)) {
-      for (Dirent dirent : (Collection<Dirent>) result) {
+      for (Dirent dirent : (Collection<Dirent>) result) { // unchecked cast
         // TODO(djasper): Dealing with filesystem case is a bit of a code smell. Figure out a better
         // way to store Dirents, e.g. with names normalized.
         if (path.getFileSystem().isFilePathCaseSensitive()
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
index b5e4821..990a39e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValueRootPackageExtractor.java
@@ -42,7 +42,7 @@
       ImmutableSet<PathFragment> blacklistedSubdirectories,
       ImmutableSet<PathFragment> excludedSubdirectories)
       throws InterruptedException {
-    ImmutableSet filteredBlacklistedSubdirectories =
+    ImmutableSet<PathFragment> filteredBlacklistedSubdirectories =
         ImmutableSet.copyOf(
             Iterables.filter(
                 blacklistedSubdirectories,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index b9a54a9..d753cdc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -726,7 +726,7 @@
       // We evaluate in keepGoing mode because in the case that the graph does not store its
       // edges, nokeepGoing builds are not allowed, whereas keepGoing builds are always
       // permitted.
-      EvaluationResult result =
+      EvaluationResult<?> result =
           evaluate(
               ImmutableList.of(key), true, ResourceUsage.getAvailableProcessors(), eventHandler);
       if (!result.hasError()) {
@@ -1409,7 +1409,6 @@
     return starlarkSemanticsOptions.toSkylarkSemantics();
   }
 
-  @SuppressWarnings("unchecked")
   private void setPackageLocator(PathPackageLocator pkgLocator) {
     EventBus eventBus = this.eventBus.get();
     if (eventBus != null) {
@@ -3023,4 +3022,3 @@
     return buildDriver.evaluate(roots, evaluationContext);
   }
 }
-
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
index 8563e38..9b9129b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
@@ -147,7 +147,7 @@
             addOutputGroups(struct.getValue(field), loc, builder);
           } else if (field.equals("providers")) {
             Object value = struct.getValue(field);
-            Iterable providers =
+            Iterable<?> providers =
                 SkylarkType.cast(
                     value,
                     Iterable.class,
@@ -170,8 +170,8 @@
     return configuredAspect;
   }
 
-  private void addDeclaredProviders(ConfiguredAspect.Builder builder, Iterable aspectSkylarkObject)
-      throws EvalException {
+  private void addDeclaredProviders(
+      ConfiguredAspect.Builder builder, Iterable<?> aspectSkylarkObject) throws EvalException {
     int i = 0;
     for (Object o : aspectSkylarkObject) {
       Location loc = skylarkAspect.getImplementation().getLocation();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
index a3d0a4d..416ddd1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkModuleCycleReporter.java
@@ -93,7 +93,7 @@
             || IS_SKYLARK_MODULE_SKY_KEY.apply(lastPathElement)
             || IS_WORKSPACE_FILE.apply(lastPathElement))) {
 
-      Function printer =
+      Function<SkyKey, String> printer =
           new Function<SkyKey, String>() {
             @Override
             public String apply(SkyKey input) {
@@ -138,7 +138,7 @@
       StringBuilder cycleMessage =
           new StringBuilder().append("Circular definition of repositories:");
       Iterable<SkyKey> repos = Iterables.filter(cycle, IS_REPOSITORY);
-      Function printer =
+      Function<SkyKey, String> printer =
           new Function<SkyKey, String>() {
             @Override
             public String apply(SkyKey input) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
index e840c47..51c5d76 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetFunction.java
@@ -130,8 +130,9 @@
   }
 
   @Override
-  public SkyValue computeSkyValue(TargetAndErrorIfAny targetAndErrorIfAny,
-      TransitiveTargetValueBuilder builder) {
+  @SuppressWarnings("unchecked")
+  public SkyValue computeSkyValue(
+      TargetAndErrorIfAny targetAndErrorIfAny, TransitiveTargetValueBuilder builder) {
     Target target = targetAndErrorIfAny.getTarget();
     NoSuchTargetException errorLoadingTarget = targetAndErrorIfAny.getErrorLoadingTarget();
 
@@ -159,7 +160,7 @@
                 attr.getLateBoundDefault().getFragmentClass())) {
           addFragmentIfNew(
               builder,
-              (Class<? extends BuildConfiguration.Fragment>)
+              (Class<? extends BuildConfiguration.Fragment>) // unchecked cast
                   attr.getLateBoundDefault().getFragmentClass());
         }
       }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
index 96d3c4c..a8c429d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java
@@ -179,7 +179,7 @@
               .append(symbol)
               .append("\")\n");
           builder.append(symbol).append("(\n");
-          for (Map.Entry<Object, Object> arg : ((Map<Object, Object>) args).entrySet()) {
+          for (Map.Entry<?, ?> arg : ((Map<?, ?>) args).entrySet()) {
             Object key = arg.getKey();
             if (!(key instanceof String)) {
               throw resolvedValueError(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownNestedSets.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownNestedSets.java
index 59e49eb..73bbfc2 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownNestedSets.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownNestedSets.java
@@ -31,7 +31,7 @@
 
   @Override
   protected Object transformToKey(Object nestedSetViewObject) {
-    NestedSetView<Artifact> nestedSetView = (NestedSetView<Artifact>) nestedSetViewObject;
+    NestedSetView<?> nestedSetView = (NestedSetView<?>) nestedSetViewObject;
     // The NestedSet is identified by their raw 'children' object since multiple NestedSetViews
     // can point to the same object.
     return nestedSetView.identifier();
@@ -39,15 +39,15 @@
 
   @Override
   AnalysisProtos.DepSetOfFiles createProto(Object nestedSetViewObject, String id) {
-    NestedSetView<Artifact> nestedSetView = (NestedSetView<Artifact>) nestedSetViewObject;
+    NestedSetView<?> nestedSetView = (NestedSetView) nestedSetViewObject;
     AnalysisProtos.DepSetOfFiles.Builder depSetBuilder = AnalysisProtos.DepSetOfFiles
         .newBuilder()
         .setId(id);
-    for (NestedSetView<Artifact> transitiveNestedSet : nestedSetView.transitives()) {
+    for (NestedSetView<?> transitiveNestedSet : nestedSetView.transitives()) {
       depSetBuilder.addTransitiveDepSetIds(this.dataToId(transitiveNestedSet));
     }
-    for (Artifact directArtifact : nestedSetView.directs()) {
-      depSetBuilder.addDirectArtifactIds(knownArtifacts.dataToId(directArtifact));
+    for (Object directArtifact : nestedSetView.directs()) {
+      depSetBuilder.addDirectArtifactIds(knownArtifacts.dataToId((Artifact) directArtifact));
     }
     return depSetBuilder.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java
index ebea05d..e8b156d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/DeserializationContext.java
@@ -69,7 +69,7 @@
     return deserializeInternal(codedIn, memoizationStrategy);
   }
 
-  @SuppressWarnings({"TypeParameterUnusedInFormals"})
+  @SuppressWarnings({"TypeParameterUnusedInFormals", "unchecked"})
   private <T> T deserializeInternal(
       CodedInputStream codedIn, @Nullable MemoizationStrategy customMemoizationStrategy)
       throws IOException, SerializationException {
@@ -79,7 +79,7 @@
     }
     if (tag < 0) {
       // Subtract 1 to undo transformation from SerializationContext to avoid null.
-      return (T) deserializer.getMemoized(-tag - 1);
+      return (T) deserializer.getMemoized(-tag - 1); // unchecked cast
     }
     T constant = (T) registry.maybeGetConstantByTag(tag);
     if (constant != null) {
@@ -87,7 +87,7 @@
     }
     CodecDescriptor codecDescriptor = registry.getCodecDescriptorByTag(tag);
     if (deserializer == null) {
-      return (T) codecDescriptor.deserialize(this, codedIn);
+      return (T) codecDescriptor.deserialize(this, codedIn); // unchecked cast
     } else {
       @SuppressWarnings("unchecked")
       ObjectCodec<T> castCodec = (ObjectCodec<T>) codecDescriptor.getCodec();
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
index 03c1186..618bba3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
@@ -349,7 +349,7 @@
       },
       useLocation = true)
   public void run(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object unusedInputsList,
       Object executableUnchecked,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
index 43cf590..dd2c6b2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
@@ -688,7 +688,7 @@
       useLocation = true,
       useStarlarkThread = true)
   public Runtime.NoneType action(
-      SkylarkList outputs,
+      SkylarkList<?> outputs,
       Object inputs,
       Object executableUnchecked,
       Object toolsUnchecked,
@@ -736,7 +736,8 @@
       useLocation = true,
       useStarlarkThread = true)
   public String expandLocation(
-      String input, SkylarkList targets, Location loc, StarlarkThread thread) throws EvalException;
+      String input, SkylarkList<?> targets, Location loc, StarlarkThread thread)
+      throws EvalException;
 
   @SkylarkCallable(
       name = "file_action",
@@ -897,7 +898,7 @@
       },
       useLocation = true)
   public RunfilesApi runfiles(
-      SkylarkList files,
+      SkylarkList<?> files,
       Object transitiveFiles,
       Boolean collectData,
       Boolean collectDefault,
@@ -985,7 +986,7 @@
       Object attributeUnchecked,
       Boolean expandLocations,
       Object makeVariablesUnchecked,
-      SkylarkList tools,
+      SkylarkList<?> tools,
       SkylarkDict<?, ?> labelDictUnchecked,
       SkylarkDict<?, ?> executionRequirementsUnchecked,
       Location loc,
@@ -1013,5 +1014,5 @@
       },
       useLocation = false,
       useStarlarkThread = false)
-  public Tuple<Object> resolveTools(SkylarkList tools) throws EvalException;
+  public Tuple<Object> resolveTools(SkylarkList<?> tools) throws EvalException;
 }