plum
git clone https://git.pyrossh.dev/plum
A statically typed, imperative programming language inspired by rust, python
4306b97
— Peter John
2026-11-02T19:49:59+05:30
T5: field access through a trait
plum-checker/src/unions.rs
CHANGED
|
@@ -167,6 +167,9 @@ pub fn memberFallback(
|
|
|
167
167
|
let qualifying: Vec<String> = memberOfEnums(obj, ctx)
|
|
168
168
|
.into_iter()
|
|
169
169
|
.filter(|e| {
|
|
170
|
+
if crate::traits::isTrait(e, ctx) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
170
173
|
let generic = ctx
|
|
171
174
|
.enum_variants
|
|
172
175
|
.values()
|
|
@@ -594,11 +597,11 @@ pub fn traitField(
|
|
|
594
597
|
ctx: &CheckCtx,
|
|
595
598
|
) -> Option<Result<PlumType, String>> {
|
|
596
599
|
let (en, args) = enumOf(obj)?;
|
|
597
|
-
|
|
600
|
+
if !crate::traits::isTrait(en, ctx) {
|
|
598
|
-
if ms.is_empty() {
|
|
599
601
|
return None;
|
|
600
602
|
}
|
|
603
|
+
let ms = members(en, args, ctx);
|
|
601
|
-
let fields = commonFields(&ms, ctx)
|
|
604
|
+
let fields = commonFields(&ms, ctx).unwrap_or_default();
|
|
602
605
|
if !fields.iter().any(|f| f == field) {
|
|
603
606
|
return Some(Err(format!("trait {en} has no field {field}")));
|
|
604
607
|
}
|