Skip to content

Commit 0ace907

Browse files
committed
Better warnings and errors logging.
1 parent f5d6222 commit 0ace907

File tree

7 files changed

+102
-51
lines changed

7 files changed

+102
-51
lines changed

build_runner/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
## 2.7.3-wip
22

3+
- Make errors more prominent in log output, highlight in red.
4+
- Remove "deleting declared outputs" warning.
35
- Bug fix: fix incorrect display of some "usage" messages.
46
- Move code from `build_resolvers` into `build_runner`.
57
- Move code from `build_runner_core` into `build_runner`.

build_runner/lib/src/generate/build_definition.dart

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,11 +211,6 @@ class _Loader {
211211
ReaderWriter readerWriter,
212212
) async {
213213
if (conflictingAssets.isEmpty) return;
214-
215-
buildLog.info(
216-
'Deleting ${conflictingAssets.length} declared outputs '
217-
'which already existed on disk.',
218-
);
219214
await Future.wait(conflictingAssets.map((id) => readerWriter.delete(id)));
220215
}
221216
}

build_runner/lib/src/logging/ansi_buffer.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class AnsiBuffer {
1414
static const String nbsp = '\u00A0';
1515
static const reset = '\x1B[0m';
1616
static const bold = '\x1B[1m';
17+
static const boldRed = '\x1B[1;31m';
1718
static const _nbspCodeUnit = 0xA0;
1819
static const _spaceCodeUnit = 32;
1920

@@ -127,7 +128,7 @@ class AnsiBuffer {
127128

128129
/// Removes all ANSI constants from [string], for testing.
129130
static String removeAnsi(String string) =>
130-
string.replaceAll(reset, '').replaceAll(bold, '');
131+
string.replaceAll(reset, '').replaceAll(bold, '').replaceAll(boldRed, '');
131132
}
132133

133134
/// A line for writing to an [AnsiBuffer].
@@ -167,7 +168,9 @@ class AnsiBufferLine {
167168
}
168169

169170
bool _isAnsi(String item) =>
170-
item == AnsiBuffer.reset || item == AnsiBuffer.bold;
171+
item == AnsiBuffer.reset ||
172+
item == AnsiBuffer.bold ||
173+
item == AnsiBuffer.boldRed;
171174

172175
bool get _showingAnsi =>
173176
buildLog.configuration.forceAnsiConsoleForTesting ??

build_runner/lib/src/logging/build_log.dart

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,11 @@ class BuildLog {
386386
_display.block(render());
387387
_display.flush();
388388
} else {
389-
_display.message(Severity.info, _status.join(''));
389+
_display.message(
390+
Severity.info,
391+
// Removes ANSI codes if necessary.
392+
AnsiBufferLine(_status).toString(),
393+
);
390394
}
391395
}
392396

