language: Fix some issues with menus

Blueprint's handling of menus didn't line up with how GtkBuilder handles
them. The root <menu> element must have an ID and may not have
attributes, and menus may not be used inline in a property.
This commit is contained in:
James Westman 2022-03-12 23:55:41 -06:00
parent 93f2a27e35
commit bbad6988fa
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
18 changed files with 52 additions and 53 deletions

View file

@ -21,11 +21,6 @@ from .values import IdentValue, TranslatedStringValue, FlagsValue, LiteralValue
from .common import *
OBJECT_HOOKS.children = [
menu,
Object,
]
OBJECT_CONTENT_HOOKS.children = [
Signal,
Property,

View file

@ -31,6 +31,5 @@ from ..parser_utils import *
from ..xml_emitter import XmlEmitter
OBJECT_HOOKS = AnyOf()
OBJECT_CONTENT_HOOKS = AnyOf()
VALUE_HOOKS = AnyOf()

View file

@ -44,7 +44,7 @@ class Property(AstNode):
UseIdent("name"),
":",
AnyOf(
OBJECT_HOOKS,
Object,
VALUE_HOOKS,
).expected("a value"),
),

View file

@ -20,7 +20,6 @@
from .attributes import BaseAttribute
from .gobject_object import Object, ObjectContent
from .ui import UI
from .common import *
@ -31,6 +30,11 @@ class Menu(Object):
child.emit_xml(xml)
xml.end_tag()
@validate("menu")
def has_id(self):
if self.tokens["tag"] == "menu" and self.tokens["id"] is None:
raise CompileError("Menu requires an ID")
@property
def gir_class(self):
return self.root.gir.namespaces["Gtk"].lookup_type("Gio.MenuModel")
@ -39,6 +43,11 @@ class Menu(Object):
class MenuAttribute(BaseAttribute):
tag_name = "attribute"
@validate()
def not_in_menu(self):
if self.parent.tokens["tag"] == "menu":
raise CompileError("Menu root may not have attributes")
@property
def value_type(self):
return None
@ -128,16 +137,17 @@ menu_contents.children = [
), "}"),
]
menu = Group(
menu: Group = Group(
Menu,
[
"menu",
Keyword("menu"),
UseLiteral("tag", "menu"),
Optional(UseIdent("id")),
menu_contents
],
)
from .ui import UI
@completer(
applies_in=[UI],

View file

@ -20,6 +20,8 @@
from .. import gir
from .imports import GtkDirective, Import
from .gtk_menu import menu
from .gobject_object import Object
from .gtkbuilder_template import Template
from .common import *
@ -32,7 +34,8 @@ class UI(AstNode):
ZeroOrMore(Import),
Until(AnyOf(
Template,
OBJECT_HOOKS,
menu,
Object,
), Eof()),
]

View file

@ -22,7 +22,7 @@ from .errors import MultipleErrors, PrintableError
from .parse_tree import *
from .parser_utils import *
from .tokenizer import TokenType
from .language import OBJECT_HOOKS, OBJECT_CONTENT_HOOKS, VALUE_HOOKS, Template, UI
from .language import OBJECT_CONTENT_HOOKS, VALUE_HOOKS, Template, UI
def parse(tokens) -> T.Tuple[UI, T.Optional[MultipleErrors], T.List[PrintableError]]: