From 45e8d8c97b5d075f3cc87cdb347da04e18c8cb99 Mon Sep 17 00:00:00 2001 From: Mark Date: Wed, 15 Jul 2026 16:40:59 +0000 Subject: [PATCH] fix: throw StateError on circular dependency detection Modify `InjectorGraphResolver` to accumulate detected circular dependencies and throw a descriptive `StateError` to immediately fail the build. Previously, cycles were only logged to a detached `Logger` instance, which remained hidden from stdout and allowed the builder to silently succeed while emitting invalid recursive code that stack-overflowed at runtime. - Throws `StateError` on dependency cycles during graph resolution. - Updates unit tests to assert cycle failures. - Bumps `inject_compile_generator` version to `0.9.2` and updates the changelog. Closes #5 --- package/inject_compile_generator/CHANGELOG.md | 3 +++ .../lib/src/graph/injector_graph_resolver.dart | 12 +++++++++--- package/inject_compile_generator/pubspec.yaml | 2 +- .../test/graph/injector_graph_resolver_test.dart | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package/inject_compile_generator/CHANGELOG.md b/package/inject_compile_generator/CHANGELOG.md index dddcb02..0685e94 100644 --- a/package/inject_compile_generator/CHANGELOG.md +++ b/package/inject_compile_generator/CHANGELOG.md @@ -1,3 +1,6 @@ +## 0.9.2 +- Throw StateError on circular dependency detection instead of logging a warning to a detached logger. + ## 0.9.1 - Add example/example.md file diff --git a/package/inject_compile_generator/lib/src/graph/injector_graph_resolver.dart b/package/inject_compile_generator/lib/src/graph/injector_graph_resolver.dart index e9b83d7..21e5db6 100644 --- a/package/inject_compile_generator/lib/src/graph/injector_graph_resolver.dart +++ b/package/inject_compile_generator/lib/src/graph/injector_graph_resolver.dart @@ -136,9 +136,7 @@ class InjectorGraphResolver { final index = chain.indexOf(current); if (index != -1) { final cycle = _Cycle(chain.sublist(index)..add(current)); - if (cycles.add(cycle)) { - _logger.severe('Detected dependency cycle:\n${cycle.format()}'); - } + cycles.add(cycle); return; } @@ -155,6 +153,14 @@ class InjectorGraphResolver { visit(key); } + + if (cycles.isNotEmpty) { + final message = StringBuffer('Detected circular dependencies:\n'); + for (final cycle in cycles) { + message.writeln(cycle.format()); + } + throw StateError(message.toString()); + } } } diff --git a/package/inject_compile_generator/pubspec.yaml b/package/inject_compile_generator/pubspec.yaml index 29e2219..7d09c02 100644 --- a/package/inject_compile_generator/pubspec.yaml +++ b/package/inject_compile_generator/pubspec.yaml @@ -1,6 +1,6 @@ name: inject_compile_generator description: The dev dependency for package:inject_compile that enables compile time dependency injection. -version: 0.9.1 +version: 0.9.2 homepage: https://github.com/dropbear-software/inject_compile/tree/main/package/inject_compile_generator repository: https://github.com/dropbear-software/inject_compile/tree/main/package/inject_compile_generator issue_tracker: https://github.com/dropbear-software/inject_compile/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Ainject_compile_generator diff --git a/package/inject_compile_generator/test/graph/injector_graph_resolver_test.dart b/package/inject_compile_generator/test/graph/injector_graph_resolver_test.dart index 28c1e42..d6586e2 100644 --- a/package/inject_compile_generator/test/graph/injector_graph_resolver_test.dart +++ b/package/inject_compile_generator/test/graph/injector_graph_resolver_test.dart @@ -139,7 +139,7 @@ void main() { ); final resolver = InjectorGraphResolver(reader, injectorSummary); - await resolver.resolve(); + expect(resolver.resolve(), throwsStateError); }); }); }