@@ -456,23 +460,33 @@ class BuildLog {
456460
.fold(0, max);
457461
final indent = maxProgressWidth + 1;
458462

459-
for (final entry in displayedProgressEntries) {
460-
final phaseName = entry.key;
463+
if (displayedProgressEntries.isNotEmpty) {
464+
for (final entry in displayedProgressEntries) {
465+
final phaseName = entry.key;
461466

462-
result.write(_renderPhase(phaseName).withHangingIndent(indent));
467+
result.write(_renderPhase(phaseName).withHangingIndent(indent));
468+
}
469+
result.writeEmptyLine();
463470
}
464471

465-
if (displayedProgressEntries.isNotEmpty) {
466-
result.writeLine([]);
472+
final renderedMessages = _messages.render();
473+
474+
// Log output blocks with no errors show before the status line.
475+
if (renderedMessages.nonFailureLines.isNotEmpty) {
476+
for (final line in renderedMessages.nonFailureLines) {
477+
result.write(line);
478+
}
479+
result.writeEmptyLine();
467480
}
481+
468482
if (_status.isNotEmpty) {
469483
result.writeLine(_status);
470484
}
471485

472-
final renderedMessages = _messages.render();
473-
if (renderedMessages.isNotEmpty) {
474-
result.writeEmptyLine();
475-
for (final line in renderedMessages) {
486+
// Log output blocks that do have errors show after the status line.
487+
if (renderedMessages.failureLines.isNotEmpty) {
488+
if (_status.isNotEmpty) result.writeEmptyLine();
489+
for (final line in renderedMessages.failureLines) {
476490
result.write(line);
477491
}
478492
}

build_runner/lib/src/logging/build_log_messages.dart

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ class BuildLogMessages {
5151
bool hasMessages({required String? phaseName}) =>
5252
_phaseNamesWithMessages.contains(phaseName);
5353

54-
List<AnsiBufferLine> render() {
55-
final result = <AnsiBufferLine>[];
54+
RenderResult render() {
55+
final result = RenderResult();
5656

5757
final buildRunnerCategories = <MapEntry<_MessageCategory, List<Message>>>[];
5858
for (final entry in _messageByCategory.entries) {
@@ -72,40 +72,50 @@ class BuildLogMessages {
7272
return result;
7373
}
7474

75-
List<AnsiBufferLine> _renderCategory(
75+
RenderResult _renderCategory(
7676
MapEntry<_MessageCategory, List<Message>> entry,
7777
) {
78-
final result = <AnsiBufferLine>[];
7978
final category = entry.key;
8079
final context = category.context;
80+
81+
final messages = _messageByCategory[category]!;
82+
final failed = messages.any(
83+
(message) => message.severity == Severity.error,
84+
);
85+
86+
final result = <AnsiBufferLine>[];
8187
result.add(
8288
AnsiBufferLine([
83-
'log output for ',
84-
AnsiBuffer.bold,
85-
category.phaseName ?? 'build_runner',
86-
AnsiBuffer.reset,
8789
if (context != null) ...[
88-
' on ',
89-
AnsiBuffer.bold,
90+
failed ? AnsiBuffer.boldRed : AnsiBuffer.bold,
9091
context,
9192
AnsiBuffer.reset,
93+
' ',
9294
],
95+
AnsiBuffer.bold,
96+
category.phaseName ?? 'build_runner',
97+
AnsiBuffer.reset,
9398
]),
9499
);
95100

96-
for (final message in _messageByCategory[category]!) {
101+
for (final message in messages) {
97102
var first = true;
98103
for (final line in message.text.split('\n')) {
99104
result.add(
100105
AnsiBufferLine([
106+
if (message.severity == Severity.error) AnsiBuffer.boldRed,
101107
first ? message.severity.prefix : ' ',
108+
if (message.severity == Severity.error) AnsiBuffer.reset,
102109
line,
103110
], hangingIndent: 2),
104111
);
105112
first = false;
106113
}
107114
}
108-
return result;
115+
116+
return failed
117+
? RenderResult.failed(result)
118+
: RenderResult.succeeded(result);
109119
}
110120
}
111121

@@ -177,3 +187,24 @@ enum Severity {
177187
Severity.error => 'E ',
178188
};
179189
}
190+
191+
class RenderResult {
192+
/// Rendered messages block that does not contain any errors.
193+
final List<AnsiBufferLine> nonFailureLines;
194+
195+
/// Rendered messages block that does contain errors.
196+
final List<AnsiBufferLine> failureLines;
197+
198+
RenderResult() : nonFailureLines = [], failureLines = [];
199+
RenderResult.failed(List<AnsiBufferLine> lines)
200+
: failureLines = lines,
201+
nonFailureLines = [];
202+
RenderResult.succeeded(List<AnsiBufferLine> lines)
203+
: nonFailureLines = lines,
204+
failureLines = [];
205+
206+
void addAll(RenderResult other) {
207+
nonFailureLines.addAll(other.nonFailureLines);
208+
failureLines.addAll(other.failureLines);
209+
}
210+
}

build_runner/test/logging/build_log_console_mode_test.dart

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ columns because it will not fit.'''),
6262
padLinesRight('''
6363
Some setup.
6464
65-
log output for build_runner
65+
build_runner
6666
Some info.
6767
W A warning.
6868
W Another warning.
@@ -238,15 +238,16 @@ Building, full build.'''),
238238
0s builder1 on 10 inputs; pkg|lib/l0.dart
239239
0s builder2 on 15 inputs
240240
241-
Building, full build.
242-
243-
log output for builder1 on lib/l0.dart
241+
lib/l0.dart builder1
244242
Some info.
245243
Some more info.
246-
log output for builder2 on lib/l1.dart
244+
245+
Building, full build.
246+
247+
lib/l1.dart builder2
247248
W A warning.
248249
E An error.
249-
log output for builder2 on lib/l3.dart
250+
lib/l3.dart builder2
250251
E An error.'''),
251252
);
252253

@@ -275,17 +276,18 @@ E An error.'''),
275276
0s builder2 on 15 inputs
276277
0s builder1 (lazy): 1 no-op
277278
278-
Building, full build.
279-
280-
log output for builder1 on lib/l0.dart
279+
lib/l0.dart builder1
281280
Some info.
282281
Some more info.
283-
log output for builder2 on lib/l1.dart
282+
283+
Building, full build.
284+
285+
lib/l1.dart builder2
284286
W A warning.
285287
E An error.
286-
log output for builder2 on lib/l3.dart
288+
lib/l3.dart builder2
287289
E An error.
288-
log output for builder1 (lazy) on lib/l3.dart
290+
lib/l3.dart builder1 (lazy)
289291
E An error.'''),
290292
);
291293
});
@@ -343,11 +345,12 @@ E An error.'''),
343345
0s builder1 on 1 input: 1 output
344346
0s builder2 on 1 input: 1 output
345347
348+
lib/l0.dart builder1
349+
Some info.
350+
346351
Built with build_runner in 0s with warnings; wrote 2 outputs.
347352
348-
log output for builder1 on lib/l0.dart
349-
Some info.
350-
log output for builder2 on lib/l0.dart
353+
lib/l0.dart builder2
351354
W A warning.
352355
E An error.'''),
353356
);

build_runner/test/logging/build_log_messages_test.dart

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,19 +95,22 @@ void main() {
9595
context: 'file1',
9696
severity: Severity.info,
9797
);
98-
expect(messages.render().map((l) => l.toString()).toList(), [
99-
'log output for phase1 on file1',
100-
'E message1',
101-
'W message3',
102-
'log output for phase2 on file1',
98+
final rendered = messages.render();
99+
expect(rendered.nonFailureLines.map((l) => l.toString()).toList(), [
100+
'file1 phase2',
103101
' message2',
104102
' message6',
105-
'log output for phase1 on file2',
103+
'file2 phase1',
106104
' message4',
107-
'log output for build_runner',
105+
'build_runner',
108106
'W message0',
109107
' message5',
110108
]);
109+
expect(rendered.failureLines.map((l) => l.toString()).toList(), [
110+
'file1 phase1',
111+
'E message1',
112+
'W message3',
113+
]);
111114
});
112115
});
113116
}

0 commit comments

Comments
 (0)