OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library code_transformers.messages.messages_logger; | 5 library code_transformers.messages.messages_logger; |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert' show JSON; | 8 import 'dart:convert' show JSON; |
9 | 9 |
10 import 'package:barback/barback.dart'; | 10 import 'package:barback/barback.dart'; |
(...skipping 22 matching lines...) Expand all Loading... |
33 /// Underling transform that is currently active. | 33 /// Underling transform that is currently active. |
34 final Transform _transform; | 34 final Transform _transform; |
35 | 35 |
36 /// Logs created during the current transform. | 36 /// Logs created during the current transform. |
37 final LogEntryTable _logs = new LogEntryTable(); | 37 final LogEntryTable _logs = new LogEntryTable(); |
38 | 38 |
39 /// Whether to use `warning` or `error` when forwarding error messages to the | 39 /// Whether to use `warning` or `error` when forwarding error messages to the |
40 /// underlying logger in `_transform.logger`. | 40 /// underlying logger in `_transform.logger`. |
41 final bool convertErrorsToWarnings; | 41 final bool convertErrorsToWarnings; |
42 | 42 |
43 BuildLogger(this._transform, {this.convertErrorsToWarnings: false}); | 43 /// Uri prefix to link for additional details. If set, messages logged through |
| 44 /// this logger will contain an additional sentence, telling users to find |
| 45 /// more details at `$detailsUri#packagename_id`. |
| 46 final String detailsUri; |
| 47 |
| 48 BuildLogger(this._transform, {this.convertErrorsToWarnings: false, |
| 49 this.detailsUri}); |
44 | 50 |
45 /// Records a message at the fine level. If [msg] is a [Message] it is | 51 /// Records a message at the fine level. If [msg] is a [Message] it is |
46 /// recorded directly, otherwise it is first converted to a [String]. | 52 /// recorded directly, otherwise it is first converted to a [String]. |
47 void fine(msg, {AssetId asset, SourceSpan span}) { | 53 void fine(msg, {AssetId asset, SourceSpan span}) { |
48 msg = msg is Message ? msg : new Message.unknown('$msg'); | 54 msg = msg is Message ? msg : new Message.unknown('$msg'); |
49 _transform.logger.fine(msg.snippet, asset: asset, span: span); | 55 _transform.logger.fine(_snippet(msg), asset: asset, span: span); |
50 _logs.add(new BuildLogEntry(msg, span, LogLevel.FINE.name)); | 56 _logs.add(new BuildLogEntry(msg, span, LogLevel.FINE.name)); |
51 } | 57 } |
52 | 58 |
53 /// Records a message at the info level. If [msg] is a [Message] it is | 59 /// Records a message at the info level. If [msg] is a [Message] it is |
54 /// recorded directly, otherwise it is first converted to a [String]. | 60 /// recorded directly, otherwise it is first converted to a [String]. |
55 void info(msg, {AssetId asset, SourceSpan span}) { | 61 void info(msg, {AssetId asset, SourceSpan span}) { |
56 msg = msg is Message ? msg : new Message.unknown('$msg'); | 62 msg = msg is Message ? msg : new Message.unknown('$msg'); |
57 _transform.logger.info(msg.snippet, asset: asset, span: span); | 63 _transform.logger.info(_snippet(msg), asset: asset, span: span); |
58 _logs.add(new BuildLogEntry(msg, span, LogLevel.INFO.name)); | 64 _logs.add(new BuildLogEntry(msg, span, LogLevel.INFO.name)); |
59 } | 65 } |
60 | 66 |
61 /// Records a warning message. If [msg] is a [Message] it is recorded | 67 /// Records a warning message. If [msg] is a [Message] it is recorded |
62 /// directly, otherwise it is first converted to a [String]. | 68 /// directly, otherwise it is first converted to a [String]. |
63 void warning(msg, {AssetId asset, SourceSpan span}) { | 69 void warning(msg, {AssetId asset, SourceSpan span}) { |
64 msg = msg is Message ? msg : new Message.unknown('$msg'); | 70 msg = msg is Message ? msg : new Message.unknown('$msg'); |
65 _transform.logger.warning(msg.snippet, asset: asset, span: span); | 71 _transform.logger.warning(_snippet(msg), asset: asset, span: span); |
66 _logs.add(new BuildLogEntry(msg, span, LogLevel.WARNING.name)); | 72 _logs.add(new BuildLogEntry(msg, span, LogLevel.WARNING.name)); |
67 } | 73 } |
68 | 74 |
69 /// Records an error message. If [msg] is a [Message] it is recorded | 75 /// Records an error message. If [msg] is a [Message] it is recorded |
70 /// directly, otherwise it is first converted to a [String]. | 76 /// directly, otherwise it is first converted to a [String]. |
71 void error(msg, {AssetId asset, SourceSpan span}) { | 77 void error(msg, {AssetId asset, SourceSpan span}) { |
72 msg = msg is Message ? msg : new Message.unknown('$msg'); | 78 msg = msg is Message ? msg : new Message.unknown('$msg'); |
73 if (convertErrorsToWarnings) { | 79 if (convertErrorsToWarnings) { |
74 _transform.logger.warning(msg.snippet, asset: asset, span: span); | 80 _transform.logger.warning(_snippet(msg), asset: asset, span: span); |
75 } else { | 81 } else { |
76 _transform.logger.error(msg.snippet, asset: asset, span: span); | 82 _transform.logger.error(_snippet(msg), asset: asset, span: span); |
77 } | 83 } |
78 _logs.add(new BuildLogEntry(msg, span, LogLevel.ERROR.name)); | 84 _logs.add(new BuildLogEntry(msg, span, LogLevel.ERROR.name)); |
79 } | 85 } |
80 | 86 |
| 87 String _snippet(Message msg) { |
| 88 var s = msg.snippet; |
| 89 if (detailsUri == null) return s; |
| 90 var dot = s.endsWith('.') || s.endsWith('!') || s.endsWith('?') ? '' : '.'; |
| 91 var hashTag = '${msg.id.package}_${msg.id.id}'; |
| 92 return '$s$dot See $detailsUri#$hashTag for details.'; |
| 93 } |
| 94 |
81 /// Outputs the log data to a JSON serialized file. | 95 /// Outputs the log data to a JSON serialized file. |
82 Future writeOutput() { | 96 Future writeOutput() { |
83 return _getNextLogAssetPath().then((path) { | 97 return _getNextLogAssetPath().then((path) { |
84 _transform.addOutput(new Asset.fromString(path, | 98 _transform.addOutput(new Asset.fromString(path, |
85 JSON.encode(_logs))); | 99 JSON.encode(_logs))); |
86 }); | 100 }); |
87 } | 101 } |
88 | 102 |
89 // Each phase outputs a new log file with an incrementing # appended, this | 103 // Each phase outputs a new log file with an incrementing # appended, this |
90 // figures out the next # to use. | 104 // figures out the next # to use. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } | 136 } |
123 | 137 |
124 // Reads all logs for an asset and adds them to this loggers log output. | 138 // Reads all logs for an asset and adds them to this loggers log output. |
125 Future addLogFilesFromAsset(AssetId id, [int nextNumber = 1]) { | 139 Future addLogFilesFromAsset(AssetId id, [int nextNumber = 1]) { |
126 return _readLogFilesForAsset(id, _transform, _logs); | 140 return _readLogFilesForAsset(id, _transform, _logs); |
127 } | 141 } |
128 } | 142 } |
129 | 143 |
130 /// Extension used for assets that contained serialized logs. | 144 /// Extension used for assets that contained serialized logs. |
131 const String LOG_EXTENSION = '._buildLogs'; | 145 const String LOG_EXTENSION = '._buildLogs'; |
OLD | NEW |