Specify concrete argument types to prevent any shenaningans.
JIRA: YANGTOOLS-1453
Change-Id: I1d82058e92f2afe0de740df1093ea43f12cb7244
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
}
@Override
- public <K, E extends EffectiveStatement<?, ?>> Prerequisite<StmtContext<?, ?, E>> requiresCtxPath(
- final StmtContext<?, ?, ?> context, final ParserNamespace<K, ? extends StmtContext<?, ?, ?>> namespace,
- final Iterable<K> keys, final ModelProcessingPhase phase) {
+ public <K, C extends StmtContext<?, ?, ?>> Prerequisite<C> requiresCtxPath(final StmtContext<?, ?, ?> context,
+ final ParserNamespace<K, C> namespace, final Iterable<K> keys, final ModelProcessingPhase phase) {
checkNotRegistered();
- final var ret = new PhaseRequirementInNamespacePath<StmtContext<?, ?, E>, K>(EFFECTIVE_MODEL, keys);
+ final var ret = new PhaseRequirementInNamespacePath<C, K>(EFFECTIVE_MODEL, keys);
addReq(ret);
addBootstrap(() -> ret.hookOnto(context, namespace));
return ret;
import java.util.Map.Entry;
import java.util.Optional;
import org.eclipse.jdt.annotation.NonNull;
-import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.NamespaceStorageNode;
import org.opendaylight.yangtools.yang.parser.spi.meta.NamespaceBehaviour.Registry;
* @param key Key
* @param value Context value
* @param <K> namespace key type
- * @param <D> declared statement type
- * @param <E> effective statement type
+ * @param <C> context type
* @throws NamespaceNotAvailableException when the namespace is not available.
*/
- public final <K, D extends DeclaredStatement<?>, E extends EffectiveStatement<?, D>> void addContextToNamespace(
- final ParserNamespace<K, StmtContext<?, D, E>> type, final K key, final StmtContext<?, D, E> value) {
+ public final <K, C extends StmtContext<?, ?, ?>> void addContextToNamespace(
+ final ParserNamespace<K, ? super C> type, final K key, final C value) {
getBehaviourRegistry().getNamespaceBehaviour(type).addTo(this, key, value);
}
@Override
@Deprecated
- public <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
- final ParserNamespace<K, StmtContext<?, Y, Z>> namespace, final KT key, final StmtContext<?, Y, Z> stmt) {
+ public <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+ final ParserNamespace<K, ? super C> namespace, final KT key, final C stmt) {
throw new UnsupportedOperationException();
}
}
@Override
- public final <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
- final ParserNamespace<K, StmtContext<?, Y, Z>> namespace, final KT key, final StmtContext<?, Y, Z> stmt) {
+ public final <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+ final ParserNamespace<K, ? super C> namespace, final KT key, final C stmt) {
addContextToNamespace(namespace, key, stmt);
}
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
final Unqualified moduleName = stmt.getArgument();
final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_PRE_LINKAGE);
- final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> imported =
- importAction.requiresCtx(stmt, ParserNamespaces.PRELINKAGE_MODULE, moduleName, SOURCE_PRE_LINKAGE);
+ final var imported = importAction.requiresCtx(stmt, ParserNamespaces.PRELINKAGE_MODULE, moduleName,
+ SOURCE_PRE_LINKAGE);
final Prerequisite<Mutable<?, ?, ?>> rootPrereq = importAction.mutatesCtx(stmt.getRoot(), SOURCE_PRE_LINKAGE);
importAction.apply(new InferenceAction() {
final ModelActionBuilder importAction = stmt.newInferenceAction(SOURCE_LINKAGE);
final Unqualified moduleName = stmt.getArgument();
final Revision revision = firstAttributeOf(stmt.declaredSubstatements(), RevisionDateStatement.class);
- final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> imported;
+ final Prerequisite<StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> imported;
if (revision == null) {
imported = importAction.requiresCtx(stmt, ParserNamespaces.MODULE,
NamespaceKeyCriterion.latestRevisionModule(moduleName), SOURCE_LINKAGE);
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.ModuleStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement;
import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier;
import org.opendaylight.yangtools.yang.model.ri.stmt.DeclaredStatementDecorators;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.InferenceContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite;
import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
import org.opendaylight.yangtools.yang.parser.spi.source.SourceParserNamespaces;
final Mutable<Unqualified, BelongsToStatement, BelongsToEffectiveStatement> belongsToCtx) {
ModelActionBuilder belongsToAction = belongsToCtx.newInferenceAction(ModelProcessingPhase.SOURCE_LINKAGE);
- final Prerequisite<StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> belongsToPrereq =
- belongsToAction.requiresCtx(belongsToCtx, SourceParserNamespaces.MODULE_FOR_BELONGSTO,
- belongsToCtx.getArgument(), ModelProcessingPhase.SOURCE_LINKAGE);
+ final var belongsToPrereq = belongsToAction.requiresCtx(belongsToCtx,
+ SourceParserNamespaces.MODULE_FOR_BELONGSTO, belongsToCtx.getArgument(),
+ ModelProcessingPhase.SOURCE_LINKAGE);
belongsToAction.apply(new InferenceAction() {
@Override
final StmtContext<Revision, ?, ?> revision = findFirstDeclaredSubstatement(stmt, RevisionDateStatement.class);
final ModelActionBuilder includeAction = stmt.newInferenceAction(SOURCE_LINKAGE);
- final Prerequisite<StmtContext<?, SubmoduleStatement, SubmoduleEffectiveStatement>> requiresCtxPrerequisite;
+ final Prerequisite<StmtContext<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement>>
+ requiresCtxPrerequisite;
if (revision == null) {
requiresCtxPrerequisite = includeAction.requiresCtx(stmt, ParserNamespaces.SUBMODULE,
NamespaceKeyCriterion.latestRevisionModule(submoduleName), SOURCE_LINKAGE);
import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement;
import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition.Bit;
}
final ModelActionBuilder typeAction = stmt.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
- final Prerequisite<StmtContext<?, TypedefStatement, TypedefEffectiveStatement>> typePrereq =
- typeAction.requiresCtx(stmt, ParserNamespaces.TYPE, typeQName, ModelProcessingPhase.EFFECTIVE_MODEL);
+ final var typePrereq = typeAction.requiresCtx(stmt, ParserNamespaces.TYPE, typeQName,
+ ModelProcessingPhase.EFFECTIVE_MODEL);
typeAction.mutatesEffectiveCtx(stmt.getParentContext());
/*
import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
-import org.opendaylight.yangtools.yang.model.api.stmt.GroupingEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RefineEffectiveStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement;
import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
final ModelActionBuilder usesAction = usesNode.newInferenceAction(ModelProcessingPhase.EFFECTIVE_MODEL);
final QName groupingName = usesNode.argument();
- final Prerequisite<StmtContext<?, GroupingStatement, GroupingEffectiveStatement>> sourceGroupingPre =
- usesAction.requiresCtx(usesNode, ParserNamespaces.GROUPING, groupingName,
+ final var sourceGroupingPre = usesAction.requiresCtx(usesNode, ParserNamespaces.GROUPING, groupingName,
ModelProcessingPhase.EFFECTIVE_MODEL);
final Prerequisite<? extends Mutable<?, ?, ?>> targetNodePre = usesAction.mutatesEffectiveCtx(
usesNode.getParentContext());
* identifier namespace, where each extension is identified by a QName formed from the defining module's QNameModule
* and the identifier specified in extension statement's argument.
*/
- public static final @NonNull ParserNamespace<QName, StmtContext<?, ExtensionStatement, ExtensionEffectiveStatement>>
- EXTENSION = new ParserNamespace<>("extension");
+ public static final @NonNull ParserNamespace<QName,
+ StmtContext<QName, ExtensionStatement, ExtensionEffectiveStatement>> EXTENSION =
+ new ParserNamespace<>("extension");
/**
* Feature namespace. All feature names defined in a module and its submodules share the same feature identifier
* name.
*/
public static final @NonNull ParserNamespace<QName,
- StmtContext<?, FeatureStatement, FeatureEffectiveStatement>> FEATURE = new ParserNamespace<>("feature");
+ StmtContext<QName, FeatureStatement, FeatureEffectiveStatement>> FEATURE = new ParserNamespace<>("feature");
/**
* Grouping namespace. * All grouping names defined within a parent node or at the top level of the module
* This means that any descendant node may use that grouping, and it MUST NOT define a grouping with the same name.
*/
public static final @NonNull ParserNamespace<QName,
- StmtContext<?, GroupingStatement, GroupingEffectiveStatement>> GROUPING = new ParserNamespace<>("grouping");
+ StmtContext<QName, GroupingStatement, GroupingEffectiveStatement>> GROUPING = new ParserNamespace<>("grouping");
/**
* Identity namespace. All identity names defined in a module and its submodules share the same identity identifier
* namespace.
*/
public static final @NonNull ParserNamespace<QName,
- StmtContext<?, IdentityStatement, IdentityEffectiveStatement>> IDENTITY = new ParserNamespace<>("identity");
+ StmtContext<QName, IdentityStatement, IdentityEffectiveStatement>> IDENTITY = new ParserNamespace<>("identity");
/**
* Module namespace. All modules known to the reactor are populated to this namespace. Each module is identified
* by a {@link SourceIdentifier}.
*/
public static final @NonNull ParserNamespace<SourceIdentifier,
- StmtContext<?, ModuleStatement, ModuleEffectiveStatement>> MODULE = new ParserNamespace<>("module");
+ StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> MODULE = new ParserNamespace<>("module");
/**
* Submodule equivalent of {@link #MODULE}.
*/
public static final @NonNull ParserNamespace<SourceIdentifier,
- StmtContext<?, SubmoduleStatement, SubmoduleEffectiveStatement>> SUBMODULE = new ParserNamespace<>("submodule");
+ StmtContext<Unqualified, SubmoduleStatement, SubmoduleEffectiveStatement>> SUBMODULE =
+ new ParserNamespace<>("submodule");
/**
* Derived types namespace. All derived type names defined within a parent node or at the top level of the module
* (e.g. RFC6020/RFC7950 for YANG 1.0/1.1).
*/
public static final @NonNull ParserNamespace<QName,
- StmtContext<?, TypedefStatement, TypedefEffectiveStatement>> TYPE = new ParserNamespace<>("typedef");
+ StmtContext<QName, TypedefStatement, TypedefEffectiveStatement>> TYPE = new ParserNamespace<>("typedef");
/**
* A derived namespace allowing lookup of modules based on their {@link QNameModule}.
*/
- public static final @NonNull ParserNamespace<QNameModule, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
- NAMESPACE_TO_MODULE = new ParserNamespace<>("namespace-to-module");
+ public static final @NonNull ParserNamespace<QNameModule,
+ StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> NAMESPACE_TO_MODULE =
+ new ParserNamespace<>("namespace-to-module");
/**
* Intermediate-stage namespace equivalent to {@link #MODULE} except it is keyed by module names. This namespace is
* used to resolve inter-module references before actual linkage occurs.
*/
- public static final @NonNull ParserNamespace<Unqualified, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
- PRELINKAGE_MODULE = new ParserNamespace<>("prelinkage-module");
+ public static final @NonNull ParserNamespace<Unqualified,
+ StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> PRELINKAGE_MODULE =
+ new ParserNamespace<>("prelinkage-module");
private ParserNamespaces() {
// Hidden on purpose
<K, C extends StmtContext<?, ?, ?>> @NonNull Prerequisite<C> requiresCtx(StmtContext<?, ?, ?> context,
@NonNull ParserNamespace<K, C> namespace, NamespaceKeyCriterion<K> criterion, ModelProcessingPhase phase);
- <K, E extends EffectiveStatement<?, ?>> @NonNull Prerequisite<StmtContext<?, ?, E>> requiresCtxPath(
- StmtContext<?, ?, ?> context, ParserNamespace<K, ? extends StmtContext<?, ?, ?>> namespace, Iterable<K> keys,
- ModelProcessingPhase phase);
+ <K, C extends StmtContext<?, ?, ?>> @NonNull Prerequisite<C> requiresCtxPath(StmtContext<?, ?, ?> context,
+ ParserNamespace<K, C> namespace, Iterable<K> keys, ModelProcessingPhase phase);
/**
* Action mutates the effective model of specified statement. This is a shorthand for
* @param stmt
* to be added to namespace map
*/
- // FIXME: cleanup the capture here: we really want to capture 'StmtContext<?, Y, Z>'
- <K, KT extends K, Y extends DeclaredStatement<?>, Z extends EffectiveStatement<?, Y>> void addContext(
- @NonNull ParserNamespace<K, StmtContext<?, Y, Z>> namespace, KT key, StmtContext<?, Y, Z> stmt);
+ <K, KT extends K, C extends StmtContext<?, ?, ?>> void addContext(
+ @NonNull ParserNamespace<K, ? super C> namespace, KT key, C stmt);
/**
* Set version of root statement context.
* plain name.
*/
// FIXME: Better name?
- public static final @NonNull ParserNamespace<Unqualified, StmtContext<?, ModuleStatement, ModuleEffectiveStatement>>
- MODULE_FOR_BELONGSTO = new ParserNamespace<>("module-belongsto");
+ public static final @NonNull ParserNamespace<Unqualified,
+ StmtContext<Unqualified, ModuleStatement, ModuleEffectiveStatement>> MODULE_FOR_BELONGSTO =
+ new ParserNamespace<>("module-belongsto");
/**
* Pre-linkage source-specific mapping of prefixes to module namespaces.
/**
* Global mapping of modules to QNameModules.
*/
- public static final @NonNull ParserNamespace<StmtContext<?,?,?>, QNameModule> MODULECTX_TO_QNAME =
+ public static final @NonNull ParserNamespace<StmtContext<?, ?, ?>, QNameModule> MODULECTX_TO_QNAME =
new ParserNamespace<>("modulectx-to-qnamemodule");
public static final @NonNull ParserNamespace<Empty, Set<QName>> SUPPORTED_FEATURES =