| 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 /** | 5 /** |
| 6 * This file contains code to generate serialization/deserialization logic for | 6 * This file contains code to generate serialization/deserialization logic for |
| 7 * summaries based on an "IDL" description of the summary format (written in | 7 * summaries based on an "IDL" description of the summary format (written in |
| 8 * stylized Dart). | 8 * stylized Dart). |
| 9 * | 9 * |
| 10 * For each class in the "IDL" input, two corresponding classes are generated: | 10 * For each class in the "IDL" input, two corresponding classes are generated: |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 if (type.isList) { | 113 if (type.isList) { |
| 114 return 'List<${type.typeName}>'; | 114 return 'List<${type.typeName}>'; |
| 115 } else { | 115 } else { |
| 116 return type.typeName; | 116 return type.typeName; |
| 117 } | 117 } |
| 118 } | 118 } |
| 119 | 119 |
| 120 /** | 120 /** |
| 121 * Generate a Dart expression representing the default value for a field | 121 * Generate a Dart expression representing the default value for a field |
| 122 * having the given [type], or `null` if there is no default value. | 122 * having the given [type], or `null` if there is no default value. |
| 123 * |
| 124 * If [builder] is `true`, the returned type should be appropriate for use in |
| 125 * a builder class. |
| 123 */ | 126 */ |
| 124 String defaultValue(idlModel.FieldType type) { | 127 String defaultValue(idlModel.FieldType type, bool builder) { |
| 125 if (type.isList) { | 128 if (type.isList) { |
| 126 return 'const <${type.typeName}>[]'; | 129 if (builder) { |
| 130 idlModel.FieldType elementType = |
| 131 new idlModel.FieldType(type.typeName, false); |
| 132 return '<${encodedType(elementType)}>[]'; |
| 133 } else { |
| 134 return 'const <${type.typeName}>[]'; |
| 135 } |
| 127 } else if (_idl.enums.containsKey(type.typeName)) { | 136 } else if (_idl.enums.containsKey(type.typeName)) { |
| 128 return '${type.typeName}.${_idl.enums[type.typeName].values[0]}'; | 137 return '${type.typeName}.${_idl.enums[type.typeName].values[0]}'; |
| 129 } else if (type.typeName == 'int') { | 138 } else if (type.typeName == 'int') { |
| 130 return '0'; | 139 return '0'; |
| 131 } else if (type.typeName == 'String') { | 140 } else if (type.typeName == 'String') { |
| 132 return "''"; | 141 return "''"; |
| 133 } else if (type.typeName == 'bool') { | 142 } else if (type.typeName == 'bool') { |
| 134 return 'false'; | 143 return 'false'; |
| 135 } else { | 144 } else { |
| 136 return null; | 145 return null; |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 String fieldName = field.name; | 316 String fieldName = field.name; |
| 308 idlModel.FieldType type = field.type; | 317 idlModel.FieldType type = field.type; |
| 309 String typeStr = encodedType(type); | 318 String typeStr = encodedType(type); |
| 310 out('$typeStr _$fieldName;'); | 319 out('$typeStr _$fieldName;'); |
| 311 } | 320 } |
| 312 // Generate getters and setters. | 321 // Generate getters and setters. |
| 313 for (idlModel.FieldDeclaration field in cls.fields) { | 322 for (idlModel.FieldDeclaration field in cls.fields) { |
| 314 String fieldName = field.name; | 323 String fieldName = field.name; |
| 315 idlModel.FieldType fieldType = field.type; | 324 idlModel.FieldType fieldType = field.type; |
| 316 String typeStr = encodedType(fieldType); | 325 String typeStr = encodedType(fieldType); |
| 317 String def = defaultValue(fieldType); | 326 String def = defaultValue(fieldType, true); |
| 318 String defSuffix = def == null ? '' : ' ?? $def'; | 327 String defSuffix = def == null ? '' : ' ??= $def'; |
| 319 out(); | 328 out(); |
| 320 out('@override'); | 329 out('@override'); |
| 321 out('${dartType(fieldType)} get $fieldName => _$fieldName$defSuffix;'); | 330 out('$typeStr get $fieldName => _$fieldName$defSuffix;'); |
| 322 out(); | 331 out(); |
| 323 outDoc(field.documentation); | 332 outDoc(field.documentation); |
| 324 constructorParams.add('$typeStr $fieldName'); | 333 constructorParams.add('$typeStr $fieldName'); |
| 325 out('void set $fieldName($typeStr _value) {'); | 334 out('void set $fieldName($typeStr _value) {'); |
| 326 indent(() { | 335 indent(() { |
| 327 String stateFieldName = '_' + fieldName; | 336 String stateFieldName = '_' + fieldName; |
| 328 out('assert(!_finished);'); | 337 out('assert(!_finished);'); |
| 329 // Validate that int(s) are non-negative. | 338 // Validate that int(s) are non-negative. |
| 330 if (fieldType.typeName == 'int') { | 339 if (fieldType.typeName == 'int') { |
| 331 if (!fieldType.isList) { | 340 if (!fieldType.isList) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 condition = ' || $valueName.isEmpty'; | 392 condition = ' || $valueName.isEmpty'; |
| 384 if (_idl.classes.containsKey(fieldType.typeName)) { | 393 if (_idl.classes.containsKey(fieldType.typeName)) { |
| 385 String itemCode = 'b.finish(fbBuilder)'; | 394 String itemCode = 'b.finish(fbBuilder)'; |
| 386 String listCode = '$valueName.map((b) => $itemCode).toList()'; | 395 String listCode = '$valueName.map((b) => $itemCode).toList()'; |
| 387 writeCode = '$offsetName = fbBuilder.writeList($listCode);'; | 396 writeCode = '$offsetName = fbBuilder.writeList($listCode);'; |
| 388 } else if (_idl.enums.containsKey(fieldType.typeName)) { | 397 } else if (_idl.enums.containsKey(fieldType.typeName)) { |
| 389 String itemCode = 'b.index'; | 398 String itemCode = 'b.index'; |
| 390 String listCode = '$valueName.map((b) => $itemCode).toList()'; | 399 String listCode = '$valueName.map((b) => $itemCode).toList()'; |
| 391 writeCode = '$offsetName = fbBuilder.writeListUint32($listCode);'; | 400 writeCode = '$offsetName = fbBuilder.writeListUint32($listCode);'; |
| 392 } else if (fieldType.typeName == 'int') { | 401 } else if (fieldType.typeName == 'int') { |
| 393 writeCode = '$offsetName = fbBuilder.writeListUint32($valueName);'
; | 402 writeCode = |
| 403 '$offsetName = fbBuilder.writeListUint32($valueName);'; |
| 394 } else if (fieldType.typeName == 'double') { | 404 } else if (fieldType.typeName == 'double') { |
| 395 writeCode = '$offsetName = fbBuilder.writeListFloat64($valueName);
'; | 405 writeCode = |
| 406 '$offsetName = fbBuilder.writeListFloat64($valueName);'; |
| 396 } else { | 407 } else { |
| 397 assert(fieldType.typeName == 'String'); | 408 assert(fieldType.typeName == 'String'); |
| 398 String itemCode = 'fbBuilder.writeString(b)'; | 409 String itemCode = 'fbBuilder.writeString(b)'; |
| 399 String listCode = '$valueName.map((b) => $itemCode).toList()'; | 410 String listCode = '$valueName.map((b) => $itemCode).toList()'; |
| 400 writeCode = '$offsetName = fbBuilder.writeList($listCode);'; | 411 writeCode = '$offsetName = fbBuilder.writeList($listCode);'; |
| 401 } | 412 } |
| 402 } else if (fieldType.typeName == 'String') { | 413 } else if (fieldType.typeName == 'String') { |
| 403 writeCode = '$offsetName = fbBuilder.writeString($valueName);'; | 414 writeCode = '$offsetName = fbBuilder.writeString($valueName);'; |
| 404 } else if (_idl.classes.containsKey(fieldType.typeName)) { | 415 } else if (_idl.classes.containsKey(fieldType.typeName)) { |
| 405 writeCode = '$offsetName = $valueName.finish(fbBuilder);'; | 416 writeCode = '$offsetName = $valueName.finish(fbBuilder);'; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 426 if (fieldType.isList || | 437 if (fieldType.isList || |
| 427 fieldType.typeName == 'String' || | 438 fieldType.typeName == 'String' || |
| 428 _idl.classes.containsKey(fieldType.typeName)) { | 439 _idl.classes.containsKey(fieldType.typeName)) { |
| 429 String offsetName = 'offset_' + field.name; | 440 String offsetName = 'offset_' + field.name; |
| 430 condition = '$offsetName != null'; | 441 condition = '$offsetName != null'; |
| 431 writeCode = 'fbBuilder.addOffset($index, $offsetName);'; | 442 writeCode = 'fbBuilder.addOffset($index, $offsetName);'; |
| 432 } else if (fieldType.typeName == 'bool') { | 443 } else if (fieldType.typeName == 'bool') { |
| 433 condition = '$valueName == true'; | 444 condition = '$valueName == true'; |
| 434 writeCode = 'fbBuilder.addBool($index, true);'; | 445 writeCode = 'fbBuilder.addBool($index, true);'; |
| 435 } else if (fieldType.typeName == 'int') { | 446 } else if (fieldType.typeName == 'int') { |
| 436 condition += ' && $valueName != ${defaultValue(fieldType)}'; | 447 condition += ' && $valueName != ${defaultValue(fieldType, true)}'; |
| 437 writeCode = 'fbBuilder.addUint32($index, $valueName);'; | 448 writeCode = 'fbBuilder.addUint32($index, $valueName);'; |
| 438 } else if (_idl.enums.containsKey(fieldType.typeName)) { | 449 } else if (_idl.enums.containsKey(fieldType.typeName)) { |
| 439 condition += ' && $valueName != ${defaultValue(fieldType)}'; | 450 condition += ' && $valueName != ${defaultValue(fieldType, true)}'; |
| 440 writeCode = 'fbBuilder.addUint32($index, $valueName.index);'; | 451 writeCode = 'fbBuilder.addUint32($index, $valueName.index);'; |
| 441 } | 452 } |
| 442 if (writeCode == null) { | 453 if (writeCode == null) { |
| 443 throw new UnimplementedError('Writing type ${fieldType.typeName}'); | 454 throw new UnimplementedError('Writing type ${fieldType.typeName}'); |
| 444 } | 455 } |
| 445 out('if ($condition) {'); | 456 out('if ($condition) {'); |
| 446 indent(() { | 457 indent(() { |
| 447 out(writeCode); | 458 out(writeCode); |
| 448 }); | 459 }); |
| 449 out('}'); | 460 out('}'); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 504 String fieldName = field.name; | 515 String fieldName = field.name; |
| 505 out('$returnType _$fieldName;'); | 516 out('$returnType _$fieldName;'); |
| 506 } | 517 } |
| 507 // Write getters. | 518 // Write getters. |
| 508 cls.fields.asMap().forEach((index, field) { | 519 cls.fields.asMap().forEach((index, field) { |
| 509 String fieldName = field.name; | 520 String fieldName = field.name; |
| 510 idlModel.FieldType type = field.type; | 521 idlModel.FieldType type = field.type; |
| 511 String typeName = type.typeName; | 522 String typeName = type.typeName; |
| 512 // Prepare "readCode" + "def" | 523 // Prepare "readCode" + "def" |
| 513 String readCode; | 524 String readCode; |
| 514 String def = defaultValue(type); | 525 String def = defaultValue(type, false); |
| 515 if (type.isList) { | 526 if (type.isList) { |
| 516 if (typeName == 'int') { | 527 if (typeName == 'int') { |
| 517 String itemCode = 'const fb.Uint32Reader()'; | 528 String itemCode = 'const fb.Uint32Reader()'; |
| 518 readCode = 'const fb.ListReader<int>($itemCode)'; | 529 readCode = 'const fb.ListReader<int>($itemCode)'; |
| 519 } else if (typeName == 'double') { | 530 } else if (typeName == 'double') { |
| 520 readCode = 'const fb.Float64ListReader()'; | 531 readCode = 'const fb.Float64ListReader()'; |
| 521 } else if (typeName == 'String') { | 532 } else if (typeName == 'String') { |
| 522 String itemCode = 'const fb.StringReader()'; | 533 String itemCode = 'const fb.StringReader()'; |
| 523 readCode = 'const fb.ListReader<String>($itemCode)'; | 534 readCode = 'const fb.ListReader<String>($itemCode)'; |
| 524 } else if (_idl.classes.containsKey(typeName)) { | 535 } else if (_idl.classes.containsKey(typeName)) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 630 return token.lexeme.split('\n').map((String line) { | 641 return token.lexeme.split('\n').map((String line) { |
| 631 if (line.startsWith(indent)) { | 642 if (line.startsWith(indent)) { |
| 632 line = line.substring(indent.length); | 643 line = line.substring(indent.length); |
| 633 } | 644 } |
| 634 return line; | 645 return line; |
| 635 }).join('\n'); | 646 }).join('\n'); |
| 636 } | 647 } |
| 637 return null; | 648 return null; |
| 638 } | 649 } |
| 639 } | 650 } |
| OLD | NEW |