diff --git a/blueprintcompiler/ast_utils.py b/blueprintcompiler/ast_utils.py index 7c7e3c0..628a2cd 100644 --- a/blueprintcompiler/ast_utils.py +++ b/blueprintcompiler/ast_utils.py @@ -19,10 +19,10 @@ import typing as T from collections import ChainMap, defaultdict +from functools import cached_property from .errors import * from .lsp_utils import SemanticToken -from .utils import lazy_prop from .xml_emitter import XmlEmitter @@ -75,7 +75,7 @@ class AstNode: else: return self.parent.parent_by_type(type) - @lazy_prop + @cached_property def errors(self): return list(self._get_errors()) diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index f4cd06c..59ff55f 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -18,10 +18,10 @@ # SPDX-License-Identifier: LGPL-3.0-or-later import typing as T +from functools import cached_property import os, sys from .errors import CompileError, CompilerBugError -from .utils import lazy_prop from . import xml_reader @@ -149,30 +149,30 @@ class GirNode: else: return self.container.get_containing(container_type) - @lazy_prop + @cached_property def glib_type_name(self): return self.xml["glib:type-name"] - @lazy_prop + @cached_property def full_name(self): if self.container is None: return self.name else: return f"{self.container.name}.{self.name}" - @lazy_prop + @cached_property def name(self) -> str: return self.xml["name"] - @lazy_prop + @cached_property def cname(self) -> str: return self.xml["c:type"] - @lazy_prop + @cached_property def available_in(self) -> str: return self.xml.get("version") - @lazy_prop + @cached_property def doc(self) -> T.Optional[str]: sections = [] @@ -276,15 +276,15 @@ class Class(GirNode, GirType): result += " implements " + ", ".join(self.implements) return result - @lazy_prop + @cached_property def properties(self): return {p.name: p for p in self._enum_properties()} - @lazy_prop + @cached_property def signals(self): return {s.name: s for s in self._enum_signals()} - @lazy_prop + @cached_property def parent(self): if self._parent is None: return None diff --git a/blueprintcompiler/utils.py b/blueprintcompiler/utils.py index 53bd16b..6ad81c5 100644 --- a/blueprintcompiler/utils.py +++ b/blueprintcompiler/utils.py @@ -32,18 +32,6 @@ class Colors: CLEAR = "\033[0m" -def lazy_prop(func): - key = "_lazy_prop_" + func.__name__ - - @property - def real_func(self): - if key not in self.__dict__: - self.__dict__[key] = func(self) - return self.__dict__[key] - - return real_func - - def did_you_mean(word: str, options: T.List[str]) -> T.Optional[str]: if len(options) == 0: return None diff --git a/blueprintcompiler/xml_reader.py b/blueprintcompiler/xml_reader.py index 961a0cb..d07438a 100644 --- a/blueprintcompiler/xml_reader.py +++ b/blueprintcompiler/xml_reader.py @@ -19,11 +19,10 @@ from collections import defaultdict +from functools import cached_property import typing as T from xml import sax -from .utils import lazy_prop - # To speed up parsing, we ignore all tags except these PARSE_GIR = set( @@ -53,7 +52,7 @@ class Element: self.children: T.Dict[str, T.List["Element"]] = defaultdict(list) self.cdata_chunks: T.List[str] = [] - @lazy_prop + @cached_property def cdata(self): return "".join(self.cdata_chunks)