diff --git a/gtkblueprinttool/ast_utils.py b/gtkblueprinttool/ast_utils.py index fc0ac72..502582f 100644 --- a/gtkblueprinttool/ast_utils.py +++ b/gtkblueprinttool/ast_utils.py @@ -152,9 +152,9 @@ def validate(token_name=None, end_token_name=None, skip_incomplete=False): e.start = self.group.start if e.end is None: - if token := self.group.tokens.get(token_name): + if token := self.group.tokens.get(end_token_name): e.end = token.end - elif token := self.group.tokens.get(end_token_name): + elif token := self.group.tokens.get(token_name): e.end = token.end else: e.end = self.group.end diff --git a/gtkblueprinttool/gir.py b/gtkblueprinttool/gir.py index 8205f33..b88dc86 100644 --- a/gtkblueprinttool/gir.py +++ b/gtkblueprinttool/gir.py @@ -351,7 +351,7 @@ class GirContext: if ns not in self.namespaces: raise CompileError( - f"Namespace `{ns}` was not imported.", + f"Namespace {ns} was not imported", did_you_mean=(ns, self.namespaces.keys()), ) @@ -359,12 +359,12 @@ class GirContext: if type is None: raise CompileError( - f"Namespace {ns} does not contain a class called {name}.", + f"Namespace {ns} does not contain a class called {name}", did_you_mean=(name, self.namespaces[ns].classes.keys()), ) elif not isinstance(type, Class): raise CompileError( - f"{ns}.{name} is not a class.", + f"{ns}.{name} is not a class", did_you_mean=(name, self.namespaces[ns].classes.keys()), ) diff --git a/tests/sample_errors/class_dne.blp b/tests/sample_errors/class_dne.blp new file mode 100644 index 0000000..b594268 --- /dev/null +++ b/tests/sample_errors/class_dne.blp @@ -0,0 +1,3 @@ +using Gtk 4.0; + +template TestTemplate : Gtk.NotARealClass {} diff --git a/tests/sample_errors/class_dne.err b/tests/sample_errors/class_dne.err new file mode 100644 index 0000000..0000a1e --- /dev/null +++ b/tests/sample_errors/class_dne.err @@ -0,0 +1 @@ +3,25,17,Namespace Gtk does not contain a class called NotARealClass diff --git a/tests/sample_errors/enum_member_dne.blp b/tests/sample_errors/enum_member_dne.blp new file mode 100644 index 0000000..f1473d1 --- /dev/null +++ b/tests/sample_errors/enum_member_dne.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Box { + orientation: diagonal; +} diff --git a/tests/sample_errors/enum_member_dne.err b/tests/sample_errors/enum_member_dne.err new file mode 100644 index 0000000..6f1f145 --- /dev/null +++ b/tests/sample_errors/enum_member_dne.err @@ -0,0 +1 @@ +4,16,8,diagonal is not a member of Gtk.Orientation diff --git a/tests/sample_errors/invalid_bool.blp b/tests/sample_errors/invalid_bool.blp new file mode 100644 index 0000000..851efd2 --- /dev/null +++ b/tests/sample_errors/invalid_bool.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Label { + visible: maybe; +} diff --git a/tests/sample_errors/invalid_bool.err b/tests/sample_errors/invalid_bool.err new file mode 100644 index 0000000..a231d03 --- /dev/null +++ b/tests/sample_errors/invalid_bool.err @@ -0,0 +1 @@ +4,12,5,Expected 'true' or 'false' for boolean value diff --git a/tests/sample_errors/not_a_class.blp b/tests/sample_errors/not_a_class.blp new file mode 100644 index 0000000..0383154 --- /dev/null +++ b/tests/sample_errors/not_a_class.blp @@ -0,0 +1,3 @@ +using Gtk 4.0; + +template TestTemplate : Gtk.Orientable {} diff --git a/tests/sample_errors/not_a_class.err b/tests/sample_errors/not_a_class.err new file mode 100644 index 0000000..02287a2 --- /dev/null +++ b/tests/sample_errors/not_a_class.err @@ -0,0 +1 @@ +3,25,14,Gtk.Orientable is not a class diff --git a/tests/sample_errors/ns_not_imported.blp b/tests/sample_errors/ns_not_imported.blp new file mode 100644 index 0000000..9c81596 --- /dev/null +++ b/tests/sample_errors/ns_not_imported.blp @@ -0,0 +1,3 @@ +using Gtk 4.0; + +template TestTemplate : Adw.ApplicationWindow {} diff --git a/tests/sample_errors/ns_not_imported.err b/tests/sample_errors/ns_not_imported.err new file mode 100644 index 0000000..4a4bef8 --- /dev/null +++ b/tests/sample_errors/ns_not_imported.err @@ -0,0 +1 @@ +3,25,21,Namespace Adw was not imported diff --git a/tests/sample_errors/property_dne.blp b/tests/sample_errors/property_dne.blp new file mode 100644 index 0000000..d31e181 --- /dev/null +++ b/tests/sample_errors/property_dne.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Label { + not-a-real-property: "Hello, world!"; +} diff --git a/tests/sample_errors/property_dne.err b/tests/sample_errors/property_dne.err new file mode 100644 index 0000000..2b6ff40 --- /dev/null +++ b/tests/sample_errors/property_dne.err @@ -0,0 +1 @@ +4,3,19,Class Gtk.Label does not contain a property called not-a-real-property diff --git a/tests/sample_errors/signal_dne.blp b/tests/sample_errors/signal_dne.blp new file mode 100644 index 0000000..9c5d046 --- /dev/null +++ b/tests/sample_errors/signal_dne.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Button { + eaten-by-velociraptors => on_eaten_by_velociraptors(); +} diff --git a/tests/sample_errors/signal_dne.err b/tests/sample_errors/signal_dne.err new file mode 100644 index 0000000..a4a0a38 --- /dev/null +++ b/tests/sample_errors/signal_dne.err @@ -0,0 +1 @@ +4,3,22,Class Gtk.Button does not contain a signal called eaten-by-velociraptors diff --git a/tests/sample_errors/using_invalid_namespace.err b/tests/sample_errors/using_invalid_namespace.err index 243d9d4..3c8e626 100644 --- a/tests/sample_errors/using_invalid_namespace.err +++ b/tests/sample_errors/using_invalid_namespace.err @@ -1 +1 @@ -2,7,17,Namespace NotARealNamespace-2.0 could not be found +2,7,21,Namespace NotARealNamespace-2.0 could not be found diff --git a/tests/samples/object_prop.blp b/tests/samples/object_prop.blp new file mode 100644 index 0000000..eaccfd9 --- /dev/null +++ b/tests/samples/object_prop.blp @@ -0,0 +1,7 @@ +using Gtk 4.0; + +template TestTemplate : Label { + test-property: Button { + label: "Hello, world!"; + }; +} diff --git a/tests/samples/object_prop.ui b/tests/samples/object_prop.ui new file mode 100644 index 0000000..46a62d9 --- /dev/null +++ b/tests/samples/object_prop.ui @@ -0,0 +1,11 @@ + + + + + diff --git a/tests/samples/template.blp b/tests/samples/template.blp index bcfce82..570dca7 100644 --- a/tests/samples/template.blp +++ b/tests/samples/template.blp @@ -1,3 +1,6 @@ using Gtk 4.0; -template TestTemplate : ApplicationWindow {} +template TestTemplate : ApplicationWindow { + test-property: "Hello, world"; + test-signal => on_test_signal(); +} diff --git a/tests/samples/template.ui b/tests/samples/template.ui index 1485a06..095fbd8 100644 --- a/tests/samples/template.ui +++ b/tests/samples/template.ui @@ -1,5 +1,8 @@ - + diff --git a/tests/samples/translated.blp b/tests/samples/translated.blp new file mode 100644 index 0000000..c1cde19 --- /dev/null +++ b/tests/samples/translated.blp @@ -0,0 +1,5 @@ +using Gtk 4.0; + +Label { + label: _("Hello, world!"); +} diff --git a/tests/samples/translated.ui b/tests/samples/translated.ui new file mode 100644 index 0000000..19cf381 --- /dev/null +++ b/tests/samples/translated.ui @@ -0,0 +1,7 @@ + + + + + Hello, world! + + diff --git a/tests/test_samples.py b/tests/test_samples.py index f2c7a13..9e58e88 100644 --- a/tests/test_samples.py +++ b/tests/test_samples.py @@ -94,15 +94,24 @@ class TestSamples(unittest.TestCase): self.assert_sample("flags") self.assert_sample("layout") self.assert_sample("menu") + self.assert_sample("object_prop") self.assert_sample("property") self.assert_sample("signal") self.assert_sample("strings") self.assert_sample("style") self.assert_sample("template") + self.assert_sample("translated") self.assert_sample("using") def test_sample_errors(self): + self.assert_sample_error("class_dne") self.assert_sample_error("duplicate_obj_id") + self.assert_sample_error("enum_member_dne") + self.assert_sample_error("invalid_bool") + self.assert_sample_error("ns_not_imported") + self.assert_sample_error("not_a_class") + self.assert_sample_error("property_dne") + self.assert_sample_error("signal_dne") self.assert_sample_error("two_templates") self.assert_sample_error("using_invalid_namespace")