mirror of
https://gitlab.gnome.org/jwestman/blueprint-compiler.git
synced 2025-05-04 15:59:08 -04:00
Add validation for flag values
This commit is contained in:
parent
bebe784d1d
commit
8ea06e8a78
4 changed files with 25 additions and 0 deletions
|
@ -109,9 +109,25 @@ class LiteralValue(Value):
|
||||||
class Flag(AstNode):
|
class Flag(AstNode):
|
||||||
grammar = UseIdent("value")
|
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):
|
class FlagsValue(Value):
|
||||||
grammar = [Flag, "|", Delimited(Flag, "|")]
|
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):
|
def emit_xml(self, xml: XmlEmitter):
|
||||||
xml.put_text("|".join([flag.tokens["value"] for flag in self.children[Flag]]))
|
xml.put_text("|".join([flag.tokens["value"] for flag in self.children[Flag]]))
|
||||||
|
|
||||||
|
|
6
tests/sample_errors/bitfield_member_dne.blp
Normal file
6
tests/sample_errors/bitfield_member_dne.blp
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
using Gtk 4.0;
|
||||||
|
|
||||||
|
EventControllerScroll {
|
||||||
|
flags: vertical | not_a_value;
|
||||||
|
name: a|b;
|
||||||
|
}
|
2
tests/sample_errors/bitfield_member_dne.err
Normal file
2
tests/sample_errors/bitfield_member_dne.err
Normal file
|
@ -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
|
|
@ -155,6 +155,7 @@ class TestSamples(unittest.TestCase):
|
||||||
self.assert_sample_error("action_widget_in_invalid_container")
|
self.assert_sample_error("action_widget_in_invalid_container")
|
||||||
self.assert_sample_error("action_widget_response_dne")
|
self.assert_sample_error("action_widget_response_dne")
|
||||||
self.assert_sample_error("action_widget_negative_response")
|
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_assign")
|
||||||
self.assert_sample_error("class_dne")
|
self.assert_sample_error("class_dne")
|
||||||
self.assert_sample_error("consecutive_unexpected_tokens")
|
self.assert_sample_error("consecutive_unexpected_tokens")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue