From 4de96add3d9d1bdfa1802dba2175c8efb0f9fd43 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Dec 2023 23:17:19 +0000 Subject: Extract fieldTypeOrEmpty() --- .../shedlang/compiler/typechecker/TypeChecker.java | 34 ++++++++++++++++------ 1 file changed, 25 insertions(+), 9 deletions(-) (limited to 'src/main/java') 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 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); } } -- cgit v1.2.3