OLD | NEW |
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 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 return directive.prefix.name; | 48 return directive.prefix.name; |
49 }).where((prefix) => prefix != null).toSet(); | 49 }).where((prefix) => prefix != null).toSet(); |
50 } | 50 } |
51 | 51 |
52 /// Parses the metadata. | 52 /// Parses the metadata. |
53 Metadata parse() { | 53 Metadata parse() { |
54 var timeout; | 54 var timeout; |
55 var testOn; | 55 var testOn; |
56 var skip; | 56 var skip; |
57 var onPlatform; | 57 var onPlatform; |
| 58 var tags; |
58 | 59 |
59 for (var annotation in _annotations) { | 60 for (var annotation in _annotations) { |
60 var pair = _resolveConstructor( | 61 var pair = _resolveConstructor( |
61 annotation.name, annotation.constructorName); | 62 annotation.name, annotation.constructorName); |
62 var name = pair.first; | 63 var name = pair.first; |
63 var constructorName = pair.last; | 64 var constructorName = pair.last; |
64 | 65 |
65 if (name == 'TestOn') { | 66 if (name == 'TestOn') { |
66 _assertSingle(testOn, 'TestOn', annotation); | 67 _assertSingle(testOn, 'TestOn', annotation); |
67 testOn = _parseTestOn(annotation, constructorName); | 68 testOn = _parseTestOn(annotation, constructorName); |
68 } else if (name == 'Timeout') { | 69 } else if (name == 'Timeout') { |
69 _assertSingle(timeout, 'Timeout', annotation); | 70 _assertSingle(timeout, 'Timeout', annotation); |
70 timeout = _parseTimeout(annotation, constructorName); | 71 timeout = _parseTimeout(annotation, constructorName); |
71 } else if (name == 'Skip') { | 72 } else if (name == 'Skip') { |
72 _assertSingle(skip, 'Skip', annotation); | 73 _assertSingle(skip, 'Skip', annotation); |
73 skip = _parseSkip(annotation, constructorName); | 74 skip = _parseSkip(annotation, constructorName); |
74 } else if (name == 'OnPlatform') { | 75 } else if (name == 'OnPlatform') { |
75 _assertSingle(onPlatform, 'OnPlatform', annotation); | 76 _assertSingle(onPlatform, 'OnPlatform', annotation); |
76 onPlatform = _parseOnPlatform(annotation, constructorName); | 77 onPlatform = _parseOnPlatform(annotation, constructorName); |
| 78 } else if (name == 'Tags') { |
| 79 _assertSingle(tags, 'Tags', annotation); |
| 80 tags = _parseTags(annotation, constructorName); |
77 } | 81 } |
78 } | 82 } |
79 | 83 |
80 return new Metadata( | 84 return new Metadata( |
81 testOn: testOn, | 85 testOn: testOn, |
82 timeout: timeout, | 86 timeout: timeout, |
83 skip: skip != null, | 87 skip: skip != null, |
84 skipReason: skip is String ? skip : null, | 88 skipReason: skip is String ? skip : null, |
85 onPlatform: onPlatform); | 89 onPlatform: onPlatform, |
| 90 tags: tags); |
86 } | 91 } |
87 | 92 |
88 /// Parses a `@TestOn` annotation. | 93 /// Parses a `@TestOn` annotation. |
89 /// | 94 /// |
90 /// [annotation] is the annotation. [constructorName] is the name of the named | 95 /// [annotation] is the annotation. [constructorName] is the name of the named |
91 /// constructor for the annotation, if any. | 96 /// constructor for the annotation, if any. |
92 PlatformSelector _parseTestOn(Annotation annotation, String constructorName) { | 97 PlatformSelector _parseTestOn(Annotation annotation, String constructorName) { |
93 _assertConstructorName(constructorName, 'TestOn', annotation); | 98 _assertConstructorName(constructorName, 'TestOn', annotation); |
94 _assertArguments(annotation.arguments, 'TestOn', annotation, positional: 1); | 99 _assertArguments(annotation.arguments, 'TestOn', annotation, positional: 1); |
95 var literal = _parseString(annotation.arguments.arguments.first); | 100 var literal = _parseString(annotation.arguments.arguments.first); |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 /// Returns either `true` or a reason string. | 161 /// Returns either `true` or a reason string. |
157 _parseSkipConstructor(InstanceCreationExpression constructor) { | 162 _parseSkipConstructor(InstanceCreationExpression constructor) { |
158 _parseConstructor(constructor, 'Skip'); | 163 _parseConstructor(constructor, 'Skip'); |
159 _assertArguments(constructor.argumentList, 'Skip', constructor, | 164 _assertArguments(constructor.argumentList, 'Skip', constructor, |
160 optional: 1); | 165 optional: 1); |
161 | 166 |
162 var args = constructor.argumentList.arguments; | 167 var args = constructor.argumentList.arguments; |
163 return args.isEmpty ? true : _parseString(args.first).stringValue; | 168 return args.isEmpty ? true : _parseString(args.first).stringValue; |
164 } | 169 } |
165 | 170 |
| 171 /// Parses a `@Tags` annotation. |
| 172 /// |
| 173 /// [annotation] is the annotation. [constructorName] is the name of the named |
| 174 /// constructor for the annotation, if any. |
| 175 Set<String> _parseTags(Annotation annotation, String constructorName) { |
| 176 _assertConstructorName(constructorName, 'Tags', annotation); |
| 177 _assertArguments(annotation.arguments, 'Tags', annotation, positional: 1); |
| 178 var arg = annotation.arguments.arguments.first; |
| 179 if (arg is ListLiteral) { |
| 180 var tagExpressions = _parseList(arg); |
| 181 return new Set<String>.from( |
| 182 tagExpressions.map((tagExpr) => _parseString(tagExpr).stringValue)); |
| 183 } else if (arg is StringLiteral) { |
| 184 return new Set<String>.from([_parseString(arg).stringValue]); |
| 185 } else { |
| 186 throw new SourceSpanFormatException( |
| 187 'Only String or List literal allowed as @Tags argument', |
| 188 _spanFor(arg)); |
| 189 } |
| 190 } |
| 191 |
166 /// Parses an `@OnPlatform` annotation. | 192 /// Parses an `@OnPlatform` annotation. |
167 /// | 193 /// |
168 /// [annotation] is the annotation. [constructorName] is the name of the named | 194 /// [annotation] is the annotation. [constructorName] is the name of the named |
169 /// constructor for the annotation, if any. | 195 /// constructor for the annotation, if any. |
170 Map<PlatformSelector, Metadata> _parseOnPlatform(Annotation annotation, | 196 Map<PlatformSelector, Metadata> _parseOnPlatform(Annotation annotation, |
171 String constructorName) { | 197 String constructorName) { |
172 _assertConstructorName(constructorName, 'OnPlatform', annotation); | 198 _assertConstructorName(constructorName, 'OnPlatform', annotation); |
173 _assertArguments(annotation.arguments, 'OnPlatform', annotation, | 199 _assertArguments(annotation.arguments, 'OnPlatform', annotation, |
174 positional: 1); | 200 positional: 1); |
175 | 201 |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
511 return fn(); | 537 return fn(); |
512 } on SourceSpanFormatException catch (error) { | 538 } on SourceSpanFormatException catch (error) { |
513 var file = new SourceFile(new File(_path).readAsStringSync(), | 539 var file = new SourceFile(new File(_path).readAsStringSync(), |
514 url: p.toUri(_path)); | 540 url: p.toUri(_path)); |
515 var span = contextualizeSpan(error.span, literal, file); | 541 var span = contextualizeSpan(error.span, literal, file); |
516 if (span == null) rethrow; | 542 if (span == null) rethrow; |
517 throw new SourceSpanFormatException(error.message, span); | 543 throw new SourceSpanFormatException(error.message, span); |
518 } | 544 } |
519 } | 545 } |
520 } | 546 } |
OLD | NEW |