private void deserializeRule(DeserializationContext context, Build.Rule rulePb) throws PackageDeserializationException, InterruptedException { Location ruleLocation = EmptyLocation.INSTANCE; RuleClass ruleClass = packageDeserializationEnvironment.getRuleClass(rulePb, ruleLocation); Map<String, ParsedAttributeValue> attributeValues = new HashMap<>(); AttributesToDeserialize attrToDeserialize = packageDeserializationEnvironment.attributesToDeserialize(); Hasher hasher = Hashing.md5().newHasher(); for (Build.Attribute attrPb : rulePb.getAttributeList()) { Type<?> type = ruleClass.getAttributeByName(attrPb.getName()).getType(); attributeValues.put(attrPb.getName(), deserializeAttribute(type, attrPb)); if (attrToDeserialize.addSyntheticAttributeHash) { // TODO(bazel-team): This might give false positives because of explicit vs implicit. hasher.putBytes(attrPb.toByteArray()); } } AttributeContainerWithoutLocation attributeContainer = new AttributeContainerWithoutLocation(ruleClass, hasher.hash()); Label ruleLabel = deserializeLabel(rulePb.getName()); try { Rule rule = createRuleWithParsedAttributeValues( ruleClass, ruleLabel, context.packageBuilder, ruleLocation, attributeValues, NullEventHandler.INSTANCE, attributeContainer); context.packageBuilder.addRule(rule); // Remove the attribute after it is added to package in order to pass the validations // and be able to compute all the outputs. if (attrToDeserialize != DESERIALIZE_ALL_ATTRS) { for (String attrName : attributeValues.keySet()) { Attribute attribute = ruleClass.getAttributeByName(attrName); if (!(attrToDeserialize.shouldKeepAttributeWithName.apply(attrName) || BuildType.isLabelType(attribute.getType()))) { attributeContainer.clearIfNotLabel(attrName); } } } Preconditions.checkState(!rule.containsErrors()); } catch (NameConflictException | LabelSyntaxException e) { throw new PackageDeserializationException(e); } }
private void deserializeRule(DeserializationContext context, Build.Rule rulePb) throws PackageDeserializationException, InterruptedException { Location ruleLocation = EmptyLocation.INSTANCE; RuleClass ruleClass = packageDeserializationEnvironment.getRuleClass(rulePb, ruleLocation); Map<String, ParsedAttributeValue> attributeValues = new HashMap<>(); for (Build.Attribute attrPb : rulePb.getAttributeList()) { Type<?> type = ruleClass.getAttributeByName(attrPb.getName()).getType(); attributeValues.put(attrPb.getName(), deserializeAttribute(type, attrPb)); } Label ruleLabel = deserializeLabel(rulePb.getName()); try { Rule rule = ruleClass.createRuleWithParsedAttributeValues( ruleLabel, context.packageBuilder, ruleLocation, attributeValues, NullEventHandler.INSTANCE, new AttributeContainerWithoutLocation(ruleClass)); context.packageBuilder.addRule(rule); Preconditions.checkState(!rule.containsErrors()); } catch (NameConflictException | LabelSyntaxException e) { throw new PackageDeserializationException(e); } }
/** * Deserialize a package from its representation as a protocol message. The inverse of {@link * PackageSerializer#serialize}. * * @throws IOException * @throws InterruptedException */ private void deserializeInternal( Build.Package packagePb, StoredEventHandler eventHandler, Package.Builder builder, InputStream in) throws PackageDeserializationException, IOException, InterruptedException { Path buildFile = packageDeserializationEnvironment.getPath(packagePb.getBuildFilePath()); Preconditions.checkNotNull(buildFile); DeserializationContext context = new DeserializationContext(builder); builder.setFilename(buildFile); if (packagePb.hasDefaultVisibilitySet() && packagePb.getDefaultVisibilitySet()) { builder.setDefaultVisibility( PackageFactory.getVisibility( deserializeLabels(packagePb.getDefaultVisibilityLabelList()))); } // It's important to do this after setting the default visibility, since that implicitly sets // this bit to true builder.setDefaultVisibilitySet(packagePb.getDefaultVisibilitySet()); if (packagePb.hasDefaultTestonly()) { builder.setDefaultTestonly(packagePb.getDefaultTestonly()); } if (packagePb.hasDefaultDeprecation()) { builder.setDefaultDeprecation(packagePb.getDefaultDeprecation()); } builder.setDefaultCopts(packagePb.getDefaultCoptList()); if (packagePb.hasDefaultHdrsCheck()) { builder.setDefaultHdrsCheck(packagePb.getDefaultHdrsCheck()); } if (packagePb.hasDefaultLicense()) { builder.setDefaultLicense(deserializeLicense(packagePb.getDefaultLicense())); } builder.setDefaultDistribs(deserializeDistribs(packagePb.getDefaultDistribList())); for (String subinclude : packagePb.getSubincludeLabelList()) { Label label = deserializeLabel(subinclude); builder.addSubinclude(label, null); } ImmutableList.Builder<Label> skylarkFileDependencies = ImmutableList.builder(); for (String skylarkFile : packagePb.getSkylarkLabelList()) { skylarkFileDependencies.add(deserializeLabel(skylarkFile)); } builder.setSkylarkFileDependencies(skylarkFileDependencies.build()); MakeEnvironment.Builder makeEnvBuilder = new MakeEnvironment.Builder(); for (Build.MakeVar makeVar : packagePb.getMakeVariableList()) { for (Build.MakeVarBinding binding : makeVar.getBindingList()) { makeEnvBuilder.update( makeVar.getName(), binding.getValue(), binding.getPlatformSetRegexp()); } } builder.setMakeEnv(makeEnvBuilder); for (Build.Event event : packagePb.getEventList()) { deserializeEvent(eventHandler, event); } if (packagePb.hasContainsErrors() && packagePb.getContainsErrors()) { builder.setContainsErrors(); } builder.setWorkspaceName(packagePb.getWorkspaceName()); deserializeTargets(in, context); }