diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-22 22:31:24 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-22 22:31:24 +0100 |
| commit | 6f4afccfe077fa305d5cabe24c1a133bc8c20fcc (patch) | |
| tree | da541836a8e1a1fe258773df642238e090de97f6 /src/main/java | |
| parent | d1d0984bc8a157a2f001d3c991dae5c9498cd790 (diff) | |
Add proper description of function type
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/types/FunctionType.java | 39 |
1 files changed, 37 insertions, 2 deletions
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<Type> positionalParams, List<NamedParam> 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( |
