| 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; | |
| 10 | |
| 11 import 'dart:collection'; | 9 import 'dart:collection'; |
| 12 | 10 |
| 13 import 'package:html/dom.dart' as dom; | 11 import 'package:html/dom.dart' as dom; |
| 14 | 12 |
| 15 /** | 13 /** |
| 16 * Toplevel container for the API. | 14 * Toplevel container for the API. |
| 17 */ | 15 */ |
| 18 class Api extends ApiNode { | 16 class Api extends ApiNode { |
| 19 final String version; | 17 final String version; |
| 20 final List<Domain> domains; | 18 final List<Domain> domains; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 void visitRefactoring(Refactoring refactoring) { | 124 void visitRefactoring(Refactoring refactoring) { |
| 127 if (refactoring.feedback != null) { | 125 if (refactoring.feedback != null) { |
| 128 visitTypeDecl(refactoring.feedback); | 126 visitTypeDecl(refactoring.feedback); |
| 129 } | 127 } |
| 130 if (refactoring.options != null) { | 128 if (refactoring.options != null) { |
| 131 visitTypeDecl(refactoring.options); | 129 visitTypeDecl(refactoring.options); |
| 132 } | 130 } |
| 133 } | 131 } |
| 134 | 132 |
| 135 void visitRefactorings(Refactorings refactorings) { | 133 void visitRefactorings(Refactorings refactorings) { |
| 136 refactorings.forEach(visitRefactoring); | 134 refactorings?.forEach(visitRefactoring); |
| 137 } | 135 } |
| 138 | 136 |
| 139 void visitRequest(Request request) { | 137 void visitRequest(Request request) { |
| 140 if (request.params != null) { | 138 if (request.params != null) { |
| 141 visitTypeDecl(request.params); | 139 visitTypeDecl(request.params); |
| 142 } | 140 } |
| 143 if (request.result != null) { | 141 if (request.result != null) { |
| 144 visitTypeDecl(request.result); | 142 visitTypeDecl(request.result); |
| 145 } | 143 } |
| 146 } | 144 } |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 340 fields.add(new TypeObjectField('result', result, null)); | 338 fields.add(new TypeObjectField('result', result, null)); |
| 341 } | 339 } |
| 342 return new TypeObject(fields, null); | 340 return new TypeObject(fields, null); |
| 343 } | 341 } |
| 344 } | 342 } |
| 345 | 343 |
| 346 /** | 344 /** |
| 347 * Base class for all possible types. | 345 * Base class for all possible types. |
| 348 */ | 346 */ |
| 349 abstract class TypeDecl extends ApiNode { | 347 abstract class TypeDecl extends ApiNode { |
| 350 TypeDecl(dom.Element html, bool experimental) | 348 TypeDecl(dom.Element html, bool experimental, bool deprecated) |
| 351 : super(html, experimental, false); | 349 : super(html, experimental, deprecated); |
| 352 | 350 |
| 353 accept(ApiVisitor visitor); | 351 accept(ApiVisitor visitor); |
| 354 } | 352 } |
| 355 | 353 |
| 356 /** | 354 /** |
| 357 * Description of a named type definition. | 355 * Description of a named type definition. |
| 358 */ | 356 */ |
| 359 class TypeDefinition extends ApiNode { | 357 class TypeDefinition extends ApiNode { |
| 360 final String name; | 358 final String name; |
| 361 final TypeDecl type; | 359 final TypeDecl type; |
| 362 | 360 |
| 363 TypeDefinition(this.name, this.type, dom.Element html, | 361 TypeDefinition(this.name, this.type, dom.Element html, |
| 364 {bool experimental, bool deprecated}) | 362 {bool experimental, bool deprecated}) |
| 365 : super(html, experimental, deprecated); | 363 : super(html, experimental, deprecated); |
| 366 } | 364 } |
| 367 | 365 |
| 368 /** | 366 /** |
| 369 * Type of an enum. We represent enums in JSON as strings, so this type | 367 * Type of an enum. We represent enums in JSON as strings, so this type |
| 370 * declaration simply lists the allowed values. | 368 * declaration simply lists the allowed values. |
| 371 */ | 369 */ |
| 372 class TypeEnum extends TypeDecl { | 370 class TypeEnum extends TypeDecl { |
| 373 final List<TypeEnumValue> values; | 371 final List<TypeEnumValue> values; |
| 374 | 372 |
| 375 TypeEnum(this.values, dom.Element html, {bool experimental}) | 373 TypeEnum(this.values, dom.Element html, {bool experimental, bool deprecated}) |
| 376 : super(html, experimental); | 374 : super(html, experimental, deprecated); |
| 377 | 375 |
| 376 @override |
| 378 accept(ApiVisitor visitor) => visitor.visitTypeEnum(this); | 377 accept(ApiVisitor visitor) => visitor.visitTypeEnum(this); |
| 379 } | 378 } |
| 380 | 379 |
| 381 /** | 380 /** |
| 382 * Description of a single allowed value for an enum. | 381 * Description of a single allowed value for an enum. |
| 383 */ | 382 */ |
| 384 class TypeEnumValue extends ApiNode { | 383 class TypeEnumValue extends ApiNode { |
| 385 final String value; | 384 final String value; |
| 386 | 385 |
| 387 TypeEnumValue(this.value, dom.Element html, | 386 TypeEnumValue(this.value, dom.Element html, |
| 388 {bool experimental, bool deprecated}) | 387 {bool experimental, bool deprecated}) |
| 389 : super(html, experimental, deprecated); | 388 : super(html, experimental, deprecated); |
| 390 } | 389 } |
| 391 | 390 |
| 392 /** | 391 /** |
| 393 * Type of a JSON list. | 392 * Type of a JSON list. |
| 394 */ | 393 */ |
| 395 class TypeList extends TypeDecl { | 394 class TypeList extends TypeDecl { |
| 396 final TypeDecl itemType; | 395 final TypeDecl itemType; |
| 397 | 396 |
| 398 TypeList(this.itemType, dom.Element html, {bool experimental}) | 397 TypeList(this.itemType, dom.Element html, {bool experimental}) |
| 399 : super(html, experimental); | 398 : super(html, experimental, false); |
| 400 | 399 |
| 400 @override |
| 401 accept(ApiVisitor visitor) => visitor.visitTypeList(this); | 401 accept(ApiVisitor visitor) => visitor.visitTypeList(this); |
| 402 } | 402 } |
| 403 | 403 |
| 404 /** | 404 /** |
| 405 * Type of a JSON map. | 405 * Type of a JSON map. |
| 406 */ | 406 */ |
| 407 class TypeMap extends TypeDecl { | 407 class TypeMap extends TypeDecl { |
| 408 /** | 408 /** |
| 409 * Type of map keys. Note that since JSON map keys must always be strings, | 409 * Type of map keys. Note that since JSON map keys must always be strings, |
| 410 * this must either be a [TypeReference] for [String], or a [TypeReference] | 410 * this must either be a [TypeReference] for [String], or a [TypeReference] |
| 411 * to a type which is defined in the API as an enum or a synonym for [String]. | 411 * to a type which is defined in the API as an enum or a synonym for [String]. |
| 412 */ | 412 */ |
| 413 final TypeReference keyType; | 413 final TypeReference keyType; |
| 414 | 414 |
| 415 /** | 415 /** |
| 416 * Type of map values. | 416 * Type of map values. |
| 417 */ | 417 */ |
| 418 final TypeDecl valueType; | 418 final TypeDecl valueType; |
| 419 | 419 |
| 420 TypeMap(this.keyType, this.valueType, dom.Element html, {bool experimental}) | 420 TypeMap(this.keyType, this.valueType, dom.Element html, {bool experimental}) |
| 421 : super(html, experimental); | 421 : super(html, experimental, false); |
| 422 | 422 |
| 423 @override |
| 423 accept(ApiVisitor visitor) => visitor.visitTypeMap(this); | 424 accept(ApiVisitor visitor) => visitor.visitTypeMap(this); |
| 424 } | 425 } |
| 425 | 426 |
| 426 /** | 427 /** |
| 427 * Type of a JSON object with specified fields, some of which may be optional. | 428 * Type of a JSON object with specified fields, some of which may be optional. |
| 428 */ | 429 */ |
| 429 class TypeObject extends TypeDecl { | 430 class TypeObject extends TypeDecl { |
| 430 final List<TypeObjectField> fields; | 431 final List<TypeObjectField> fields; |
| 431 | 432 |
| 432 TypeObject(this.fields, dom.Element html, {bool experimental}) | 433 TypeObject(this.fields, dom.Element html, |
| 433 : super(html, experimental); | 434 {bool experimental, bool deprecated}) |
| 435 : super(html, experimental, deprecated); |
| 434 | 436 |
| 437 @override |
| 435 accept(ApiVisitor visitor) => visitor.visitTypeObject(this); | 438 accept(ApiVisitor visitor) => visitor.visitTypeObject(this); |
| 436 | 439 |
| 437 /** | 440 /** |
| 438 * Return the field with the given [name], or null if there is no such field. | 441 * Return the field with the given [name], or null if there is no such field. |
| 439 */ | 442 */ |
| 440 TypeObjectField getField(String name) { | 443 TypeObjectField getField(String name) { |
| 441 for (TypeObjectField field in fields) { | 444 for (TypeObjectField field in fields) { |
| 442 if (field.name == name) { | 445 if (field.name == name) { |
| 443 return field; | 446 return field; |
| 444 } | 447 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 466 } | 469 } |
| 467 | 470 |
| 468 /** | 471 /** |
| 469 * A reference to a type which is either defined elsewhere in the API or which | 472 * A reference to a type which is either defined elsewhere in the API or which |
| 470 * is built-in ([String], [bool], or [int]). | 473 * is built-in ([String], [bool], or [int]). |
| 471 */ | 474 */ |
| 472 class TypeReference extends TypeDecl { | 475 class TypeReference extends TypeDecl { |
| 473 final String typeName; | 476 final String typeName; |
| 474 | 477 |
| 475 TypeReference(this.typeName, dom.Element html, {bool experimental}) | 478 TypeReference(this.typeName, dom.Element html, {bool experimental}) |
| 476 : super(html, experimental) { | 479 : super(html, experimental, false) { |
| 477 if (typeName.isEmpty) { | 480 if (typeName.isEmpty) { |
| 478 throw new Exception('Empty type name'); | 481 throw new Exception('Empty type name'); |
| 479 } | 482 } |
| 480 } | 483 } |
| 481 | 484 |
| 485 @override |
| 482 accept(ApiVisitor visitor) => visitor.visitTypeReference(this); | 486 accept(ApiVisitor visitor) => visitor.visitTypeReference(this); |
| 483 } | 487 } |
| 484 | 488 |
| 485 /** | 489 /** |
| 486 * A collection of type definitions. | 490 * A collection of type definitions. |
| 487 */ | 491 */ |
| 488 class Types extends ApiNode with IterableMixin<TypeDefinition> { | 492 class Types extends ApiNode with IterableMixin<TypeDefinition> { |
| 489 final Map<String, TypeDefinition> types; | 493 final Map<String, TypeDefinition> types; |
| 490 | 494 |
| 491 Types(this.types, dom.Element html, {bool experimental}) | 495 Types(this.types, dom.Element html, {bool experimental}) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 506 */ | 510 */ |
| 507 class TypeUnion extends TypeDecl { | 511 class TypeUnion extends TypeDecl { |
| 508 final List<TypeDecl> choices; | 512 final List<TypeDecl> choices; |
| 509 | 513 |
| 510 /** | 514 /** |
| 511 * The field that is used to disambiguate this union | 515 * The field that is used to disambiguate this union |
| 512 */ | 516 */ |
| 513 final String field; | 517 final String field; |
| 514 | 518 |
| 515 TypeUnion(this.choices, this.field, dom.Element html, {bool experimental}) | 519 TypeUnion(this.choices, this.field, dom.Element html, {bool experimental}) |
| 516 : super(html, experimental); | 520 : super(html, experimental, false); |
| 517 | 521 |
| 522 @override |
| 518 accept(ApiVisitor visitor) => visitor.visitTypeUnion(this); | 523 accept(ApiVisitor visitor) => visitor.visitTypeUnion(this); |
| 519 } | 524 } |
| OLD | NEW |