From 1ce720a70e964dd002800f4bc96c631229e0fa24 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 28 Sep 2023 13:48:33 +0100 Subject: Pluralise type info collection --- .../java/org/shedlang/compiler/ShedCompiler.java | 2 +- .../org/shedlang/compiler/backends/Backend.java | 4 +- .../backends/GenerateInstructionsBackend.java | 4 +- .../shedlang/compiler/backends/PatioBackend.java | 6 +-- .../compiler/backends/llvm/LlvmBackend.java | 12 ++--- .../compiler/backends/wasm/WasmBackend.java | 12 ++--- .../compiler/patio/PatioCodeGenContext.java | 20 ++++----- .../compiler/typechecker/TypeCheckerContext.java | 52 +++++++++++----------- .../shedlang/compiler/typechecker/TypeInfo.java | 28 ------------ .../shedlang/compiler/typechecker/TypeInfos.java | 28 ++++++++++++ 10 files changed, 84 insertions(+), 84 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ShedCompiler.java b/src/main/java/org/shedlang/compiler/ShedCompiler.java index fcfb127c..7b96a524 100644 --- a/src/main/java/org/shedlang/compiler/ShedCompiler.java +++ b/src/main/java/org/shedlang/compiler/ShedCompiler.java @@ -74,7 +74,7 @@ public class ShedCompiler { namespaces.add(stackIrNamespace); } - backend.compile(config, namespaces, typeCheckerContext.toTypeInfo(), config.targetDir().resolve(backend.name())); + backend.compile(config, namespaces, typeCheckerContext.toTypeInfos(), config.targetDir().resolve(backend.name())); } private List collectSourceFilePaths(Path sourceRoot) throws IOException { diff --git a/src/main/java/org/shedlang/compiler/backends/Backend.java b/src/main/java/org/shedlang/compiler/backends/Backend.java index aba5fe1b..42938d34 100644 --- a/src/main/java/org/shedlang/compiler/backends/Backend.java +++ b/src/main/java/org/shedlang/compiler/backends/Backend.java @@ -2,7 +2,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.stackir.StackIrNamespace; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import java.io.IOException; import java.nio.file.Path; @@ -14,7 +14,7 @@ public interface Backend { void compile( ProjectConfig config, List namespaces, - TypeInfo typeInfo, + TypeInfos typeInfos, Path targetDir ) throws IOException, InterruptedException; } diff --git a/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java b/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java index fe64a16d..5c27757c 100644 --- a/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/GenerateInstructionsBackend.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.backends; import org.shedlang.compiler.config.ProjectConfig; import org.shedlang.compiler.stackir.InstructionSerializer; import org.shedlang.compiler.stackir.StackIrNamespace; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import java.nio.file.Path; import java.util.List; @@ -12,7 +12,7 @@ public class GenerateInstructionsBackend implements Backend { public void compile( ProjectConfig config, List namespaces, - TypeInfo typeInfo, + TypeInfos typeInfos, Path targetDir ) { System.out.println("main: " + config.main()); diff --git a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java index 682bf79f..a647e842 100644 --- a/src/main/java/org/shedlang/compiler/backends/PatioBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/PatioBackend.java @@ -5,7 +5,7 @@ import org.shedlang.compiler.patio.PatioCodeGen; import org.shedlang.compiler.patio.PatioCodeGenContext; import org.shedlang.compiler.patio.ast.PatioSerializer; import org.shedlang.compiler.stackir.StackIrNamespace; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import java.nio.file.Path; import java.util.List; @@ -14,12 +14,12 @@ public class PatioBackend implements Backend { public void compile( ProjectConfig config, List namespaces, - TypeInfo typeInfo, + TypeInfos typeInfos, Path targetDir ) { System.out.println("main: " + config.main()); - var context = PatioCodeGenContext.forTypeInfo(typeInfo); + var context = PatioCodeGenContext.forTypeInfos(typeInfos); for (var namespace : namespaces) { System.out.println(namespace.namespaceName()); diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java index 2cb22612..77159c8c 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmBackend.java @@ -16,7 +16,7 @@ import org.shedlang.compiler.patio.PatioCodeGen; import org.shedlang.compiler.patio.PatioCodeGenContext; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.stackir.StackIrNamespace; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import org.shedlang.compiler.types.NamespaceName; import java.io.IOException; @@ -42,14 +42,14 @@ public class LlvmBackend implements Backend { public void compile( ProjectConfig config, List namespaces, - TypeInfo typeInfo, + TypeInfos typeInfos, Path targetDir ) throws IOException, InterruptedException { var objectFilePaths = new ArrayList(); for (var namespace : namespaces) { var patioCompilationUnit = PatioCodeGen.generateNamespace( namespace, - PatioCodeGenContext.forTypeInfo(typeInfo) + PatioCodeGenContext.forTypeInfos(typeInfos) ); var llvmModule = LlvmPatioCodeGen.generateCompilationUnit(patioCompilationUnit); @@ -64,7 +64,7 @@ public class LlvmBackend implements Backend { } for (var bin : config.bins()) { - var mainModule = this.generateMain(config.main(), typeInfo); + var mainModule = this.generateMain(config.main(), typeInfos); var mainObjectPath = compileLlvmModule(mainModule, targetDir.resolve("bins"), bin.name()); var gccArgs = new ArrayList(); @@ -84,11 +84,11 @@ public class LlvmBackend implements Backend { } } - private LlvmModule generateMain(NamespaceName main, TypeInfo typeInfo) { + private LlvmModule generateMain(NamespaceName main, TypeInfos typeInfos) { // TODO: use more appropriate source var source = Sources.NULL; - var context = PatioCodeGenContext.forTypeInfo(typeInfo); + var context = PatioCodeGenContext.forTypeInfos(typeInfos); var generateMainResult = PatioCodeGen.generateMain(main, source, context); var mainFunctionName = generateMainResult.value(); diff --git a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java index 8c3bc338..218a6f69 100644 --- a/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java +++ b/src/main/java/org/shedlang/compiler/backends/wasm/WasmBackend.java @@ -11,7 +11,7 @@ import org.shedlang.compiler.patio.PatioCodeGen; import org.shedlang.compiler.patio.PatioCodeGenContext; import org.shedlang.compiler.sources.Sources; import org.shedlang.compiler.stackir.StackIrNamespace; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import org.shedlang.compiler.types.NamespaceName; import java.io.FileOutputStream; @@ -35,14 +35,14 @@ public class WasmBackend implements Backend { public void compile( ProjectConfig config, List namespaces, - TypeInfo typeInfo, + TypeInfos typeInfos, Path targetDir ) throws IOException, InterruptedException { var objectFilePaths = new ArrayList(); for (var namespace : namespaces) { var patioCompilationUnit = PatioCodeGen.generateNamespace( namespace, - PatioCodeGenContext.forTypeInfo(typeInfo) + PatioCodeGenContext.forTypeInfos(typeInfos) ); var wasmModule = WasmPatioCodeGen.generateCompilationUnit(patioCompilationUnit); @@ -66,7 +66,7 @@ public class WasmBackend implements Backend { ldArgs.add(objectFilePath.toString()); } - var mainModule = this.generateMain(config.main(), typeInfo); + var mainModule = this.generateMain(config.main(), typeInfos); var mainObjectPath = writeObjectFile(mainModule, targetDir.resolve("bins"), bin.name()); ldArgs.add(mainObjectPath.toString()); @@ -76,11 +76,11 @@ public class WasmBackend implements Backend { } } - private WasmModule generateMain(NamespaceName main, TypeInfo typeInfo) { + private WasmModule generateMain(NamespaceName main, TypeInfos typeInfos) { // TODO: set appropriate source var source = Sources.NULL; - var context = PatioCodeGenContext.forTypeInfo(typeInfo); + var context = PatioCodeGenContext.forTypeInfos(typeInfos); var generateMainResult = PatioCodeGen.generateMain(main, source, context); var mainFunctionName = generateMainResult.value(); diff --git a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java index 44495f3b..fb176c1e 100644 --- a/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java +++ b/src/main/java/org/shedlang/compiler/patio/PatioCodeGenContext.java @@ -12,7 +12,7 @@ import org.shedlang.compiler.patio.ast.operands.PatioLocalRef; import org.shedlang.compiler.patio.ast.types.PatioDataLayout; import org.shedlang.compiler.patio.ast.types.PatioType; import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.typechecker.TypeInfo; +import org.shedlang.compiler.typechecker.TypeInfos; import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.NamespaceTypeInfo; import org.shedlang.compiler.util.P; @@ -29,18 +29,18 @@ public record PatioCodeGenContext( FunctionContext functionContext ) { public record CompilationUnitContext( - TypeInfo typeInfo, + TypeInfos typeInfos, OrderedPMap elementsByName ) { public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) { - return typeInfo.namespaceTypeInfo(namespaceName); + return typeInfos.namespaceTypeInfo(namespaceName); } - public static final CompilationUnitContext EMPTY = forTypeInfo(TypeInfo.EMPTY); + public static final CompilationUnitContext EMPTY = forTypeInfos(TypeInfos.EMPTY); - public static CompilationUnitContext forTypeInfo(TypeInfo typeInfo) { + public static CompilationUnitContext forTypeInfos(TypeInfos typeInfos) { return new CompilationUnitContext( - typeInfo, + typeInfos, OrderedPMap.empty() ); } @@ -48,7 +48,7 @@ public record PatioCodeGenContext( public CompilationUnitContext addElement(PatioCompilationUnitElement element) { // TODO: handle existing element with name. return new CompilationUnitContext( - this.typeInfo, + this.typeInfos, this.elementsByName.plus(element.name(), element) ); } @@ -74,7 +74,7 @@ public record PatioCodeGenContext( PatioCompilationUnitElement element ) { return new CompilationUnitContext( - this.typeInfo, + this.typeInfos, this.elementsByName.plus(element.name(), element) ); } @@ -228,9 +228,9 @@ public record PatioCodeGenContext( FunctionContext.EMPTY ); - public static PatioCodeGenContext forTypeInfo(TypeInfo typeInfo) { + public static PatioCodeGenContext forTypeInfos(TypeInfos typeInfos) { return new PatioCodeGenContext( - CompilationUnitContext.forTypeInfo(typeInfo), + CompilationUnitContext.forTypeInfos(typeInfos), P.stack(), FunctionContext.EMPTY ); diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java index 5026dee6..c62b4e48 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java @@ -104,17 +104,17 @@ public class TypeCheckerContext { } } - private final PMap namespaceTypeInfo; - private final PMap structTypeInfo; + private final PMap namespaceTypeInfos; + private final PMap structTypeInfos; private final PStack stack; public TypeCheckerContext( - PMap namespaceTypeInfo, - PMap structTypeInfo, + PMap namespaceTypeInfos, + PMap structTypeInfos, PStack stack ) { - this.namespaceTypeInfo = namespaceTypeInfo; - this.structTypeInfo = structTypeInfo; + this.namespaceTypeInfos = namespaceTypeInfos; + this.structTypeInfos = structTypeInfos; this.stack = stack; } @@ -142,8 +142,8 @@ public class TypeCheckerContext { } return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo, + this.namespaceTypeInfos, + this.structTypeInfos, newStack ); } @@ -179,8 +179,8 @@ public class TypeCheckerContext { Optional newReturnType ) { return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo, + this.namespaceTypeInfos, + this.structTypeInfos, this.stack.plus(new LexicalContext( newNamespaceName, this.environment().plusAll(newEnvironment), @@ -195,8 +195,8 @@ public class TypeCheckerContext { public TypeCheckerContext exit() { return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo, + this.namespaceTypeInfos, + this.structTypeInfos, this.stack.minus(0) ); } @@ -204,8 +204,8 @@ public class TypeCheckerContext { public TypeCheckerContext enterFreeVariableCapture() { // TODO: do this properly (should not affect environment, possibly other bits of lexical context) return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo, + this.namespaceTypeInfos, + this.structTypeInfos, this.stack.plus(FreeVariableCapture.EMPTY) ); } @@ -242,8 +242,8 @@ public class TypeCheckerContext { } return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo, + this.namespaceTypeInfos, + this.structTypeInfos, newLexicalContextStack ); } @@ -341,14 +341,14 @@ public class TypeCheckerContext { var namespaceTypeInfo = new NamespaceTypeInfo(fields); return new TypeCheckerContext( - this.namespaceTypeInfo.plus(namespaceName, namespaceTypeInfo), - this.structTypeInfo, + this.namespaceTypeInfos.plus(namespaceName, namespaceTypeInfo), + this.structTypeInfos, this.stack ); } public PMap namespaceTypeInfo() { - return namespaceTypeInfo; + return namespaceTypeInfos; } public TypeCheckerContext addStructTypeInfo( @@ -356,19 +356,19 @@ public class TypeCheckerContext { StructTypeInfo structTypeInfo ) { return new TypeCheckerContext( - this.namespaceTypeInfo, - this.structTypeInfo.plus(structType, structTypeInfo), + this.namespaceTypeInfos, + this.structTypeInfos.plus(structType, structTypeInfo), this.stack ); } public StructTypeInfo structTypeInfo(StructType type, Source source) { - return Optional.ofNullable(this.structTypeInfo.get(type)) + return Optional.ofNullable(this.structTypeInfos.get(type)) .orElseThrow(() -> new MissingStructTypeInfoError(type, source)); } - public PMap structTypeInfo() { - return structTypeInfo; + public PMap structTypeInfos() { + return structTypeInfos; } public TypeCheckerResult toResult(T value) { @@ -391,7 +391,7 @@ public class TypeCheckerContext { return new TypeCheckerResult<>(mappedValues, context); } - public TypeInfo toTypeInfo() { - return new TypeInfo(namespaceTypeInfo); + public TypeInfos toTypeInfos() { + return new TypeInfos(namespaceTypeInfos); } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java deleted file mode 100644 index f7c381d9..00000000 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.shedlang.compiler.typechecker; - -import org.pcollections.Empty; -import org.pcollections.PMap; -import org.shedlang.compiler.types.NamespaceName; -import org.shedlang.compiler.types.NamespaceTypeInfo; - -public class TypeInfo { - public static final TypeInfo EMPTY = new TypeInfo(Empty.map()); - - private final PMap namespaceTypeInfo; - - public TypeInfo( - PMap namespaceTypeInfo - ) { - this.namespaceTypeInfo = namespaceTypeInfo; - } - - public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) { - // TODO: throw better error - var typeInfo = namespaceTypeInfo.get(namespaceName); - if (typeInfo == null) { - throw new RuntimeException("No type info for: " + namespaceName); - } else { - return typeInfo; - } - } -} diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java new file mode 100644 index 00000000..7331ee07 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeInfos.java @@ -0,0 +1,28 @@ +package org.shedlang.compiler.typechecker; + +import org.pcollections.Empty; +import org.pcollections.PMap; +import org.shedlang.compiler.types.NamespaceName; +import org.shedlang.compiler.types.NamespaceTypeInfo; + +public class TypeInfos { + public static final TypeInfos EMPTY = new TypeInfos(Empty.map()); + + private final PMap namespaceTypeInfos; + + public TypeInfos( + PMap namespaceTypeInfos + ) { + this.namespaceTypeInfos = namespaceTypeInfos; + } + + public NamespaceTypeInfo namespaceTypeInfo(NamespaceName namespaceName) { + // TODO: throw better error + var typeInfo = namespaceTypeInfos.get(namespaceName); + if (typeInfo == null) { + throw new RuntimeException("No type info for: " + namespaceName); + } else { + return typeInfo; + } + } +} -- cgit v1.2.3