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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 type.typeArguments != null && | 276 type.typeArguments != null && |
277 type.typeArguments.arguments.length == 1) { | 277 type.typeArguments.arguments.length == 1) { |
278 isList = true; | 278 isList = true; |
279 type = type.typeArguments.arguments[0]; | 279 type = type.typeArguments.arguments[0]; |
280 } | 280 } |
281 if (type.typeArguments != null) { | 281 if (type.typeArguments != null) { |
282 throw new Exception('Cannot handle type arguments in `$type`'); | 282 throw new Exception('Cannot handle type arguments in `$type`'); |
283 } | 283 } |
284 int id; | 284 int id; |
285 bool isDeprecated = false; | 285 bool isDeprecated = false; |
| 286 bool isInformative = false; |
286 for (Annotation annotation in classMember.metadata) { | 287 for (Annotation annotation in classMember.metadata) { |
287 if (annotation.name.name == 'Id') { | 288 if (annotation.name.name == 'Id') { |
288 if (id != null) { | 289 if (id != null) { |
289 throw new Exception( | 290 throw new Exception( |
290 'Duplicate @id annotation ($classMember)'); | 291 'Duplicate @id annotation ($classMember)'); |
291 } | 292 } |
292 if (annotation.arguments.arguments.length != 1) { | 293 if (annotation.arguments.arguments.length != 1) { |
293 throw new Exception( | 294 throw new Exception( |
294 '@Id must be passed exactly one argument ($desc)'); | 295 '@Id must be passed exactly one argument ($desc)'); |
295 } | 296 } |
296 Expression expression = annotation.arguments.arguments[0]; | 297 Expression expression = annotation.arguments.arguments[0]; |
297 if (expression is IntegerLiteral) { | 298 if (expression is IntegerLiteral) { |
298 id = expression.value; | 299 id = expression.value; |
299 } else { | 300 } else { |
300 throw new Exception( | 301 throw new Exception( |
301 '@Id parameter must be an integer literal ($desc)'); | 302 '@Id parameter must be an integer literal ($desc)'); |
302 } | 303 } |
303 } else if (annotation.name.name == 'deprecated') { | 304 } else if (annotation.name.name == 'deprecated') { |
304 if (annotation.arguments != null) { | 305 if (annotation.arguments != null) { |
305 throw new Exception('@deprecated does not take args ($desc)'); | 306 throw new Exception('@deprecated does not take args ($desc)'); |
306 } | 307 } |
307 isDeprecated = true; | 308 isDeprecated = true; |
| 309 } else if (annotation.name.name == 'informative') { |
| 310 isInformative = true; |
308 } | 311 } |
309 } | 312 } |
310 if (id == null) { | 313 if (id == null) { |
311 throw new Exception('Missing @id annotation ($desc)'); | 314 throw new Exception('Missing @id annotation ($desc)'); |
312 } | 315 } |
313 String doc = _getNodeDoc(lineInfo, classMember); | 316 String doc = _getNodeDoc(lineInfo, classMember); |
314 idlModel.FieldType fieldType = | 317 idlModel.FieldType fieldType = |
315 new idlModel.FieldType(type.name.name, isList); | 318 new idlModel.FieldType(type.name.name, isList); |
316 cls.allFields.add(new idlModel.FieldDeclaration( | 319 cls.allFields.add(new idlModel.FieldDeclaration( |
317 doc, classMember.name.name, fieldType, id, isDeprecated)); | 320 doc, |
| 321 classMember.name.name, |
| 322 fieldType, |
| 323 id, |
| 324 isDeprecated, |
| 325 isInformative)); |
318 } else if (classMember is ConstructorDeclaration && | 326 } else if (classMember is ConstructorDeclaration && |
319 classMember.name.name == 'fromBuffer') { | 327 classMember.name.name == 'fromBuffer') { |
320 // Ignore `fromBuffer` declarations; they simply forward to the | 328 // Ignore `fromBuffer` declarations; they simply forward to the |
321 // read functions generated by [_generateReadFunction]. | 329 // read functions generated by [_generateReadFunction]. |
322 } else { | 330 } else { |
323 throw new Exception('Unexpected class member `$classMember`'); | 331 throw new Exception('Unexpected class member `$classMember`'); |
324 } | 332 } |
325 } | 333 } |
326 } else if (decl is EnumDeclaration) { | 334 } else if (decl is EnumDeclaration) { |
327 String doc = _getNodeDoc(lineInfo, decl); | 335 String doc = _getNodeDoc(lineInfo, decl); |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
582 // Generate constructor. | 590 // Generate constructor. |
583 out(); | 591 out(); |
584 out('$builderName({${constructorParams.join(', ')}})'); | 592 out('$builderName({${constructorParams.join(', ')}})'); |
585 List<idlModel.FieldDeclaration> fields = cls.fields.toList(); | 593 List<idlModel.FieldDeclaration> fields = cls.fields.toList(); |
586 for (int i = 0; i < fields.length; i++) { | 594 for (int i = 0; i < fields.length; i++) { |
587 idlModel.FieldDeclaration field = fields[i]; | 595 idlModel.FieldDeclaration field = fields[i]; |
588 String prefix = i == 0 ? ' : ' : ' '; | 596 String prefix = i == 0 ? ' : ' : ' '; |
589 String suffix = i == fields.length - 1 ? ';' : ','; | 597 String suffix = i == fields.length - 1 ? ';' : ','; |
590 out('${prefix}_${field.name} = ${field.name}$suffix'); | 598 out('${prefix}_${field.name} = ${field.name}$suffix'); |
591 } | 599 } |
| 600 // Generate flushInformative(). |
| 601 { |
| 602 out(); |
| 603 out('/**'); |
| 604 out(' * Flush [informative] data recursively.'); |
| 605 out(' */'); |
| 606 out('void flushInformative() {'); |
| 607 indent(() { |
| 608 for (idlModel.FieldDeclaration field in cls.fields) { |
| 609 idlModel.FieldType fieldType = field.type; |
| 610 String valueName = '_' + field.name; |
| 611 if (field.isInformative) { |
| 612 out('$valueName = null;'); |
| 613 } else if (_idl.classes.containsKey(fieldType.typeName)) { |
| 614 if (fieldType.isList) { |
| 615 out('$valueName?.forEach((b) => b.flushInformative());'); |
| 616 } else { |
| 617 out('$valueName?.flushInformative();'); |
| 618 } |
| 619 } |
| 620 } |
| 621 }); |
| 622 out('}'); |
| 623 } |
592 // Generate finish. | 624 // Generate finish. |
593 if (cls.isTopLevel) { | 625 if (cls.isTopLevel) { |
594 out(); | 626 out(); |
595 out('List<int> toBuffer() {'); | 627 out('List<int> toBuffer() {'); |
596 indent(() { | 628 indent(() { |
597 out('fb.Builder fbBuilder = new fb.Builder();'); | 629 out('fb.Builder fbBuilder = new fb.Builder();'); |
598 String fileId = cls.fileIdentifier == null | 630 String fileId = cls.fileIdentifier == null |
599 ? '' | 631 ? '' |
600 : ', ${quoted(cls.fileIdentifier)}'; | 632 : ', ${quoted(cls.fileIdentifier)}'; |
601 out('return fbBuilder.finish(finish(fbBuilder)$fileId);'); | 633 out('return fbBuilder.finish(finish(fbBuilder)$fileId);'); |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
905 return token.lexeme.split('\n').map((String line) { | 937 return token.lexeme.split('\n').map((String line) { |
906 if (line.startsWith(indent)) { | 938 if (line.startsWith(indent)) { |
907 line = line.substring(indent.length); | 939 line = line.substring(indent.length); |
908 } | 940 } |
909 return line; | 941 return line; |
910 }).join('\n'); | 942 }).join('\n'); |
911 } | 943 } |
912 return null; | 944 return null; |
913 } | 945 } |
914 } | 946 } |
OLD | NEW |