aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-22 23:23:36 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-22 23:23:36 +0100
commit192cb27a8d8bc78211897c9f9325eb898390dbc4 (patch)
treef3771b5f2fb54a5b5eaa3fceadf283f190df9627 /src/main/java
parent074d98cef949be601fc11377c4036cd5e7023ac4 (diff)
Check type of main function
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());
}
}
}