aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-19 18:28:41 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-19 18:28:41 +0000
commit8f812ba74b95cfb68f8792b6b0dde61e42c36a5f (patch)
tree45ba4b92d5df16877766ffc3cd906d85fed0f5af /src/main/java
parent5cc08d49a2cf7dc3d1794d39f49aff760372cffb (diff)
Support access methods on structs
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java3
-rw-r--r--src/main/java/org/shedlang/compiler/types/StructTypeInfo.java17
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))
+ );
+ }
}
}