@@ -68,25 +68,68 @@ class Incompatibility {
68
68
Incompatibility ._(this .terms, this .cause);
69
69
70
70
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
+
71
106
if (terms.length == 1 ) {
72
107
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
+ }
75
115
}
76
116
77
117
if (terms.length == 2 ) {
78
118
var term1 = terms.first;
79
119
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
+ }
90
133
}
91
134
}
92
135
@@ -97,11 +140,24 @@ class Incompatibility {
97
140
}
98
141
99
142
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
+ }
101
154
} else if (positive.isNotEmpty) {
102
155
return "one of ${positive .join (' or ' )} must be false" ;
103
156
} else {
104
157
return "one of ${negative .join (' or ' )} must be true" ;
105
158
}
106
159
}
160
+
161
+ /// Returns a terse representation of term's package ref.
162
+ String _terseRef (Term term) => term.package.toRef ().toTerseString ();
107
163
}
0 commit comments