Reduce errors when a namespace is not found

When the typelib for a namespace is not found, don't emit "namespace not
imported" errors. Just emit the one error on the import statement.
This commit is contained in:
James Westman 2023-03-21 11:31:02 -05:00
parent 402677f687
commit bc605c5df8
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
6 changed files with 20 additions and 1 deletions

View file

@ -741,6 +741,7 @@ class Repository(GirNode):
class GirContext:
def __init__(self):
self.namespaces = {}
self.not_found_namespaces: T.Set[str] = set()
def add_namespace(self, namespace: Namespace):
other = self.namespaces.get(namespace.name)
@ -781,7 +782,7 @@ class GirContext:
ns = ns or "Gtk"
if ns not in self.namespaces:
if ns not in self.namespaces and ns not in self.not_found_namespaces:
raise CompileError(
f"Namespace {ns} was not imported",
did_you_mean=(ns, self.namespaces.keys()),

View file

@ -76,6 +76,14 @@ class Import(AstNode):
UseNumberText("version").expected("a version number"),
)
@property
def namespace(self):
return self.tokens["namespace"]
@property
def version(self):
return self.tokens["version"]
@validate("namespace", "version")
def namespace_exists(self):
gir.get_namespace(self.tokens["namespace"], self.tokens["version"])

View file

@ -58,6 +58,8 @@ class UI(AstNode):
try:
if i.gir_namespace is not None:
gir_ctx.add_namespace(i.gir_namespace)
else:
gir_ctx.not_found_namespaces.add(i.namespace)
except CompileError as e:
e.start = i.group.tokens["namespace"].start
e.end = i.group.tokens["version"].end

View file

@ -0,0 +1,6 @@
using Gtk 4.0;
using NotARealNamespace 1;
NotARealNamespace.Widget widget {
property: true;
}

View file

@ -0,0 +1 @@
2,7,19,Namespace NotARealNamespace-1 could not be found

View file

@ -224,6 +224,7 @@ class TestSamples(unittest.TestCase):
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("ns_not_found")
self.assert_sample_error("ns_not_imported")
self.assert_sample_error("not_a_class")
self.assert_sample_error("object_dne")