From c0fb45c014d53d41f29ca47c4ea57f368e176182 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 23 Dec 2024 09:41:01 +0000 Subject: Create separate TomlSyntaxConfigError --- .../shedlang/compiler/config/ConfigChecker.java | 10 +++++--- .../shedlang/compiler/config/ProjectConfig.java | 29 ++++++++++++++++++---- .../compiler/config/errors/ConfigError.java | 7 +++--- .../config/errors/TomlSyntaxConfigError.java | 9 +++++++ 4 files changed, 43 insertions(+), 12 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/config/errors/TomlSyntaxConfigError.java (limited to 'src/main/java') 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 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); + } +} -- cgit v1.2.3