2 * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.mdsal.binding.generator.impl.reactor;
10 import static java.util.Objects.requireNonNull;
12 import java.util.ArrayDeque;
13 import java.util.Deque;
14 import org.eclipse.jdt.annotation.NonNull;
15 import org.eclipse.jdt.annotation.Nullable;
16 import org.opendaylight.yangtools.concepts.Mutable;
17 import org.opendaylight.yangtools.yang.model.api.stmt.AugmentEffectiveStatement;
20 * Utility to resolve instantiated {@code augment} statements to their {@link AbstractAugmentGenerator} counterparts.
21 * This is essentially a stack of {@link AbstractCompositeGenerator}s which should be examined.
23 final class AugmentResolver implements Mutable {
24 private final Deque<AbstractCompositeGenerator<?, ?>> stack = new ArrayDeque<>();
26 void enter(final AbstractCompositeGenerator<?, ?> generator) {
27 stack.push(requireNonNull(generator));
34 @NonNull AbstractAugmentGenerator getAugment(final AugmentEffectiveStatement statement) {
35 for (var generator : stack) {
36 final var found = findAugment(generator, statement);
41 throw new IllegalStateException("Failed to resolve " + statement + " in " + stack);
44 private @Nullable AbstractAugmentGenerator findAugment(final AbstractCompositeGenerator<?, ?> generator,
45 final AugmentEffectiveStatement statement) {
46 for (var augment : generator.augments()) {
47 if (augment.matchesInstantiated(statement)) {
51 for (var grouping : generator.groupings()) {
52 final var found = findAugment(grouping, statement);