From 8f812ba74b95cfb68f8792b6b0dde61e42c36a5f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 19 Dec 2024 18:28:41 +0000 Subject: Support access methods on structs --- .../org/shedlang/compiler/typechecker/TypeChecker.java | 3 ++- .../org/shedlang/compiler/types/StructTypeInfo.java | 17 +++++++++++++++-- 2 files changed, 17 insertions(+), 3 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 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 fieldType(String fieldName) { - return fields.fieldType(fieldName); + public Optional 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)) + ); + } } } -- cgit v1.2.3