diff --git a/lib/src/solver/deducer.dart b/lib/src/solver/deducer.dart index 2f8b6b43b6833ca629aaf9908c7dfa0271f080bf..fa4407a3753b7de658f4512b2e122b65f3e74d25 100644 --- a/lib/src/solver/deducer.dart +++ b/lib/src/solver/deducer.dart @@ -199,6 +199,46 @@ class Deducer { return false; } + void _disallowedIntoDependencies(Disallowed fact) { + var ref = fact.dep.toRef(); + for (var dependency in _dependenciesByDepender[ref].toList()) { + var trimmed = dependency.depender.constraint + .difference(fact.dep.constraint); + if (trimmed == dependency.depender.constraint) continue; + + // If [fact] covers some of [dependency.depender], trim the dependency so + // that its depender doesn't include disallowed versions. If this would + // produce an empty depender, remove it entirely. + _removeDependency(dependency); + if (trimmed.isEmpty) continue; + + _toProcess.add(new Dependency( + dependency.depender.withConstraint(trimmed), + dependency.allowed, + [dependency, fact])); + } + + for (var dependency in _dependenciesByAllowed[ref].toList()) { + var trimmed = dependency.allowed.constraint + .difference(fact.dep.constraint); + if (trimmed = dependency.allowed.constraint) continue; + + // If [fact] covers some of [dependency.allowed], trim the dependency so + // that its constraint doesn't include disallowed versions. If this would + // produce an empty constraint, mark the depender as disallowed. + _removeDependency(dependency); + + if (trimmed.isEmpty) { + _toProcess.add(new Disallowed(dependency.depender, [dependency, fact])); + } else { + _toProcess.add(new Dependency( + dependency.depender, + dependency.allowed.withConstraint(trimmed), + [dependency, fact])); + } + } + } + // Resolves [required] and [disallowed], which should refer to the same // package. Returns whether any required versions were trimmed. bool _requiredAndDisallowed(Required required, Disallowed disallowed) {