OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 /** | 5 /** |
6 * Data structures representing an API definition, and visitor base classes | 6 * Data structures representing an API definition, and visitor base classes |
7 * for visiting those data structures. | 7 * for visiting those data structures. |
8 */ | 8 */ |
9 library api; | 9 library api; |
10 | 10 |
11 import 'dart:collection'; | 11 import 'dart:collection'; |
12 | 12 |
13 import 'package:html5lib/dom.dart' as dom; | 13 import 'package:html5lib/dom.dart' as dom; |
14 | 14 |
15 /** | 15 /** |
16 * Base class for visiting the API definition. | 16 * Base class for visiting the API definition. |
17 */ | 17 */ |
18 abstract class ApiVisitor<T> { | 18 abstract class ApiVisitor<T> { |
19 T visitTypeReference(TypeReference typeReference); | 19 T visitTypeReference(TypeReference typeReference); |
| 20 T visitTypeUnion(TypeUnion typeUnion); |
20 T visitTypeObject(TypeObject typeObject); | 21 T visitTypeObject(TypeObject typeObject); |
21 T visitTypeList(TypeList typeList); | 22 T visitTypeList(TypeList typeList); |
22 T visitTypeMap(TypeMap typeMap); | 23 T visitTypeMap(TypeMap typeMap); |
23 T visitTypeEnum(TypeEnum typeEnum); | 24 T visitTypeEnum(TypeEnum typeEnum); |
24 | 25 |
25 /** | 26 /** |
26 * Dispatch the given [type] to the visitor. | 27 * Dispatch the given [type] to the visitor. |
27 */ | 28 */ |
28 T visitTypeDecl(TypeDecl type) => type.accept(this); | 29 T visitTypeDecl(TypeDecl type) => type.accept(this); |
29 } | 30 } |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 } | 112 } |
112 | 113 |
113 void visitTypeObjectField(TypeObjectField typeObjectField) { | 114 void visitTypeObjectField(TypeObjectField typeObjectField) { |
114 visitTypeDecl(typeObjectField.type); | 115 visitTypeDecl(typeObjectField.type); |
115 } | 116 } |
116 | 117 |
117 @override | 118 @override |
118 void visitTypeReference(TypeReference typeReference) { | 119 void visitTypeReference(TypeReference typeReference) { |
119 } | 120 } |
120 | 121 |
| 122 @override |
| 123 void visitTypeUnion(TypeUnion typeUnion) { |
| 124 typeUnion.choices.forEach(visitTypeDecl); |
| 125 } |
| 126 |
121 /** | 127 /** |
122 * If [type] is a [TypeReference] that is defined in the API, follow the | 128 * If [type] is a [TypeReference] that is defined in the API, follow the |
123 * chain until a non-[TypeReference] is found, if possible. | 129 * chain until a non-[TypeReference] is found, if possible. |
124 * | 130 * |
125 * If it is not possible (because the chain ends with a [TypeReference] that | 131 * If it is not possible (because the chain ends with a [TypeReference] that |
126 * is not defined in the API), then that final [TypeReference] is returned. | 132 * is not defined in the API), then that final [TypeReference] is returned. |
127 */ | 133 */ |
128 TypeDecl resolveTypeReferenceChain(TypeDecl type) { | 134 TypeDecl resolveTypeReferenceChain(TypeDecl type) { |
129 while (type is TypeReference && api.types.containsKey(type.typeName)) { | 135 while (type is TypeReference && api.types.containsKey(type.typeName)) { |
130 type = api.types[(type as TypeReference).typeName].type; | 136 type = api.types[(type as TypeReference).typeName].type; |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 TypeReference(this.typeName, dom.Element html) : super(html) { | 365 TypeReference(this.typeName, dom.Element html) : super(html) { |
360 if (typeName.isEmpty) { | 366 if (typeName.isEmpty) { |
361 throw new Exception('Empty type name'); | 367 throw new Exception('Empty type name'); |
362 } | 368 } |
363 } | 369 } |
364 | 370 |
365 accept(ApiVisitor visitor) => visitor.visitTypeReference(this); | 371 accept(ApiVisitor visitor) => visitor.visitTypeReference(this); |
366 } | 372 } |
367 | 373 |
368 /** | 374 /** |
| 375 * Type which represents a union among multiple choices. |
| 376 */ |
| 377 class TypeUnion extends TypeDecl { |
| 378 final List<TypeDecl> choices; |
| 379 |
| 380 TypeUnion(this.choices, dom.Element html) : super(html); |
| 381 |
| 382 accept(ApiVisitor visitor) => visitor.visitTypeUnion(this); |
| 383 } |
| 384 |
| 385 /** |
369 * Type of a JSON object with specified fields, some of which may be optional. | 386 * Type of a JSON object with specified fields, some of which may be optional. |
370 */ | 387 */ |
371 class TypeObject extends TypeDecl { | 388 class TypeObject extends TypeDecl { |
372 final List<TypeObjectField> fields; | 389 final List<TypeObjectField> fields; |
373 | 390 |
374 TypeObject(this.fields, dom.Element html) : super(html); | 391 TypeObject(this.fields, dom.Element html) : super(html); |
375 | 392 |
376 accept(ApiVisitor visitor) => visitor.visitTypeObject(this); | 393 accept(ApiVisitor visitor) => visitor.visitTypeObject(this); |
377 } | 394 } |
378 | 395 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
438 } | 455 } |
439 | 456 |
440 /** | 457 /** |
441 * Description of a single allowed value for an enum. | 458 * Description of a single allowed value for an enum. |
442 */ | 459 */ |
443 class TypeEnumValue extends ApiNode { | 460 class TypeEnumValue extends ApiNode { |
444 final String value; | 461 final String value; |
445 | 462 |
446 TypeEnumValue(this.value, dom.Element html) : super(html); | 463 TypeEnumValue(this.value, dom.Element html) : super(html); |
447 } | 464 } |
OLD | NEW |