Fix StmtContext.produces{Declared,Effective} signatures
[yangtools.git] / yang / yang-parser-spi / src / main / java / org / opendaylight / yangtools / yang / parser / spi / meta / StmtContext.java
index 2ca1a018e96ffeedea1144da799f317441f5f2bf..0d3001fb5681612cd7314e41374255e1085b51b6 100644 (file)
@@ -108,12 +108,11 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
         return verifyNotNull(getStatementArgument(), "Statement context %s does not have an argument", this);
     }
 
-    default <X, Y extends DeclaredStatement<X>> boolean producesDeclared(final Class<? super Y> type) {
+    default <Y extends DeclaredStatement<?>> boolean producesDeclared(final Class<? super Y> type) {
         return type.isAssignableFrom(getPublicDefinition().getDeclaredRepresentationClass());
     }
 
-    default <X, Y extends DeclaredStatement<X>, Z extends EffectiveStatement<A, D>> boolean producesEffective(
-            final Class<? super Z> type) {
+    default <Z extends EffectiveStatement<?, ?>> boolean producesEffective(final Class<? super Z> type) {
         return type.isAssignableFrom(getPublicDefinition().getEffectiveRepresentationClass());
     }
 
@@ -391,4 +390,38 @@ public interface StmtContext<A, D extends DeclaredStatement<A>, E extends Effect
 
         void setIsSupportedToBuildEffective(boolean isSupportedToBuild);
     }
+
+    /**
+     * Search of any child statement context of specified type and return its argument. If such a statement exists, it
+     * is assumed to have the right argument. Users should be careful to use this method for statements which have
+     * cardinality {@code 0..1}, otherwise this method can return any one of the statement's argument.
+     *
+     * <p>
+     * The default implementation defers to
+     * {@link StmtContextDefaults#findSubstatementArgument(StmtContext, Class)}, subclasses are expected to provide
+     * optimized implementation if possible.
+     *
+     * @param <X> Substatement argument type
+     * @param <Z> Substatement effective statement representation
+     * @param type Effective statement representation being look up
+     * @return {@link Optional#empty()} if no statement exists, otherwise the argument value
+     */
+    default <X, Z extends EffectiveStatement<X, ?>> @NonNull Optional<X> findSubstatementArgument(
+            final @NonNull Class<Z> type) {
+        return StmtContextDefaults.findSubstatementArgument(this, type);
+    }
+
+    /**
+     * Check if there is any child statement context of specified type.
+     *
+     * <p>
+     * The default implementation defers to {@link StmtContextDefaults#hasSubstatement(StmtContext, Class)},
+     * subclasses are expected to provide optimized implementation if possible.
+     *
+     * @param type Effective statement representation being look up
+     * @return True if such a child statement exists, false otherwise
+     */
+    default boolean hasSubstatement(final @NonNull Class<? extends EffectiveStatement<?, ?>> type) {
+        return StmtContextDefaults.hasSubstatement(this, type);
+    }
 }