aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-09-28 11:43:44 +0100
committerMichael Williamson <mike@zwobble.org>2023-09-28 11:43:44 +0100
commit906e88533789cf106f84571e8d61dbc3f55a4641 (patch)
tree61950b03bff8404b5b6e4ecc6f099fac8f2a5df5 /src/main/java
parent6d9a2f0b07204debf78f70e3d1ed5078ee4e54c0 (diff)
Check type of receiver in field access
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/NoSuchFieldError.java24
2 files changed, 30 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index f11b0e1e..37cd45ac 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -5,6 +5,7 @@ import org.shedlang.compiler.ast.typed.*;
import org.shedlang.compiler.ast.untyped.*;
import org.shedlang.compiler.sources.Source;
import org.shedlang.compiler.typechecker.errors.*;
+import org.shedlang.compiler.typechecker.errors.NoSuchFieldError;
import org.shedlang.compiler.typechecker.typesets.TypeSetTypeLevelValue;
import org.shedlang.compiler.typechecker.typesets.TypeSets;
import org.shedlang.compiler.types.*;
@@ -401,8 +402,12 @@ public class TypeChecker {
var typedReceiver = typedReceiverResult.value();
context = typedReceiverResult.context();
+ if (!(typedReceiver.type() instanceof StructType receiverType)) {
+ throw new NoSuchFieldError(typedReceiver.type(), untyped.fieldName(), untyped.source());
+ }
+
var structTypeInfo = context.structTypeInfo(
- (StructType) typedReceiver.type(),
+ receiverType,
untyped.fieldName()
);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/NoSuchFieldError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/NoSuchFieldError.java
new file mode 100644
index 00000000..91e067ac
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/NoSuchFieldError.java
@@ -0,0 +1,24 @@
+package org.shedlang.compiler.typechecker.errors;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Type;
+
+public class NoSuchFieldError extends SourceError {
+ private final Type type;
+ private final String fieldName;
+
+ public NoSuchFieldError(Type type, String fieldName, Source source) {
+ super("No field named " + fieldName + " on type " + type, source);
+ this.type = type;
+ this.fieldName = fieldName;
+ }
+
+ public Type type() {
+ return type;
+ }
+
+ public String fieldName() {
+ return fieldName;
+ }
+}