|
5 | 5 | import 'package:analyzer/dart/ast/ast.dart' show AstNode, SimpleIdentifier; |
6 | 6 | import 'package:analyzer/dart/element/element.dart'; |
7 | 7 | import 'package:analyzer/dart/element/type.dart'; |
| 8 | +import 'package:analyzer/diagnostic/diagnostic.dart'; |
8 | 9 | import 'package:analyzer/error/error.dart'; |
9 | 10 | import 'package:analyzer/error/listener.dart'; |
10 | 11 | import 'package:analyzer/exception/exception.dart'; |
@@ -118,15 +119,61 @@ class ExpectedError { |
118 | 119 | /// The offset of the beginning of the error's region. |
119 | 120 | final int length; |
120 | 121 |
|
| 122 | + /// The list of context messages that are expected to be associated with the |
| 123 | + /// error. |
| 124 | + final List<ExpectedMessage> expectedMessages; |
| 125 | + |
121 | 126 | /// Initialize a newly created error description. |
122 | | - ExpectedError(this.code, this.offset, this.length); |
| 127 | + ExpectedError(this.code, this.offset, this.length, |
| 128 | + {this.expectedMessages = const <ExpectedMessage>[]}); |
123 | 129 |
|
124 | 130 | /// Return `true` if the [error] matches this description of what it's |
125 | 131 | /// expected to be. |
126 | 132 | bool matches(AnalysisError error) { |
127 | | - return error.offset == offset && |
128 | | - error.length == length && |
129 | | - error.errorCode == code; |
| 133 | + if (error.offset != offset || |
| 134 | + error.length != length || |
| 135 | + error.errorCode != code) { |
| 136 | + return false; |
| 137 | + } |
| 138 | + List<DiagnosticMessage> contextMessages = error.contextMessages.toList(); |
| 139 | + contextMessages.sort((first, second) { |
| 140 | + int result = first.filePath.compareTo(second.filePath); |
| 141 | + if (result != 0) { |
| 142 | + return result; |
| 143 | + } |
| 144 | + return second.offset - first.offset; |
| 145 | + }); |
| 146 | + if (contextMessages.length != expectedMessages.length) { |
| 147 | + return false; |
| 148 | + } |
| 149 | + for (int i = 0; i < expectedMessages.length; i++) { |
| 150 | + if (!expectedMessages[i].matches(contextMessages[i])) { |
| 151 | + return false; |
| 152 | + } |
| 153 | + } |
| 154 | + return true; |
| 155 | + } |
| 156 | +} |
| 157 | + |
| 158 | +/// A description of a message that is expected to be reported with an error. |
| 159 | +class ExpectedMessage { |
| 160 | + /// The path of the file with which the message is associated. |
| 161 | + final String filePath; |
| 162 | + |
| 163 | + /// The offset of the beginning of the error's region. |
| 164 | + final int offset; |
| 165 | + |
| 166 | + /// The offset of the beginning of the error's region. |
| 167 | + final int length; |
| 168 | + |
| 169 | + ExpectedMessage(this.filePath, this.offset, this.length); |
| 170 | + |
| 171 | + /// Return `true` if the [message] matches this description of what it's |
| 172 | + /// expected to be. |
| 173 | + bool matches(DiagnosticMessage message) { |
| 174 | + return message.filePath == filePath && |
| 175 | + message.offset == offset && |
| 176 | + message.length == length; |
130 | 177 | } |
131 | 178 | } |
132 | 179 |
|
@@ -227,12 +274,30 @@ class GatheringErrorListener implements AnalysisErrorListener { |
227 | 274 | buffer.writeln(); |
228 | 275 | buffer.writeln('To accept the current state, expect:'); |
229 | 276 | for (AnalysisError actual in errors) { |
| 277 | + List<DiagnosticMessage> contextMessages = actual.contextMessages; |
230 | 278 | buffer.write(' error('); |
231 | 279 | buffer.write(actual.errorCode); |
232 | 280 | buffer.write(', '); |
233 | 281 | buffer.write(actual.offset); |
234 | 282 | buffer.write(', '); |
235 | 283 | buffer.write(actual.length); |
| 284 | + if (contextMessages.isNotEmpty) { |
| 285 | + buffer.write(', expectedMessages: ['); |
| 286 | + for (int i = 0; i < contextMessages.length; i++) { |
| 287 | + DiagnosticMessage message = contextMessages[i]; |
| 288 | + if (i > 0) { |
| 289 | + buffer.write(', '); |
| 290 | + } |
| 291 | + buffer.write('message(resourceProvider.convertPath(\''); |
| 292 | + buffer.write(message.filePath); |
| 293 | + buffer.write('\'), '); |
| 294 | + buffer.write(message.offset); |
| 295 | + buffer.write(', '); |
| 296 | + buffer.write(message.length); |
| 297 | + buffer.write(')'); |
| 298 | + } |
| 299 | + buffer.write(']'); |
| 300 | + } |
236 | 301 | buffer.writeln('),'); |
237 | 302 | } |
238 | 303 | fail(buffer.toString()); |
|
0 commit comments