diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-23 23:17:19 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-23 23:17:19 +0000 |
| commit | 4de96add3d9d1bdfa1802dba2175c8efb0f9fd43 (patch) | |
| tree | b5f805510753e2a1fe0d2ebbeb5976b6b5c42f13 /src/main/java | |
| parent | f79bc929ef4dd607e56da8639b60c09a3b64f8d1 (diff) | |
Extract fieldTypeOrEmpty()
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 34 |
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); } } |
