| 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 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 if (fieldType.isList) { | 611 if (fieldType.isList) { |
| 612 out('$valueName?.forEach((b) => b.flushInformative());'); | 612 out('$valueName?.forEach((b) => b.flushInformative());'); |
| 613 } else { | 613 } else { |
| 614 out('$valueName?.flushInformative();'); | 614 out('$valueName?.flushInformative();'); |
| 615 } | 615 } |
| 616 } | 616 } |
| 617 } | 617 } |
| 618 }); | 618 }); |
| 619 out('}'); | 619 out('}'); |
| 620 } | 620 } |
| 621 // Generate collectApiSignature(). |
| 622 { |
| 623 out(); |
| 624 out('/**'); |
| 625 out(' * Accumulate non-[informative] data into [signature].'); |
| 626 out(' */'); |
| 627 out('void collectApiSignature(fb.ApiSignature signature) {'); |
| 628 indent(() { |
| 629 List<idlModel.FieldDeclaration> sortedFields = cls.fields.toList() |
| 630 ..sort((idlModel.FieldDeclaration a, idlModel.FieldDeclaration b) => |
| 631 a.id.compareTo(b.id)); |
| 632 for (idlModel.FieldDeclaration field in sortedFields) { |
| 633 if (field.isInformative) { |
| 634 continue; |
| 635 } |
| 636 String ref = 'this._${field.name}'; |
| 637 if (field.type.isList) { |
| 638 out('if ($ref == null) {'); |
| 639 indent(() { |
| 640 out('signature.addInt(0);'); |
| 641 }); |
| 642 out('} else {'); |
| 643 indent(() { |
| 644 out('signature.addInt($ref.length);'); |
| 645 out('for (var x in $ref) {'); |
| 646 indent(() { |
| 647 _generateSignatureCall(field.type.typeName, 'x', false); |
| 648 }); |
| 649 out('}'); |
| 650 }); |
| 651 out('}'); |
| 652 } else { |
| 653 _generateSignatureCall(field.type.typeName, ref, true); |
| 654 } |
| 655 } |
| 656 }); |
| 657 out('}'); |
| 658 } |
| 621 // Generate finish. | 659 // Generate finish. |
| 622 if (cls.isTopLevel) { | 660 if (cls.isTopLevel) { |
| 623 out(); | 661 out(); |
| 624 out('List<int> toBuffer() {'); | 662 out('List<int> toBuffer() {'); |
| 625 indent(() { | 663 indent(() { |
| 626 out('fb.Builder fbBuilder = new fb.Builder();'); | 664 out('fb.Builder fbBuilder = new fb.Builder();'); |
| 627 String fileId = cls.fileIdentifier == null | 665 String fileId = cls.fileIdentifier == null |
| 628 ? '' | 666 ? '' |
| 629 : ', ${quoted(cls.fileIdentifier)}'; | 667 : ', ${quoted(cls.fileIdentifier)}'; |
| 630 out('return fbBuilder.finish(finish(fbBuilder)$fileId);'); | 668 out('return fbBuilder.finish(finish(fbBuilder)$fileId);'); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 assert(readCode != null); | 851 assert(readCode != null); |
| 814 // Write the getter implementation. | 852 // Write the getter implementation. |
| 815 out(); | 853 out(); |
| 816 out('@override'); | 854 out('@override'); |
| 817 String returnType = dartType(type); | 855 String returnType = dartType(type); |
| 818 if (field.isDeprecated) { | 856 if (field.isDeprecated) { |
| 819 out('$returnType get $fieldName => $_throwDeprecated;'); | 857 out('$returnType get $fieldName => $_throwDeprecated;'); |
| 820 } else { | 858 } else { |
| 821 out('$returnType get $fieldName {'); | 859 out('$returnType get $fieldName {'); |
| 822 indent(() { | 860 indent(() { |
| 823 String readExpr = '$readCode.vTableGet(_bc, _bcOffset, $index, $def)
'; | 861 String readExpr = |
| 862 '$readCode.vTableGet(_bc, _bcOffset, $index, $def)'; |
| 824 out('_$fieldName ??= $readExpr;'); | 863 out('_$fieldName ??= $readExpr;'); |
| 825 out('return _$fieldName;'); | 864 out('return _$fieldName;'); |
| 826 }); | 865 }); |
| 827 out('}'); | 866 out('}'); |
| 828 } | 867 } |
| 829 } | 868 } |
| 830 }); | 869 }); |
| 831 out('}'); | 870 out('}'); |
| 832 } | 871 } |
| 833 | 872 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 String name = cls.name; | 950 String name = cls.name; |
| 912 out('${idlPrefix(name)} read$name(List<int> buffer) {'); | 951 out('${idlPrefix(name)} read$name(List<int> buffer) {'); |
| 913 indent(() { | 952 indent(() { |
| 914 out('fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);'); | 953 out('fb.BufferContext rootRef = new fb.BufferContext.fromBytes(buffer);'); |
| 915 out('return const _${name}Reader().read(rootRef, 0);'); | 954 out('return const _${name}Reader().read(rootRef, 0);'); |
| 916 }); | 955 }); |
| 917 out('}'); | 956 out('}'); |
| 918 } | 957 } |
| 919 | 958 |
| 920 /** | 959 /** |
| 960 * Generate a call to the appropriate method of [ApiSignature] for the type |
| 961 * [typeName], using the data named by [ref]. If [couldBeNull] is `true`, |
| 962 * generate code to handle the possibility that [ref] is `null` (substituting |
| 963 * in the appropriate default value). |
| 964 */ |
| 965 void _generateSignatureCall(String typeName, String ref, bool couldBeNull) { |
| 966 if (_idl.enums.containsKey(typeName)) { |
| 967 if (couldBeNull) { |
| 968 out('signature.addInt($ref == null ? 0 : $ref.index);'); |
| 969 } else { |
| 970 out('signature.addInt($ref.index);'); |
| 971 } |
| 972 } else if (_idl.classes.containsKey(typeName)) { |
| 973 if (couldBeNull) { |
| 974 out('signature.addBool($ref != null);'); |
| 975 } |
| 976 out('$ref?.collectApiSignature(signature);'); |
| 977 } else { |
| 978 switch (typeName) { |
| 979 case 'String': |
| 980 if (couldBeNull) { |
| 981 ref += " ?? ''"; |
| 982 } |
| 983 out("signature.addString($ref);"); |
| 984 break; |
| 985 case 'int': |
| 986 if (couldBeNull) { |
| 987 ref += ' ?? 0'; |
| 988 } |
| 989 out('signature.addInt($ref);'); |
| 990 break; |
| 991 case 'bool': |
| 992 if (couldBeNull) { |
| 993 ref += ' == true'; |
| 994 } |
| 995 out('signature.addBool($ref);'); |
| 996 break; |
| 997 case 'double': |
| 998 if (couldBeNull) { |
| 999 ref += ' ?? 0.0'; |
| 1000 } |
| 1001 out('signature.addDouble($ref);'); |
| 1002 break; |
| 1003 default: |
| 1004 throw "Don't know how to generate signature call for $typeName"; |
| 1005 } |
| 1006 } |
| 1007 } |
| 1008 |
| 1009 /** |
| 921 * Return the documentation text of the given [node], or `null` if the [node] | 1010 * Return the documentation text of the given [node], or `null` if the [node] |
| 922 * does not have a comment. Each line is `\n` separated. | 1011 * does not have a comment. Each line is `\n` separated. |
| 923 */ | 1012 */ |
| 924 String _getNodeDoc(LineInfo lineInfo, AnnotatedNode node) { | 1013 String _getNodeDoc(LineInfo lineInfo, AnnotatedNode node) { |
| 925 Comment comment = node.documentationComment; | 1014 Comment comment = node.documentationComment; |
| 926 if (comment != null && | 1015 if (comment != null && |
| 927 comment.isDocumentation && | 1016 comment.isDocumentation && |
| 928 comment.tokens.length == 1 && | 1017 comment.tokens.length == 1 && |
| 929 comment.tokens.first.type == TokenType.MULTI_LINE_COMMENT) { | 1018 comment.tokens.first.type == TokenType.MULTI_LINE_COMMENT) { |
| 930 Token token = comment.tokens.first; | 1019 Token token = comment.tokens.first; |
| 931 int column = lineInfo.getLocation(token.offset).columnNumber; | 1020 int column = lineInfo.getLocation(token.offset).columnNumber; |
| 932 String indent = ' ' * (column - 1); | 1021 String indent = ' ' * (column - 1); |
| 933 return token.lexeme.split('\n').map((String line) { | 1022 return token.lexeme.split('\n').map((String line) { |
| 934 if (line.startsWith(indent)) { | 1023 if (line.startsWith(indent)) { |
| 935 line = line.substring(indent.length); | 1024 line = line.substring(indent.length); |
| 936 } | 1025 } |
| 937 return line; | 1026 return line; |
| 938 }).join('\n'); | 1027 }).join('\n'); |
| 939 } | 1028 } |
| 940 return null; | 1029 return null; |
| 941 } | 1030 } |
| 942 } | 1031 } |
| OLD | NEW |