Fix menus

- Menus require an ID
- The top level menu block can't have attributes
This commit is contained in:
James Westman 2022-12-19 14:36:32 -06:00
parent 8a1dba662a
commit 51d8969ced
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
9 changed files with 43 additions and 13 deletions

View file

@ -39,6 +39,11 @@ class Menu(AstNode):
def tag(self) -> str: def tag(self) -> str:
return self.tokens["tag"] return self.tokens["tag"]
@validate("menu")
def has_id(self):
if self.tokens["tag"] == "menu" and self.tokens["id"] is None:
raise CompileError("Menu requires an ID")
class MenuAttribute(BaseAttribute): class MenuAttribute(BaseAttribute):
tag_name = "attribute" tag_name = "attribute"
@ -137,7 +142,27 @@ menu_contents.children = [
menu: Group = Group( menu: Group = Group(
Menu, Menu,
["menu", UseLiteral("tag", "menu"), Optional(UseIdent("id")), menu_contents], [
Keyword("menu"),
UseLiteral("tag", "menu"),
Optional(UseIdent("id")),
[
Match("{"),
Until(
AnyOf(
menu_section,
menu_submenu,
menu_item_shorthand,
menu_item,
Fail(
menu_attribute,
"Attributes are not permitted at the top level of a menu",
),
),
"}",
),
],
],
) )
from .ui import UI from .ui import UI

View file

@ -0,0 +1,3 @@
using Gtk 4.0;
menu {}

View file

@ -0,0 +1 @@
3,1,4,Menu requires an ID

View file

@ -0,0 +1,5 @@
using Gtk 4.0;
menu {
not-allowed: true;
}

View file

@ -0,0 +1,2 @@
4,5,19,Attributes are not permitted at the top level of a menu
4,16,8,Unexpected tokens

View file

@ -1,9 +1,6 @@
using Gtk 4.0; using Gtk 4.0;
menu { menu my-menu {
label: _("menu label");
test-custom-attribute: 3.1415;
submenu { submenu {
section { section {
label: "test section"; label: "test section";

View file

@ -1,9 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface>
<requires lib="gtk" version="4.0"/> <requires lib="gtk" version="4.0"/>
<menu> <menu id="my-menu">
<attribute name="label" translatable="true">menu label</attribute>
<attribute name="test-custom-attribute">3.1415</attribute>
<submenu> <submenu>
<section> <section>
<attribute name="label">test section</attribute> <attribute name="label">test section</attribute>

View file

@ -1,9 +1,6 @@
using Gtk 4.0; using Gtk 4.0;
menu { menu my-menu {
label: _("menu label");
test-custom-attribute: "3.1415";
submenu { submenu {
section { section {
label: "test section"; label: "test section";

View file

@ -156,7 +156,7 @@ class TestSamples(unittest.TestCase):
self.assert_sample("flags", skip_run=True) # TODO: Fix self.assert_sample("flags", skip_run=True) # TODO: Fix
self.assert_sample("id_prop") self.assert_sample("id_prop")
self.assert_sample("layout") self.assert_sample("layout")
self.assert_sample("menu", skip_run=True) # TODO: Fix self.assert_sample("menu")
self.assert_sample("numbers") self.assert_sample("numbers")
self.assert_sample("object_prop") self.assert_sample("object_prop")
self.assert_sample( self.assert_sample(
@ -213,6 +213,8 @@ class TestSamples(unittest.TestCase):
self.assert_sample_error("inline_menu") self.assert_sample_error("inline_menu")
self.assert_sample_error("invalid_bool") self.assert_sample_error("invalid_bool")
self.assert_sample_error("layout_in_non_widget") self.assert_sample_error("layout_in_non_widget")
self.assert_sample_error("menu_no_id")
self.assert_sample_error("menu_toplevel_attribute")
self.assert_sample_error("no_import_version") self.assert_sample_error("no_import_version")
self.assert_sample_error("ns_not_imported") self.assert_sample_error("ns_not_imported")
self.assert_sample_error("not_a_class") self.assert_sample_error("not_a_class")