diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-22 23:23:36 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-22 23:23:36 +0100 |
| commit | 192cb27a8d8bc78211897c9f9325eb898390dbc4 (patch) | |
| tree | f3771b5f2fb54a5b5eaa3fceadf283f190df9627 /src | |
| parent | 074d98cef949be601fc11377c4036cd5e7023ac4 (diff) | |
Check type of main function
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/config/ConfigChecker.java | 19 | ||||
| -rw-r--r-- | src/test/java/org/shedlang/compiler/config/ConfigCheckerTests.java | 25 |
2 files changed, 42 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()); } } } diff --git a/src/test/java/org/shedlang/compiler/config/ConfigCheckerTests.java b/src/test/java/org/shedlang/compiler/config/ConfigCheckerTests.java index b6134ed2..404e57e6 100644 --- a/src/test/java/org/shedlang/compiler/config/ConfigCheckerTests.java +++ b/src/test/java/org/shedlang/compiler/config/ConfigCheckerTests.java @@ -66,4 +66,29 @@ public class ConfigCheckerTests { assertThat(error.getMessage(), equalTo("Namespace Main has no field main")); } + + @Test + public void whenMainFunctionHasWrongTypeThenBinConfigIsInvalid() throws IOException { + var binConfig = new BinConfig("x", NamespaceName.of("Main")); + var typeInfos = TypeInfos.EMPTY + .addNamespaceTypeInfo( + NamespaceName.of("Main"), + NamespaceTypeInfo.fromFields(P.orderedMap( + Map.entry( + "main", + new FunctionType(List.of(), List.of(), Effects.IO, Types.STRING) + ) + )) + ); + + var error = assertThrows( + ConfigError.class, + () -> ConfigChecker.configCheckBin(binConfig, typeInfos) + ); + + assertThat( + error.getMessage(), + equalTo("main function should have type fn () ! Io -> Unit, but Main.main has type fn () ! Io -> String") + ); + } } |
