summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/SumTypeInfo.java12
4 files changed, 22 insertions, 17 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java
index ed752d0..a281adf 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/analysis/ArbitraryValueAnalysis.java
@@ -2,7 +2,6 @@ package org.zwobble.hobgoblin.compiler.analysis;
import org.zwobble.hobgoblin.compiler.analysis.errors.SumTypeHasNoVariantsError;
import org.zwobble.hobgoblin.compiler.analysis.errors.TypeIsInfiniteError;
-import org.zwobble.hobgoblin.compiler.sources.NullSource;
import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo;
import org.zwobble.hobgoblin.compiler.types.*;
@@ -12,19 +11,17 @@ import java.util.Set;
public class ArbitraryValueAnalysis {
public static Type selectArbitraryVariant(SumType sumType, TypesInfo typesInfo) {
- var sumVariants = typesInfo.sumVariants(sumType);
- if (sumVariants.isEmpty()) {
- // TODO: proper source
- throw new SumTypeHasNoVariantsError(sumType, NullSource.INSTANCE);
+ var sumTypeInfo = typesInfo.sumTypeInfo(sumType);
+ if (sumTypeInfo.variants().isEmpty()) {
+ throw new SumTypeHasNoVariantsError(sumType, sumTypeInfo.source());
}
var seenTypes = new HashSet<Type>();
seenTypes.add(sumType);
- return sumVariants.stream()
+ return sumTypeInfo.variants().stream()
.filter(variant -> isNonRecursivelyConstructable(variant.valueType(), seenTypes, typesInfo))
.findFirst()
- // TODO: proper source
- .orElseThrow(() -> new TypeIsInfiniteError(sumType, NullSource.INSTANCE))
+ .orElseThrow(() -> new TypeIsInfiniteError(sumType, sumTypeInfo.source()))
.containerType();
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java
index 97a8c74..d812753 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfo.java
@@ -13,6 +13,7 @@ public interface TypesInfo {
List<SumType> variantOf(StructType variantType);
List<SumVariant> sumVariants(SumType type);
+ SumTypeInfo sumTypeInfo(SumType type);
List<EnumVariant> enumVariants(EnumType enumType);
}
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java
index 07c3673..f97badf 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypesInfoInMemory.java
@@ -6,12 +6,6 @@ import org.zwobble.hobgoblin.compiler.types.*;
import java.util.*;
public class TypesInfoInMemory implements TypesInfo {
- private record SumTypeInfo(
- List<SumVariant> variants,
- List<Field> fields,
- Source source
- ) {}
-
public static TypesInfoInMemory empty() {
return new TypesInfoInMemory(
new HashMap<>(),
@@ -88,14 +82,15 @@ public class TypesInfoInMemory implements TypesInfo {
}
public List<SumVariant> sumVariants(SumType type) {
- return sumTypeInfo(type).variants;
+ return sumTypeInfo(type).variants();
}
public List<Field> fieldsOf(SumType type) {
- return sumTypeInfo(type).fields;
+ return sumTypeInfo(type).fields();
}
- private SumTypeInfo sumTypeInfo(SumType type) {
+ @Override
+ public SumTypeInfo sumTypeInfo(SumType type) {
var typeInfo = this.sumTypeInfos.get(type);
if (typeInfo == null) {
// TODO: better error
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/SumTypeInfo.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/SumTypeInfo.java
new file mode 100644
index 0000000..1fde055
--- /dev/null
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/SumTypeInfo.java
@@ -0,0 +1,12 @@
+package org.zwobble.hobgoblin.compiler.types;
+
+import org.zwobble.hobgoblin.compiler.sources.Source;
+
+import java.util.List;
+
+public record SumTypeInfo(
+ List<SumVariant> variants,
+ List<Field> fields,
+ Source source
+) {
+}