@SuppressWarnings("checkstyle:methodTypeParameterName")
public final <X, Y extends DeclaredStatement<X>, Z extends EffectiveStatement<X, Y>>
StatementContextBase<X, Y, Z> createSubstatement(final int offset,
final StatementDefinitionContext<X, Y, Z> def, final StatementSourceReference ref,
final String argument) {
final ModelProcessingPhase inProgressPhase = getRoot().getSourceContext().getInProgressPhase();
checkState(inProgressPhase != ModelProcessingPhase.EFFECTIVE_MODEL,
"Declared statement cannot be added in effective phase at: %s", getStatementSourceReference());
final Optional<StatementSupport<?, ?, ?>> implicitParent = definition.getImplicitParentFor(def.getPublicView());
if (implicitParent.isPresent()) {
return createImplicitParent(offset, implicitParent.get(), ref, argument).createSubstatement(offset, def,
ref, argument);
}
final StatementContextBase<X, Y, Z> ret = new SubstatementContext<>(this, def, ref, argument);
substatements = substatements.put(offset, ret);
def.onStatementAdded(ret);
return ret;
}