+ return IfFeatureExpr.isPresent(StmtContextUtils.parseNodeIdentifier(ctx, value));
+ }
+
+ @Override
+ public void onFullDefinitionDeclared(
+ final Mutable<IfFeatureExpr, IfFeatureStatement, IfFeatureEffectiveStatement> stmt) {
+ super.onFullDefinitionDeclared(stmt);
+
+ final ModelActionBuilder verifyFeatures = stmt.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
+ final Map<Prerequisite<?>, QName> backRef = new HashMap<>();
+ for (QName feature : stmt.coerceStatementArgument().getReferencedFeatures()) {
+ backRef.put(verifyFeatures.requiresCtx(stmt, FeatureNamespace.class, feature,
+ ModelProcessingPhase.EFFECTIVE_MODEL), feature);
+ }
+
+ verifyFeatures.apply(new InferenceAction() {
+ @Override
+ public void apply(final InferenceContext ctx) {
+ LOG.debug("Resolved all feature references in {}", backRef.values());
+ }
+
+ @Override
+ public void prerequisiteFailed(final Collection<? extends Prerequisite<?>> failed) {
+ final Set<QName> unresolvedFeatures = new HashSet<>();
+ for (Prerequisite<?> prereq : failed) {
+ unresolvedFeatures.add(verifyNotNull(backRef.get(prereq)));
+ }
+
+ throw new InferenceException(stmt.getStatementSourceReference(),
+ "Failed to resolve feature references %s in \"%s\"", unresolvedFeatures,
+ stmt.rawStatementArgument());
+ }
+ });
+ }