+
+ @Override
+ protected final ImportStatement createDeclared(final StmtContext<String, ImportStatement, ?> ctx,
+ final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+ return new ImportStatementImpl(ctx, substatements);
+ }
+
+ @Override
+ protected final ImportStatement createEmptyDeclared(final StmtContext<String, ImportStatement, ?> ctx) {
+ throw new IllegalStateException("Unexpected empty declared import statement");
+ }
+
+ @Override
+ protected final ImportEffectiveStatement createEffective(
+ final StmtContext<String, ImportStatement, ImportEffectiveStatement> ctx, final ImportStatement declared,
+ final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+
+ final String prefix = declared.getPrefix().getValue();
+ final SemVer semVer;
+ final Revision revision;
+ if (!ctx.isEnabledSemanticVersioning()) {
+ final Optional<Revision> optRev = substatements.stream()
+ .filter(RevisionDateEffectiveStatement.class::isInstance)
+ .findFirst()
+ .map(stmt -> ((RevisionDateEffectiveStatement) stmt).argument());
+ revision = optRev.isPresent() ? optRev.get() : getImportedRevision(ctx, declared.getModule(), prefix);
+ semVer = null;
+ } else {
+ final SemVerSourceIdentifier importedModuleIdentifier = ctx.getFromNamespace(
+ ImportPrefixToSemVerSourceIdentifier.class, prefix);
+ revision = importedModuleIdentifier.getRevision().orElse(null);
+ semVer = importedModuleIdentifier.getSemanticVersion().orElse(null);
+ }
+
+ return new ImportEffectiveStatementImpl(declared, substatements, revision, semVer);
+ }
+
+ @Override
+ protected final ImportEffectiveStatement createEmptyEffective(
+ final StmtContext<String, ImportStatement, ImportEffectiveStatement> ctx, final ImportStatement declared) {
+ throw new IllegalStateException("Unexpected empty effective import statement");
+ }
+
+ private static Revision getImportedRevision(final StmtContext<String, ImportStatement, ?> ctx,
+ final String moduleName, final String prefix) {
+ // When 'revision-date' of an import is not specified in yang source, we need to find revision of imported
+ // module.
+ final QNameModule importedModule = StmtContextUtils.getModuleQNameByPrefix(ctx, prefix);
+ SourceException.throwIfNull(importedModule, ctx.getStatementSourceReference(),
+ "Unable to find import of module %s with prefix %s.", moduleName, prefix);
+ return importedModule.getRevision().orElse(null);
+ }