aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/config/ConfigChecker.java19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
index 46ec748f..fe607f83 100644
--- a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
+++ b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
@@ -2,6 +2,11 @@ package org.shedlang.compiler.config;
import org.shedlang.compiler.config.errors.ConfigError;
import org.shedlang.compiler.typechecker.TypeInfos;
+import org.shedlang.compiler.types.Effects;
+import org.shedlang.compiler.types.FunctionType;
+import org.shedlang.compiler.types.Types;
+
+import java.util.List;
public class ConfigChecker {
private ConfigChecker() {
@@ -17,8 +22,18 @@ public class ConfigChecker {
var namespaceTypeInfo = typeInfos.namespaceTypeInfo(binConfig.mainNamespace())
.orElseThrow(() -> new ConfigError("Namespace " + binConfig.mainNamespace() + " not found"));
- if (namespaceTypeInfo.fieldType("main").isEmpty()) {
- throw new ConfigError("Namespace " + binConfig.mainNamespace() + " has no field main");
+ var mainType = namespaceTypeInfo.fieldType("main")
+ .orElseThrow(() -> new ConfigError("Namespace " + binConfig.mainNamespace() + " has no field main"));
+
+ var expectedMainType = new FunctionType(
+ List.of(),
+ List.of(),
+ Effects.IO,
+ Types.UNIT
+ );
+
+ if (!mainType.equals(expectedMainType)) {
+ throw new ConfigError("main function should have type " + expectedMainType.describe() + ", but " + binConfig.mainNamespace() + ".main has type " + mainType.describe());
}
}
}