Skip to content

Commit f8eeafc

Browse files
committed
Improve the readability of Incompatibility.toString()
Non-derived incompatibilities now indicate their causes, and terms with any constraints no longer list their constraints explicitly.
1 parent 3e06125 commit f8eeafc

File tree

1 file changed

+69
-13
lines changed

1 file changed

+69
-13
lines changed

lib/src/solver/incompatibility.dart

+69-13
Original file line numberDiff line numberDiff line change
@@ -68,25 +68,68 @@ class Incompatibility {
6868
Incompatibility._(this.terms, this.cause);
6969

7070
String toString() {
71+
if (cause == IncompatibilityCause.dependency) {
72+
assert(terms.length == 2);
73+
74+
var depender = terms.first;
75+
var dependee = terms.last;
76+
assert(depender.isPositive);
77+
assert(!dependee.isPositive);
78+
79+
if (depender.constraint.isAny) {
80+
return "all versions of ${_terseRef(depender)} "
81+
"depend on ${dependee.package.toTerseString()}";
82+
} else {
83+
return "${depender.package.toTerseString()} depends on "
84+
"${dependee.package.toTerseString()}";
85+
}
86+
} else if (cause == IncompatibilityCause.sdk) {
87+
assert(terms.length == 1);
88+
assert(terms.first.isPositive);
89+
90+
if (terms.first.constraint.isAny) {
91+
return "no versions of ${_terseRef(terms.first)} "
92+
"are compatible with the current SDK";
93+
} else {
94+
return "${terms.first.package.toTerseString()} is incompatible with "
95+
"the current SDK";
96+
}
97+
} else if (cause == IncompatibilityCause.noVersions) {
98+
assert(terms.length == 1);
99+
assert(terms.first.isPositive);
100+
return "no versions of ${_terseRef(terms.first)} "
101+
"match ${terms.first.constraint}";
102+
} else if (isFailure) {
103+
return "version solving failed";
104+
}
105+
71106
if (terms.length == 1) {
72107
var term = terms.single;
73-
return "${term.package.toTerseString()} is "
74-
"${term.isPositive ? 'forbidden' : 'required'}";
108+
if (term.constraint.isAny) {
109+
return "${_terseRef(term)} is "
110+
"${term.isPositive ? 'forbidden' : 'required'}";
111+
} else {
112+
return "${term.package.toTerseString()} is "
113+
"${term.isPositive ? 'forbidden' : 'required'}";
114+
}
75115
}
76116

77117
if (terms.length == 2) {
78118
var term1 = terms.first;
79119
var term2 = terms.last;
80-
if (term1.isPositive != term2.isPositive) {
81-
var positive = (term1.isPositive ? term1 : term2).package;
82-
var negative = (term1.isPositive ? term2 : term1).package;
83-
return "if ${positive.toTerseString()} then ${negative.toTerseString()}";
84-
} else if (term1.isPositive) {
85-
return "${term1.package.toTerseString()} is incompatible with "
86-
"${term2.package.toTerseString()}";
87-
} else {
88-
return "either ${term1.package.toTerseString()} or "
89-
"${term2.package.toTerseString()}";
120+
if (term1.isPositive == term2.isPositive) {
121+
if (term1.isPositive) {
122+
var package1 = term1.constraint.isAny
123+
? _terseRef(term1)
124+
: term1.package.toTerseString();
125+
var package2 = term2.constraint.isAny
126+
? _terseRef(term2)
127+
: term2.package.toTerseString();
128+
return "$package1 is incompatible with $package2";
129+
} else {
130+
return "either ${term1.package.toTerseString()} or "
131+
"${term2.package.toTerseString()}";
132+
}
90133
}
91134
}
92135

@@ -97,11 +140,24 @@ class Incompatibility {
97140
}
98141

99142
if (positive.isNotEmpty && negative.isNotEmpty) {
100-
return "if ${positive.join(' and ')} then ${negative.join(' and ')}";
143+
if (positive.length == 1) {
144+
var positiveTerm = terms.firstWhere((term) => term.isPositive);
145+
if (positiveTerm.constraint.isAny) {
146+
return "all versions of ${_terseRef(positiveTerm)} require "
147+
"${negative.join(' or ')}";
148+
} else {
149+
return "${positive.first} requires ${negative.join(' or ')}";
150+
}
151+
} else {
152+
return "if ${positive.join(' and ')} then ${negative.join(' or ')}";
153+
}
101154
} else if (positive.isNotEmpty) {
102155
return "one of ${positive.join(' or ')} must be false";
103156
} else {
104157
return "one of ${negative.join(' or ')} must be true";
105158
}
106159
}
160+
161+
/// Returns a terse representation of term's package ref.
162+
String _terseRef(Term term) => term.package.toRef().toTerseString();
107163
}

0 commit comments

Comments
 (0)