From 6dfbc56f7d0c52c5d5b15c38b375fb857609b6e4 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 24 Jan 2024 20:25:27 +0000 Subject: Update Patio text backend to use common code for Patio backends --- .../compiler/backends/PatioTextBackend.java | 71 ++++++++++++++++------ 1 file changed, 53 insertions(+), 18 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java index a68f9303..9a34d6e5 100644 --- a/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/PatioTextBackend.java @@ -1,12 +1,13 @@ package org.shedlang.compiler.backends; +import org.shedlang.compiler.backends.paths.PartialTargetPath; import org.shedlang.compiler.backends.paths.TargetDir; import org.shedlang.compiler.config.ProjectConfig; -import org.shedlang.compiler.shidtopatio.ShidToPatio; -import org.shedlang.compiler.shidtopatio.ShidToPatioContext; +import org.shedlang.compiler.patio.PatioCompilationUnit; import org.shedlang.compiler.patio.PatioSerializer; import org.shedlang.compiler.shid.ShidNamespace; import org.shedlang.compiler.typechecker.TypeInfos; +import org.shedlang.compiler.types.NamespaceName; import java.io.IOException; import java.nio.file.Files; @@ -18,35 +19,69 @@ public class PatioTextBackend implements Backend { private PatioTextBackend() { } + @Override + public String targetName() { + return "patio-text"; + } + public void compile( ProjectConfig config, List namespaces, TypeInfos typeInfos, TargetDir targetDir - ) throws IOException { - var context = ShidToPatioContext.forTypeInfos(typeInfos); + ) throws IOException, InterruptedException { + PatioBackends.compile( + config, + namespaces, + typeInfos, + new PatioToText(targetDir) + ); + } + + private static class PatioToText implements PatioBackends.PatioToTarget { + + private final TargetDir targetDir; + + public PatioToText(TargetDir targetDir) { + this.targetDir = targetDir; + } - for (var namespace : namespaces) { - var compilationUnitResult = ShidToPatio.generateNamespace( - namespace, - context + @Override + public PatioBackends.PatioToTarget namespace( + NamespaceName namespaceName, + PatioCompilationUnit patioCompilationUnit + ) throws IOException, InterruptedException { + serializeToDisk( + targetDir.namespace(namespaceName), + patioCompilationUnit ); - var compilationUnit = compilationUnitResult.value(); - context = compilationUnitResult.context(); + return this; + } + + @Override + public void bin( + String binName, + PatioCompilationUnit patioCompilationUnit, + String mainFunctionName + ) throws IOException, InterruptedException { + serializeToDisk( + targetDir.bin(binName), + patioCompilationUnit + ); + } + + private void serializeToDisk( + PartialTargetPath partialTargetPath, + PatioCompilationUnit patioCompilationUnit + ) throws IOException { var builder = new StringBuilder(); - PatioSerializer.serializeCompilationUnit(compilationUnit, builder); + PatioSerializer.serializeCompilationUnit(patioCompilationUnit, builder); var compilationUnitString = builder.toString(); - var path = targetDir.namespace(namespace.namespaceName()) - .withExtension(".patio-text"); + var path = partialTargetPath.withExtension(".patio-text"); Files.createDirectories(path.getParent()); Files.writeString(path, compilationUnitString); } } - - @Override - public String targetName() { - return "patio-text"; - } } -- cgit v1.2.3