- private static String getRevisionDateString(final IRStatement importStatement, final SourceIdentifier source) {
- String revisionDateStr = null;
- for (final IRStatement substatement : importStatement.statements()) {
- if (isBuiltin(substatement, REVISION_DATE)) {
- revisionDateStr = safeStringArgument(source, substatement, "imported module revision-date");
- }
- }
- return revisionDateStr;
+ private static @NonNull ImmutableSet<Revision> extractRevisions(final IRStatement root,
+ final SourceIdentifier sourceId) {
+ return root.statements().stream()
+ .filter(stmt -> isBuiltin(stmt, REVISION))
+ .map(stmt -> Revision.of(safeStringArgument(sourceId, stmt, "revision argument")))
+ .collect(ImmutableSet.toImmutableSet());
+ }
+
+ private static @Nullable Revision extractRevisionDate(final IRStatement root, final SourceIdentifier sourceId) {
+ return root.statements().stream()
+ .filter(stmt -> isBuiltin(stmt, REVISION_DATE))
+ .findFirst()
+ .map(stmt -> Revision.of(safeStringArgument(sourceId, stmt, "revision date argument")))
+ .orElse(null);
+ }
+
+ private static @NonNull ImmutableSet<Import> extractImports(final IRStatement root,
+ final SourceIdentifier sourceId) {
+ return root.statements().stream()
+ .filter(stmt -> isBuiltin(stmt, IMPORT))
+ .map(stmt -> new Import(Unqualified.of(safeStringArgument(sourceId, stmt, "imported module name")),
+ extractPrefix(stmt, sourceId), extractRevisionDate(stmt, sourceId)))
+ .collect(ImmutableSet.toImmutableSet());
+ }
+
+ private static @NonNull ImmutableSet<Include> extractIncludes(final IRStatement root,
+ final SourceIdentifier sourceId) {
+ return root.statements().stream()
+ .filter(stmt -> isBuiltin(stmt, INCLUDE))
+ .map(stmt -> new Include(Unqualified.of(safeStringArgument(sourceId, stmt, "included submodule name")),
+ extractRevisionDate(stmt, sourceId)))
+ .collect(ImmutableSet.toImmutableSet());
+ }
+
+ private static boolean isBuiltin(final IRStatement stmt, final String localName) {
+ return stmt.keyword() instanceof IRKeyword.Unqualified keyword && localName.equals(keyword.identifier());