Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: lib/src/runner/parse_metadata.dart

Issue 1256833003: Add Timeout.none. (Closed) Base URL: git@github.com:dart-lang/test@master
Patch Set: Fix invoker_test. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/src/frontend/timeout.dart ('k') | test/backend/invoker_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 test.runner.parse_metadata; 5 library test.runner.parse_metadata;
6 6
7 import 'dart:io'; 7 import 'dart:io';
8 8
9 import 'package:analyzer/analyzer.dart'; 9 import 'package:analyzer/analyzer.dart';
10 import 'package:analyzer/src/generated/ast.dart'; 10 import 'package:analyzer/src/generated/ast.dart';
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
96 return _contextualize(literal, 96 return _contextualize(literal,
97 () => new PlatformSelector.parse(literal.stringValue)); 97 () => new PlatformSelector.parse(literal.stringValue));
98 } 98 }
99 99
100 /// Parses a `@Timeout` annotation. 100 /// Parses a `@Timeout` annotation.
101 /// 101 ///
102 /// [annotation] is the annotation. [constructorName] is the name of the named 102 /// [annotation] is the annotation. [constructorName] is the name of the named
103 /// constructor for the annotation, if any. 103 /// constructor for the annotation, if any.
104 Timeout _parseTimeout(Annotation annotation, String constructorName) { 104 Timeout _parseTimeout(Annotation annotation, String constructorName) {
105 _assertConstructorName(constructorName, 'Timeout', annotation, 105 _assertConstructorName(constructorName, 'Timeout', annotation,
106 validNames: [null, 'factor']); 106 validNames: [null, 'factor', 'none']);
107 107
108 var description = 'Timeout'; 108 var description = 'Timeout';
109 if (constructorName != null) description += '.$constructorName'; 109 if (constructorName != null) description += '.$constructorName';
110 110
111 if (constructorName == 'none') {
112 _assertNoArguments(annotation, description);
113 return Timeout.none;
114 }
115
111 _assertArguments(annotation.arguments, description, annotation, 116 _assertArguments(annotation.arguments, description, annotation,
112 positional: 1); 117 positional: 1);
113 118
114 var args = annotation.arguments.arguments; 119 var args = annotation.arguments.arguments;
115 if (constructorName == null) return new Timeout(_parseDuration(args.first)); 120 if (constructorName == null) return new Timeout(_parseDuration(args.first));
116 return new Timeout.factor(_parseNum(args.first)); 121 return new Timeout.factor(_parseNum(args.first));
117 } 122 }
118 123
119 /// Parses a `Timeout` constructor. 124 /// Parses a `Timeout` constructor.
120 Timeout _parseTimeoutConstructor(InstanceCreationExpression constructor) { 125 Timeout _parseTimeoutConstructor(InstanceCreationExpression constructor) {
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 positional: 1); 174 positional: 1);
170 175
171 return _parseMap(annotation.arguments.arguments.first, key: (key) { 176 return _parseMap(annotation.arguments.arguments.first, key: (key) {
172 var selector = _parseString(key); 177 var selector = _parseString(key);
173 return _contextualize(selector, 178 return _contextualize(selector,
174 () => new PlatformSelector.parse(selector.stringValue)); 179 () => new PlatformSelector.parse(selector.stringValue));
175 }, value: (value) { 180 }, value: (value) {
176 var expressions = []; 181 var expressions = [];
177 if (value is ListLiteral) { 182 if (value is ListLiteral) {
178 expressions = _parseList(value); 183 expressions = _parseList(value);
179 } else if (value is InstanceCreationExpression) { 184 } else if (value is InstanceCreationExpression ||
185 value is PrefixedIdentifier) {
180 expressions = [value]; 186 expressions = [value];
181 } else { 187 } else {
182 throw new SourceSpanFormatException( 188 throw new SourceSpanFormatException(
183 'Expected a Timeout, Skip, or List of those.', 189 'Expected a Timeout, Skip, or List of those.',
184 _spanFor(value)); 190 _spanFor(value));
185 } 191 }
186 192
187 var timeout; 193 var timeout;
188 var skip; 194 var skip;
189 for (var expression in expressions) { 195 for (var expression in expressions) {
190 var className = expression is InstanceCreationExpression 196 if (expression is InstanceCreationExpression) {
191 ? _resolveConstructor( 197 var className = _resolveConstructor(
192 expression.constructorName.type.name, 198 expression.constructorName.type.name,
193 expression.constructorName.name).first 199 expression.constructorName.name).first;
194 : null;
195 200
196 if (className == 'Timeout') { 201 if (className == 'Timeout') {
202 _assertSingle(timeout, 'Timeout', expression);
203 timeout = _parseTimeoutConstructor(expression);
204 continue;
205 } else if (className == 'Skip') {
206 _assertSingle(skip, 'Skip', expression);
207 skip = _parseSkipConstructor(expression);
208 continue;
209 }
210 } else if (expression is PrefixedIdentifier &&
211 expression.prefix.name == 'Timeout') {
212 if (expression.identifier.name != 'none') {
213 throw new SourceSpanFormatException(
214 'Undefined value.', _spanFor(expression));
215 }
216
197 _assertSingle(timeout, 'Timeout', expression); 217 _assertSingle(timeout, 'Timeout', expression);
198 timeout = _parseTimeoutConstructor(expression); 218 timeout = Timeout.none;
199 } else if (className == 'Skip') { 219 continue;
200 _assertSingle(skip, 'Skip', expression);
201 skip = _parseSkipConstructor(expression);
202 } else {
203 throw new SourceSpanFormatException(
204 'Expected a Timeout or Skip.',
205 _spanFor(expression));
206 } 220 }
221
222 throw new SourceSpanFormatException(
223 'Expected a Timeout or Skip.',
224 _spanFor(expression));
207 } 225 }
208 226
209 return new Metadata.parse(timeout: timeout, skip: skip); 227 return new Metadata.parse(timeout: timeout, skip: skip);
210 }); 228 });
211 } 229 }
212 230
213 /// Parses a `const Duration` expression. 231 /// Parses a `const Duration` expression.
214 Duration _parseDuration(Expression expression) { 232 Duration _parseDuration(Expression expression) {
215 _parseConstructor(expression, 'Duration'); 233 _parseConstructor(expression, 'Duration');
216 234
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 buffer.write("${positional + optional} argument"); 418 buffer.write("${positional + optional} argument");
401 if (positional > 1) buffer.write("s"); 419 if (positional > 1) buffer.write("s");
402 buffer.write("."); 420 buffer.write(".");
403 throw new SourceSpanFormatException( 421 throw new SourceSpanFormatException(
404 buffer.toString(), _spanFor(arguments)); 422 buffer.toString(), _spanFor(arguments));
405 } 423 }
406 424
407 return namedValues; 425 return namedValues;
408 } 426 }
409 427
428 /// Assert that [annotation] (described by [name]) has no argument list.
429 void _assertNoArguments(Annotation annotation, String name) {
430 if (annotation.arguments == null) return;
431 throw new SourceSpanFormatException(
432 "$name doesn't take arguments.", _spanFor(annotation));
433 }
434
410 /// Parses a Map literal. 435 /// Parses a Map literal.
411 /// 436 ///
412 /// By default, returns [Expression] keys and values. These can be overridden 437 /// By default, returns [Expression] keys and values. These can be overridden
413 /// with the [key] and [value] parameters. 438 /// with the [key] and [value] parameters.
414 Map _parseMap(Expression expression, {key(Expression expression), 439 Map _parseMap(Expression expression, {key(Expression expression),
415 value(Expression expression)}) { 440 value(Expression expression)}) {
416 if (key == null) key = (expression) => expression; 441 if (key == null) key = (expression) => expression;
417 if (value == null) value = (expression) => expression; 442 if (value == null) value = (expression) => expression;
418 443
419 if (expression is! MapLiteral) { 444 if (expression is! MapLiteral) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 return fn(); 511 return fn();
487 } on SourceSpanFormatException catch (error) { 512 } on SourceSpanFormatException catch (error) {
488 var file = new SourceFile(new File(_path).readAsStringSync(), 513 var file = new SourceFile(new File(_path).readAsStringSync(),
489 url: p.toUri(_path)); 514 url: p.toUri(_path));
490 var span = contextualizeSpan(error.span, literal, file); 515 var span = contextualizeSpan(error.span, literal, file);
491 if (span == null) rethrow; 516 if (span == null) rethrow;
492 throw new SourceSpanFormatException(error.message, span); 517 throw new SourceSpanFormatException(error.message, span);
493 } 518 }
494 } 519 }
495 } 520 }
OLDNEW
« no previous file with comments | « lib/src/frontend/timeout.dart ('k') | test/backend/invoker_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698