File: gtk_list_item_factory.py

package info (click to toggle)
blueprint-compiler 0.18.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,140 kB
  • sloc: python: 8,504; sh: 31; makefile: 6
file content (111 lines) | stat: -rw-r--r-- 3,154 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import typing as T

from blueprintcompiler.errors import T
from blueprintcompiler.lsp_utils import DocumentSymbol

from ..ast_utils import AstNode, validate
from .common import *
from .contexts import ScopeCtx
from .gobject_object import ObjectContent, validate_parent_type
from .types import TypeName


class ExtListItemFactory(AstNode):
    grammar = [
        UseExact("id", "template"),
        Mark("typename_start"),
        Optional(TypeName),
        Mark("typename_end"),
        ObjectContent,
    ]

    @property
    def id(self) -> str:
        return "template"

    @property
    def signature(self) -> str:
        return f"template {self.gir_class.full_name}"

    @property
    def document_symbol(self) -> DocumentSymbol:
        return DocumentSymbol(
            self.signature,
            SymbolKind.Object,
            self.range,
            self.group.tokens["id"].range,
        )

    @property
    def type_name(self) -> T.Optional[TypeName]:
        if len(self.children[TypeName]) == 1:
            return self.children[TypeName][0]
        else:
            return None

    @property
    def gir_class(self):
        if self.type_name is not None:
            return self.type_name.gir_type
        else:
            return self.root.gir.get_type("ListItem", "Gtk")

    @validate("id")
    def container_is_builder_list(self):
        validate_parent_type(
            self,
            "Gtk",
            "BuilderListItemFactory",
            "sub-templates",
        )

    @validate("id")
    def unique_in_parent(self):
        self.validate_unique_in_parent("Duplicate template block")

    @validate("typename_start", "typename_end")
    def type_is_list_item(self):
        if self.type_name is not None:
            if self.type_name.glib_type_name not in (
                "GtkListItem",
                "GtkListHeader",
                "GtkColumnViewRow",
                "GtkColumnViewCell",
            ):
                raise CompileError(
                    f"Only Gtk.ListItem, Gtk.ListHeader, Gtk.ColumnViewRow, or Gtk.ColumnViewCell is allowed as a type here"
                )

    @validate("id")
    def type_name_upgrade(self):
        if self.type_name is None:
            raise UpgradeWarning(
                "Expected type name after 'template' keyword",
                actions=[
                    CodeAction(
                        "Add ListItem type to template block (introduced in blueprint 0.8.0)",
                        "template ListItem",
                    )
                ],
            )

    @context(ScopeCtx)
    def scope_ctx(self) -> ScopeCtx:
        return ScopeCtx(node=self)

    @validate()
    def unique_ids(self):
        self.context[ScopeCtx].validate_unique_ids()

    @property
    def content(self) -> ObjectContent:
        return self.children[ObjectContent][0]

    @property
    def action_widgets(self):
        # The sub-template shouldn't have its own actions, this is just here to satisfy XmlOutput._emit_object_or_template
        return None

    @docs("id")
    def ref_docs(self):
        return get_docs_section("Syntax ExtListItemFactory")