/* * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.mdsal.binding.generator.impl.reactor; import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.mdsal.binding.runtime.api.RuntimeType; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; /** * Link to the original definition of an {@link AbstractExplicitGenerator}. */ // FIXME: sealed when we have JDK17+ abstract class OriginalLink, R extends RuntimeType> { private static final class Complete, R extends RuntimeType> extends OriginalLink { private final @NonNull AbstractExplicitGenerator original; Complete(final AbstractExplicitGenerator original) { this.original = requireNonNull(original); } @Override AbstractExplicitGenerator previous() { return original; } @Override @NonNull AbstractExplicitGenerator original() { return original; } @Override ToStringHelper addToStringAttributes(final ToStringHelper helper) { return helper.add("original", original); } } private static final class Partial, R extends RuntimeType> extends OriginalLink { private final @NonNull AbstractExplicitGenerator previous; private AbstractExplicitGenerator original; Partial(final AbstractExplicitGenerator previous) { this.previous = requireNonNull(previous); } @Override AbstractExplicitGenerator previous() { return previous; } @Override AbstractExplicitGenerator original() { if (original == null) { final var link = previous.originalLink(); if (link instanceof Complete || link.previous() != previous) { original = link.original(); } } return original; } @Override ToStringHelper addToStringAttributes(final ToStringHelper helper) { return helper.add("previous", previous).add("original", original); } } private OriginalLink() { // Hidden on purpose } static , R extends RuntimeType> @NonNull OriginalLink complete( final AbstractExplicitGenerator original) { return new Complete<>(original); } static , R extends RuntimeType> @NonNull OriginalLink partial( final AbstractExplicitGenerator previous) { return new Partial<>(previous); } abstract @NonNull AbstractExplicitGenerator previous(); abstract @Nullable AbstractExplicitGenerator original(); abstract ToStringHelper addToStringAttributes(ToStringHelper helper); @Override public final String toString() { return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString(); } }