aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-23 09:41:01 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-23 09:41:01 +0000
commitc0fb45c014d53d41f29ca47c4ea57f368e176182 (patch)
tree3c45eb6e9379b14116b567b2d6696e205e43e6e8 /src/main/java
parent3b2351332b1f8941caba89caac6add07aad11e3c (diff)
Create separate TomlSyntaxConfigError
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/config/ConfigChecker.java10
-rw-r--r--src/main/java/org/shedlang/compiler/config/ProjectConfig.java29
-rw-r--r--src/main/java/org/shedlang/compiler/config/errors/ConfigError.java7
-rw-r--r--src/main/java/org/shedlang/compiler/config/errors/TomlSyntaxConfigError.java9
4 files changed, 43 insertions, 12 deletions
diff --git a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
index 8648b8a7..96fb4f00 100644
--- a/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
+++ b/src/main/java/org/shedlang/compiler/config/ConfigChecker.java
@@ -1,6 +1,7 @@
package org.shedlang.compiler.config;
import org.shedlang.compiler.config.errors.ConfigError;
+import org.shedlang.compiler.sources.Sources;
import org.shedlang.compiler.typechecker.TypeInfos;
import org.shedlang.compiler.types.Effects;
import org.shedlang.compiler.types.FunctionType;
@@ -24,12 +25,14 @@ public class ConfigChecker {
static void configCheckBin(BinConfig binConfig, TypeInfos typeInfos) {
var namespaceTypeInfo = typeInfos.namespaceTypeInfo(binConfig.mainNamespace())
.orElseThrow(() -> new ConfigError(
- "Namespace " + binConfig.mainNamespace() + " not found"
+ "Namespace " + binConfig.mainNamespace() + " not found",
+ Sources.NULL
));
var mainType = namespaceTypeInfo.fieldType(MAIN_FUNCTION_NAME)
.orElseThrow(() -> new ConfigError(
- "Namespace " + binConfig.mainNamespace() + " has no field " + MAIN_FUNCTION_NAME
+ "Namespace " + binConfig.mainNamespace() + " has no field " + MAIN_FUNCTION_NAME,
+ Sources.NULL
));
var expectedMainType = new FunctionType(
@@ -44,7 +47,8 @@ public class ConfigChecker {
throw new ConfigError(
MAIN_FUNCTION_NAME + " function should have type " + expectedMainType.describe() +
", but " + binConfig.mainNamespace() + "." + MAIN_FUNCTION_NAME +
- " has type " + mainType.describe()
+ " has type " + mainType.describe(),
+ Sources.NULL
);
}
}
diff --git a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
index 3381e521..2a8cbd43 100644
--- a/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
+++ b/src/main/java/org/shedlang/compiler/config/ProjectConfig.java
@@ -1,11 +1,16 @@
package org.shedlang.compiler.config;
+import org.shedlang.compiler.config.errors.TomlSyntaxConfigError;
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.sources.Sources;
import org.tomlj.Toml;
import org.tomlj.TomlParseResult;
import org.tomlj.TomlTable;
import java.io.IOException;
+import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
@@ -16,17 +21,31 @@ public record ProjectConfig(
List<ProfileConfig> profiles
) {
public static ProjectConfig read(Path projectPath) throws IOException {
- var tomlParseResult = Toml.parse(projectPath.resolve("shed.toml"));
- return fromTomlParseResult(projectPath, tomlParseResult);
+ var configPath = projectPath.resolve("shed.toml");
+ var contents = Files.readString(configPath);
+ var source = Sources.file(configPath, contents);
+ var tomlParseResult = Toml.parse(configPath);
+ return fromTomlParseResult(projectPath, tomlParseResult, source);
}
public static ProjectConfig fromString(Path projectPath, String config) {
- return fromTomlParseResult(projectPath, Toml.parse(config));
+ return fromTomlParseResult(
+ projectPath,
+ Toml.parse(config),
+ Sources.string(config)
+ );
}
- private static ProjectConfig fromTomlParseResult(Path projectPath, TomlParseResult result) {
+ private static ProjectConfig fromTomlParseResult(Path projectPath, TomlParseResult result, Source source) {
if (result.hasErrors()) {
- throw result.errors().get(0);
+ var error = result.errors().get(0);
+ var lines = source.contents().split("\n");
+ var lineCharacterIndex = Arrays.stream(lines)
+ .limit(error.position().line() - 1)
+ .mapToInt(line -> line.length() + 1)
+ .sum();
+ var characterIndex = lineCharacterIndex + error.position().column() - 1;
+ throw new TomlSyntaxConfigError(error.getMessage(), source.at(characterIndex, characterIndex));
}
return fromToml(projectPath, result);
diff --git a/src/main/java/org/shedlang/compiler/config/errors/ConfigError.java b/src/main/java/org/shedlang/compiler/config/errors/ConfigError.java
index 7d847bb3..9f7869ed 100644
--- a/src/main/java/org/shedlang/compiler/config/errors/ConfigError.java
+++ b/src/main/java/org/shedlang/compiler/config/errors/ConfigError.java
@@ -1,11 +1,10 @@
package org.shedlang.compiler.config.errors;
import org.shedlang.compiler.errors.SourceError;
-import org.shedlang.compiler.sources.Sources;
+import org.shedlang.compiler.sources.Source;
public class ConfigError extends SourceError {
- public ConfigError(String message) {
- // TODO: proper source
- super(message, Sources.NULL);
+ public ConfigError(String message, Source source) {
+ super(message, source);
}
}
diff --git a/src/main/java/org/shedlang/compiler/config/errors/TomlSyntaxConfigError.java b/src/main/java/org/shedlang/compiler/config/errors/TomlSyntaxConfigError.java
new file mode 100644
index 00000000..5455cba2
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/config/errors/TomlSyntaxConfigError.java
@@ -0,0 +1,9 @@
+package org.shedlang.compiler.config.errors;
+
+import org.shedlang.compiler.sources.Source;
+
+public class TomlSyntaxConfigError extends ConfigError {
+ public TomlSyntaxConfigError(String message, Source source) {
+ super(message, source);
+ }
+}