aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 23:17:19 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 23:17:19 +0000
commit4de96add3d9d1bdfa1802dba2175c8efb0f9fd43 (patch)
treeb5f805510753e2a1fe0d2ebbeb5976b6b5c42f13 /src/main/java
parentf79bc929ef4dd607e56da8639b60c09a3b64f8d1 (diff)
Extract fieldTypeOrEmpty()
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 8ada73c2..fe8c7b9a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -571,26 +571,42 @@ public class TypeChecker {
));
}
- private static Type fieldType(Type receiverType, String fieldName, Source source, TypeCheckerContext context) {
+ private static Type fieldType(
+ Type receiverType,
+ String fieldName,
+ Source source,
+ TypeCheckerContext context
+ ) {
+ return fieldTypeOrEmpty(receiverType, fieldName, source, context)
+ .orElseThrow(() -> new NoSuchFieldError(receiverType, fieldName, source));
+ }
+
+ private static Optional<Type> fieldTypeOrEmpty(
+ Type receiverType,
+ String fieldName,
+ Source source,
+ TypeCheckerContext context
+ ) {
switch (receiverType) {
case StructType receiverTypeStruct -> {
var structTypeInfo = context.structTypeInfo(receiverTypeStruct, source);
- return structTypeInfo.fieldType(fieldName)
- .orElseThrow(() -> new NoSuchFieldError(receiverTypeStruct, fieldName, source));
+ return structTypeInfo.fieldType(fieldName);
}
+
case NamespaceType receiverTypeNamespace -> {
var namespaceTypeInfo = context.namespaceTypeInfo(receiverTypeNamespace, source);
- return namespaceTypeInfo.fieldType(fieldName)
- .orElseThrow(() -> new NoSuchFieldError(receiverTypeNamespace, fieldName, source));
+ return namespaceTypeInfo.fieldType(fieldName);
}
+
case TypeLevelValueType receiverTypeTypeLevelValue when receiverTypeTypeLevelValue.value() instanceof UserDefinedEffect effect -> {
var effectInfo = context.userDefinedEffectInfo(effect, source);
return effectInfo.methodType(fieldName)
- .orElseThrow(() -> new NoSuchFieldError(receiverType, fieldName, source))
- .withEffect(effect);
+ .map(x -> x.withEffect(effect));
+ }
+
+ default -> {
+ return Optional.empty();
}
- default ->
- throw new NoSuchFieldError(receiverType, fieldName, source);
}
}