From 0559249e215564b9c3f2c804247bb8c67fb7bef8 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 26 May 2026 19:55:53 +0100 Subject: Check subdirectories for source files --- .../hobgoblin/compiler/HobgoblinCompiler.java | 43 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 6 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java index 40d9453..db757ce 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java @@ -11,9 +11,13 @@ import org.zwobble.sourcetext.SourceText; import java.io.IOException; import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; +import java.util.List; public class HobgoblinCompiler { public static final String FILE_NAME_EXTENSION = ".hob"; @@ -26,8 +30,6 @@ public class HobgoblinCompiler { var generators = config.createGenerators(); var sourceDirectory = projectRoot.resolve("src"); - var sourceFiles = sourceDirectory.toFile() - .listFiles(file -> file.toPath().toString().endsWith(FILE_NAME_EXTENSION)); var typedNamespaceNodes = new ArrayList(); @@ -36,10 +38,10 @@ public class HobgoblinCompiler { typeCheckerContext.addNativeType(NativeTypes.STRING); typeCheckerContext.addNativeTypeConstructor(NativeTypes.LIST); - for (var sourceFile : sourceFiles) { - var namespaceName = sourceFileNamespaceName(sourceDirectory, sourceFile.toPath()); - var sourceContents = Files.readString(sourceFile.toPath(), StandardCharsets.UTF_8); - var sourceText = SourceText.fromString(sourceFile.toPath().toString(), sourceContents); + for (var sourceFile : collectSourceFiles(sourceDirectory)) { + var namespaceName = sourceFileNamespaceName(sourceDirectory, sourceFile); + var sourceContents = Files.readString(sourceFile, StandardCharsets.UTF_8); + var sourceText = SourceText.fromString(sourceFile.toString(), sourceContents); var untypedNamespaceNode = Parser.parseNamespace(sourceText, namespaceName); var typedNamespaceNode = TypeChecker.typeCheckNamespace(untypedNamespaceNode, typeCheckerContext); @@ -67,4 +69,33 @@ public class HobgoblinCompiler { return new NamespaceName(parts); } + + private static List collectSourceFiles( + Path sourceRoot + ) throws IOException { + var sourceFiles = new ArrayList(); + + Files.walkFileTree(sourceRoot, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile( + Path file, + BasicFileAttributes attrs + ) { + if (file.toString().endsWith(FILE_NAME_EXTENSION)) { + sourceFiles.add(file); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory( + Path dir, + IOException exc + ) { + return FileVisitResult.CONTINUE; + } + }); + sourceFiles.sort(null); + return sourceFiles; + } } -- cgit v1.2.3