import org.eclipse.jdt.annotation.NonNull;
import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.UsesEffectiveStatement;
final AbstractCompositeGenerator<?, ?> parent) {
super(statement, parent);
this.uses = requireNonNull(uses);
-
- // FIXME: use SchemaTreeAwareEffectiveStatement
- var stmt = parent.statement();
- for (var qname : statement.argument().getNodeIdentifiers()) {
- final var tmp = stmt;
- stmt = stmt.streamEffectiveSubstatements(SchemaTreeEffectiveStatement.class)
- .filter(child -> qname.equals(child.argument()))
- .findFirst()
- .orElseThrow(() -> new IllegalStateException("Failed to find " + qname + " in " + tmp));
- }
- setTargetStatement(stmt);
}
void resolveGrouping(final UsesEffectiveStatement resolvedUses, final GroupingGenerator resolvedGrouping) {
// Our parent here is *not* the 'uses' statement, but rather the statement which contains it.
return new AugmentRequirement(this, verifyNotNull(grouping, "Unresolved grouping in %s", this));
}
+
+ @Override
+ boolean matchesInstantiated(final AugmentEffectiveStatement statement) {
+ return super.matchesInstantiated(statement) || declared(statement()).equals(declared(statement));
+ }
+
+ private static AugmentStatement declared(final AugmentEffectiveStatement statement) {
+ // We are generating Augmentation interfaces on declared model, hence this is accurate
+ return verifyNotNull(statement.getDeclared(), " %s does not have a declared view", statement);
+ }
+
+ @Override
+ TargetAugmentEffectiveStatement effectiveIn(final SchemaTreeAwareEffectiveStatement<?, ?> target) {
+ verify(target instanceof SchemaTreeEffectiveStatement, "Unexpected statement %s", target);
+ // 'uses'/'augment': our children are binding to target's namespace
+
+ final var targetNamespace = ((SchemaTreeEffectiveStatement<?>) target).argument().getModule();
+ return effectiveIn(target, qname -> qname.bindTo(targetNamespace));
+ }
}