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

Side by Side Diff: pkg/analyzer/tool/summary/generate.dart

Issue 1606283003: Modify summary codegen so that builder getters return builders. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Improve behavior of defaults Created 4 years, 11 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 | « pkg/analyzer/lib/src/summary/format.dart ('k') | no next file » | 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 /** 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
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
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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/format.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698