summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/HobgoblinCompiler.java43
1 files changed, 37 insertions, 6 deletions
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<TypedNamespaceNode>();
@@ -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<Path> collectSourceFiles(
+ Path sourceRoot
+ ) throws IOException {
+ var sourceFiles = new ArrayList<Path>();
+
+ Files.walkFileTree(sourceRoot, new SimpleFileVisitor<Path>() {
+ @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;
+ }
}