diff --git a/blueprintcompiler/language/values.py b/blueprintcompiler/language/values.py index f92ba67..7430991 100644 --- a/blueprintcompiler/language/values.py +++ b/blueprintcompiler/language/values.py @@ -109,9 +109,25 @@ class LiteralValue(Value): class Flag(AstNode): grammar = UseIdent("value") + @validate() + def validate_for_type(self): + type = self.parent.parent.value_type + if isinstance(type, gir.Bitfield) and self.tokens["value"] not in type.members: + raise CompileError( + f"{self.tokens['value']} is not a member of {type.full_name}", + did_you_mean=(self.tokens['value'], type.members.keys()), + ) + + class FlagsValue(Value): grammar = [Flag, "|", Delimited(Flag, "|")] + @validate() + def parent_is_bitfield(self): + type = self.parent.value_type + if not isinstance(type, gir.Bitfield): + raise CompileError(f"{type.full_name} is not a bitfield type") + def emit_xml(self, xml: XmlEmitter): xml.put_text("|".join([flag.tokens["value"] for flag in self.children[Flag]])) diff --git a/tests/sample_errors/bitfield_member_dne.blp b/tests/sample_errors/bitfield_member_dne.blp new file mode 100644 index 0000000..6b4343e --- /dev/null +++ b/tests/sample_errors/bitfield_member_dne.blp @@ -0,0 +1,6 @@ +using Gtk 4.0; + +EventControllerScroll { + flags: vertical | not_a_value; + name: a|b; +} diff --git a/tests/sample_errors/bitfield_member_dne.err b/tests/sample_errors/bitfield_member_dne.err new file mode 100644 index 0000000..28490d5 --- /dev/null +++ b/tests/sample_errors/bitfield_member_dne.err @@ -0,0 +1,2 @@ +4,21,11,not_a_value is not a member of Gtk.EventControllerScrollFlags +5,9,3,string is not a bitfield type diff --git a/tests/test_samples.py b/tests/test_samples.py index cb849f1..4c4b17c 100644 --- a/tests/test_samples.py +++ b/tests/test_samples.py @@ -155,6 +155,7 @@ class TestSamples(unittest.TestCase): self.assert_sample_error("action_widget_in_invalid_container") self.assert_sample_error("action_widget_response_dne") self.assert_sample_error("action_widget_negative_response") + self.assert_sample_error("bitfield_member_dne") self.assert_sample_error("class_assign") self.assert_sample_error("class_dne") self.assert_sample_error("consecutive_unexpected_tokens")