diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-16 22:29:21 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-16 22:29:21 +0100 |
| commit | fa21920d943f199609712461cb700418d6d4ead0 (patch) | |
| tree | cf70d787596850167bd76cdd91c5a544a1f36574 /src/main/java | |
| parent | d59ca34fcdf767e86985cedd881784d7b8bb05a2 (diff) | |
Adjust naming of top level entities
Diffstat (limited to 'src/main/java')
5 files changed, 39 insertions, 15 deletions
diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java index 3ebf7b98..e1925e24 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerContext.java @@ -103,14 +103,12 @@ public record LlvmCompilerContext( ).toResult(globalDefinition); } - private String generateTopLevelEntityName(String prefix) { - var name = prefix; - var nextSuffix = 1; - while (topLevelEntitiesByName().containsKey(name)) { - name = prefix + "_" + nextSuffix; - nextSuffix++; - } - return name; + private String generateTopLevelEntityName(LlvmCompilerTopLevelEntitySpace space) { + return NameAllocator.generateName( + topLevelEntitiesByName::containsKey, + "shed__" + space, + Optional.empty() + ); } public Collection<LlvmTopLevelEntity> topLevelEntities() { diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java index 8390893e..b5f94002 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerStrings.java @@ -51,7 +51,7 @@ public class LlvmCompilerStrings { )); var globalDefinitionBuilder = LlvmGlobalDefinitionBuilder.builder() - .namePrefix("string") + .namePrefix(LlvmCompilerTopLevelEntitySpace.STRING) .type(typeStringStruct(codeUnits.length)) .value(llvmValue) .isPrivate(true) diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java new file mode 100644 index 00000000..7ca7a06b --- /dev/null +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmCompilerTopLevelEntitySpace.java @@ -0,0 +1,16 @@ +package org.shedlang.compiler.backends.llvm; + +public enum LlvmCompilerTopLevelEntitySpace { + STRING("string"); + + private final String name; + + LlvmCompilerTopLevelEntitySpace(String name) { + this.name = name; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java index a965bda6..42c692c6 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/LlvmGlobalDefinitionBuilder.java @@ -6,7 +6,7 @@ import org.shedlang.compiler.backends.llvm.ir.ast.types.LlvmType; import java.util.Optional; public record LlvmGlobalDefinitionBuilder( - Optional<String> namePrefix, + Optional<LlvmCompilerTopLevelEntitySpace> namePrefix, Optional<LlvmType> type, Optional<LlvmOperand> value, boolean constant, @@ -24,7 +24,7 @@ public record LlvmGlobalDefinitionBuilder( ); } - public LlvmGlobalDefinitionBuilder namePrefix(String namePrefix) { + public LlvmGlobalDefinitionBuilder namePrefix(LlvmCompilerTopLevelEntitySpace namePrefix) { return new LlvmGlobalDefinitionBuilder( Optional.of(namePrefix), this.type, diff --git a/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java b/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java index d8e37d48..845397a9 100644 --- a/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java +++ b/src/main/java/org/shedlang/compiler/backends/llvm/NameAllocator.java @@ -4,8 +4,9 @@ import org.pcollections.Empty; import org.pcollections.PSet; import java.util.Optional; +import java.util.function.Predicate; -public record NameAllocator<TPrefix>(PSet<String> localVariableNames) { +public record NameAllocator<TPrefix>(PSet<String> existingNames) { public static <TPrefix> NameAllocator<TPrefix> empty() { return new NameAllocator<>(Empty.set()); } @@ -14,6 +15,16 @@ public record NameAllocator<TPrefix>(PSet<String> localVariableNames) { TPrefix prefix, Optional<String> name ) { + var fullName = generateName(existingNames::contains, prefix, name); + var newAllocator = new NameAllocator<TPrefix>(existingNames.plus(fullName)); + return new Result<>(fullName, newAllocator); + } + + public static <TPrefix> String generateName( + Predicate<String> isUsed, + TPrefix prefix, + Optional<String> name + ) { var fullPrefix = prefix.toString(); if (name.isPresent()) { fullPrefix += "__" + name.get(); @@ -22,11 +33,10 @@ public record NameAllocator<TPrefix>(PSet<String> localVariableNames) { var index = 0; while (true) { var fullName = fullPrefix + "__" + index; - if (localVariableNames.contains(fullName)) { + if (isUsed.test(fullName)) { index++; } else { - var newAllocator = new NameAllocator<TPrefix>(localVariableNames.plus(fullName)); - return new Result<>(fullName, newAllocator); + return fullName; } } } |
