private Feature(CToolchain.Feature feature) throws InvalidConfigurationException { this.name = feature.getName(); ImmutableList.Builder<FlagSet> builder = ImmutableList.builder(); for (CToolchain.FlagSet flagSet : feature.getFlagSetList()) { builder.add(new FlagSet(flagSet)); } this.flagSets = builder.build(); }
/** * Constructs the feature configuration from a {@code CToolchain} protocol buffer. * * @param toolchain the toolchain configuration as specified by the user. * @throws InvalidConfigurationException if the configuration has logical errors. */ CcToolchainFeatures(CToolchain toolchain) throws InvalidConfigurationException { // Build up the feature graph. // First, we build up the map of name -> features in one pass, so that earlier features can // reference later features in their configuration. ImmutableList.Builder<Feature> features = ImmutableList.builder(); HashMap<String, Feature> featuresByName = new HashMap<>(); for (CToolchain.Feature toolchainFeature : toolchain.getFeatureList()) { Feature feature = new Feature(toolchainFeature); features.add(feature); if (featuresByName.put(feature.getName(), feature) != null) { throw new InvalidConfigurationException( "Invalid toolchain configuration: feature '" + feature.getName() + "' was specified multiple times."); } } this.features = features.build(); this.featuresByName = ImmutableMap.copyOf(featuresByName); // Next, we build up all forward references for 'implies' and 'requires' edges. ImmutableMultimap.Builder<Feature, Feature> implies = ImmutableMultimap.builder(); ImmutableMultimap.Builder<Feature, ImmutableSet<Feature>> requires = ImmutableMultimap.builder(); // We also store the reverse 'implied by' and 'required by' edges during this pass. ImmutableMultimap.Builder<Feature, Feature> impliedBy = ImmutableMultimap.builder(); ImmutableMultimap.Builder<Feature, Feature> requiredBy = ImmutableMultimap.builder(); for (CToolchain.Feature toolchainFeature : toolchain.getFeatureList()) { String name = toolchainFeature.getName(); Feature feature = featuresByName.get(name); for (CToolchain.FeatureSet requiredFeatures : toolchainFeature.getRequiresList()) { ImmutableSet.Builder<Feature> allOf = ImmutableSet.builder(); for (String requiredName : requiredFeatures.getFeatureList()) { Feature required = getFeatureOrFail(requiredName, name); allOf.add(required); requiredBy.put(required, feature); } requires.put(feature, allOf.build()); } for (String impliedName : toolchainFeature.getImpliesList()) { Feature implied = getFeatureOrFail(impliedName, name); impliedBy.put(implied, feature); implies.put(feature, implied); } } this.implies = implies.build(); this.requires = requires.build(); this.impliedBy = impliedBy.build(); this.requiredBy = requiredBy.build(); }