From 6f4afccfe077fa305d5cabe24c1a133bc8c20fcc Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Oct 2023 22:31:24 +0100 Subject: Add proper description of function type --- .../org/shedlang/compiler/types/FunctionType.java | 39 ++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/types/FunctionType.java b/src/main/java/org/shedlang/compiler/types/FunctionType.java index e40439f7..c52de92e 100644 --- a/src/main/java/org/shedlang/compiler/types/FunctionType.java +++ b/src/main/java/org/shedlang/compiler/types/FunctionType.java @@ -5,6 +5,8 @@ import org.pcollections.PVector; import java.util.List; +import static org.shedlang.compiler.util.Iterables.forEachInterspersed; + public record FunctionType( List positionalParams, List namedParams, @@ -17,8 +19,41 @@ public record FunctionType( @Override public String describe() { - // TODO: implement this sensibly - return toString(); + var description = new StringBuilder(); + description.append("fn ("); + + forEachInterspersed( + positionalParams, + param -> description.append(param.describe()), + () -> description.append(", ") + ); + + if (!positionalParams.isEmpty() && !namedParams.isEmpty()) { + description.append(", "); + } + + forEachInterspersed( + namedParams, + param -> { + description.append("."); + description.append(param.name()); + description.append(": "); + description.append(param.type().describe()); + }, + () -> description.append(", ") + ); + + description.append(")"); + + if (!effect.equals(Effects.NONE)) { + description.append(" ! "); + description.append(effect.describe()); + } + + description.append(" -> "); + description.append(returnType.describe()); + + return description.toString(); } public record Builder( -- cgit v1.2.3