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 @@
-
+
+ Hello, world
+
+
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 @@
+
+
+
+
+
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")