aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/depfile.py
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2022-01-10 10:31:08 -0800
committerEli Schwartz <eschwartz93@gmail.com>2022-01-10 23:06:20 -0500
commitfe51450970638d2610519ff2f42b4892bbaab1e0 (patch)
tree6952e9695b5bde04db16e672db333d53b04a4f28 /mesonbuild/depfile.py
parent4b351aef26a19b4c73f6ef295f64da1c74bc713d (diff)
downloadmeson-fe51450970638d2610519ff2f42b4892bbaab1e0.zip
meson-fe51450970638d2610519ff2f42b4892bbaab1e0.tar.gz
meson-fe51450970638d2610519ff2f42b4892bbaab1e0.tar.bz2
depfile: type annotate
Diffstat (limited to 'mesonbuild/depfile.py')
-rw-r--r--mesonbuild/depfile.py35
1 files changed, 20 insertions, 15 deletions
diff --git a/mesonbuild/depfile.py b/mesonbuild/depfile.py
index 62cbe81..a8b4588 100644
--- a/mesonbuild/depfile.py
+++ b/mesonbuild/depfile.py
@@ -11,12 +11,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import collections
+import typing as T
-def parse(lines):
- rules = []
- targets = []
- deps = []
+
+def parse(lines: T.Iterable[str]) -> T.List[T.Tuple[T.List[str], T.List[str]]]:
+ rules: T.List[T.Tuple[T.List[str], T.List[str]]] = []
+ targets: T.List[str] = []
+ deps: T.List[str] = []
in_deps = False
out = ''
for line in lines:
@@ -56,12 +57,15 @@ def parse(lines):
out += c
return rules
-Target = collections.namedtuple('Target', ['deps'])
+class Target(T.NamedTuple):
+
+ deps: T.Set[str]
+
class DepFile:
- def __init__(self, lines):
+ def __init__(self, lines: T.Iterable[str]):
rules = parse(lines)
- depfile = {}
+ depfile: T.Dict[str, Target] = {}
for (targets, deps) in rules:
for target in targets:
t = depfile.setdefault(target, Target(deps=set()))
@@ -69,16 +73,17 @@ class DepFile:
t.deps.add(dep)
self.depfile = depfile
- def get_all_dependencies(self, target, visited=None):
- deps = set()
+ def get_all_dependencies(self, name: str, visited: T.Optional[T.Set[str]] = None) -> T.List[str]:
+ deps: T.Set[str] = set()
if not visited:
visited = set()
- if target in visited:
- return set()
- visited.add(target)
- target = self.depfile.get(target)
+ if name in visited:
+ return []
+ visited.add(name)
+
+ target = self.depfile.get(name)
if not target:
- return set()
+ return []
deps.update(target.deps)
for dep in target.deps:
deps.update(self.get_all_dependencies(dep, visited))