diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-12-19 18:28:41 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-12-19 18:28:41 +0000 |
| commit | 8f812ba74b95cfb68f8792b6b0dde61e42c36a5f (patch) | |
| tree | 45ba4b92d5df16877766ffc3cd906d85fed0f5af /src/main/java | |
| parent | 5cc08d49a2cf7dc3d1794d39f49aff760372cffb (diff) | |
Support access methods on structs
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 3 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/types/StructTypeInfo.java | 17 |
2 files changed, 17 insertions, 3 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index ed522427..16728f8c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1358,8 +1358,9 @@ public class TypeChecker { } case SimpleStructType receiverTypeStruct -> { + // TODO: handle ambiguity var structTypeInfo = context.structTypeInfo(receiverTypeStruct, source); - return structTypeInfo.fieldType(memberName); + return structTypeInfo.memberType(memberName); } case NamespaceType receiverTypeNamespace -> { diff --git a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java index b8a7df38..d90a5f6b 100644 --- a/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java +++ b/src/main/java/org/shedlang/compiler/types/StructTypeInfo.java @@ -15,8 +15,13 @@ public record StructTypeInfo( return fields().fieldCount(); } - public Optional<Type> fieldType(String fieldName) { - return fields.fieldType(fieldName); + public Optional<Type> memberType(String memberName) { + return fields.fieldType(memberName).or(() -> + methods.stream() + .filter(method -> method.name().equals(memberName)) + .findFirst() + .map(method -> method.type()) + ); } public int fieldIndex(String fieldName) { @@ -51,5 +56,13 @@ public record StructTypeInfo( this.methods ); } + + public Builder addMethod(String name, FunctionType type) { + return new Builder( + this.fields, + fieldsArePositional, + this.methods.plus(new MethodInfo(name, type)) + ); + } } } |
