// Copyright 2018 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.packages; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.util.Collection; import java.util.Collections; import java.util.Map; import java.util.Objects; import java.util.Set; /** * Parts of an {@link EnvironmentGroup} that are needed for analysis. Since {@link EnvironmentGroup} * keeps a reference to a {@link Package} object, it is too heavyweight to store in analysis. * *

Constructor should only be called by {@link EnvironmentGroup}, and this object must never be * accessed externally until after {@link EnvironmentGroup#processMemberEnvironments} is called. The * mutability of fulfillersMap means that we must take care to wait until it is set before doing * anything with this class. */ @AutoCodec public class EnvironmentLabels { final Label label; final ImmutableSet

>For example, if the input is ":foo" and ":bar" fulfills * ":foo" and ":baz" fulfills ":bar", this returns * [":foo", ":bar", ":baz"]. * *

If no environments fulfill the input, returns an empty set. */ public Iterable

This will have to be revisited if it turns out to be noticeably expensive. It should be * sound to not compare the values of the fulfillerMaps at all, since they are determined from the * package each EnvironmentLabel is associated with, and so as long as EnvironmentLabels from * different source states but the same package are not compared, the values shouldn't be * necessary. */ private static boolean fulfillerMapsEqual( Map> map1, Map> map2) { if (map1 == map2) { return true; } if (map1.size() != map2.size()) { return false; } for (Map.Entry> entry : map1.entrySet()) { NestedSet