OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 library serialization.summarize_ast; | 5 library serialization.summarize_ast; |
6 | 6 |
7 import 'package:analyzer/dart/ast/ast.dart'; | 7 import 'package:analyzer/dart/ast/ast.dart'; |
8 import 'package:analyzer/dart/ast/token.dart'; | 8 import 'package:analyzer/dart/ast/token.dart'; |
9 import 'package:analyzer/dart/ast/visitor.dart'; | 9 import 'package:analyzer/dart/ast/visitor.dart'; |
10 import 'package:analyzer/dart/element/type.dart' show DartType; | 10 import 'package:analyzer/dart/element/type.dart' show DartType; |
(...skipping 606 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 bool isSetter, | 617 bool isSetter, |
618 TypeName returnType, | 618 TypeName returnType, |
619 FormalParameterList formalParameters, | 619 FormalParameterList formalParameters, |
620 FunctionBody body, | 620 FunctionBody body, |
621 bool isTopLevel, | 621 bool isTopLevel, |
622 bool isDeclaredStatic, | 622 bool isDeclaredStatic, |
623 Comment documentationComment, | 623 Comment documentationComment, |
624 NodeList<Annotation> annotations, | 624 NodeList<Annotation> annotations, |
625 TypeParameterList typeParameters, | 625 TypeParameterList typeParameters, |
626 bool isExternal, | 626 bool isExternal, |
627 bool serializeBodyExpr) { | 627 bool serializeBodyExpr, |
| 628 bool serializeBody) { |
628 int oldScopesLength = scopes.length; | 629 int oldScopesLength = scopes.length; |
629 _TypeParameterScope typeParameterScope = new _TypeParameterScope(); | 630 _TypeParameterScope typeParameterScope = new _TypeParameterScope(); |
630 scopes.add(typeParameterScope); | 631 scopes.add(typeParameterScope); |
631 UnlinkedExecutableBuilder b = new UnlinkedExecutableBuilder(); | 632 UnlinkedExecutableBuilder b = new UnlinkedExecutableBuilder(); |
632 String nameString = name; | 633 String nameString = name; |
633 if (isGetter) { | 634 if (isGetter) { |
634 b.kind = UnlinkedExecutableKind.getter; | 635 b.kind = UnlinkedExecutableKind.getter; |
635 } else if (isSetter) { | 636 } else if (isSetter) { |
636 b.kind = UnlinkedExecutableKind.setter; | 637 b.kind = UnlinkedExecutableKind.setter; |
637 nameString = '$nameString='; | 638 nameString = '$nameString='; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 } | 676 } |
676 b.visibleOffset = enclosingBlock?.offset; | 677 b.visibleOffset = enclosingBlock?.offset; |
677 b.visibleLength = enclosingBlock?.length; | 678 b.visibleLength = enclosingBlock?.length; |
678 Set<String> oldParameterNames = _parameterNames; | 679 Set<String> oldParameterNames = _parameterNames; |
679 if (formalParameters != null && formalParameters.parameters.isNotEmpty) { | 680 if (formalParameters != null && formalParameters.parameters.isNotEmpty) { |
680 _parameterNames = | 681 _parameterNames = |
681 _parameterNames == null ? new Set<String>() : _parameterNames.toSet(); | 682 _parameterNames == null ? new Set<String>() : _parameterNames.toSet(); |
682 _parameterNames.addAll(formalParameters.parameters | 683 _parameterNames.addAll(formalParameters.parameters |
683 .map((FormalParameter p) => p.identifier.name)); | 684 .map((FormalParameter p) => p.identifier.name)); |
684 } | 685 } |
685 serializeFunctionBody(b, null, body, serializeBodyExpr); | 686 serializeFunctionBody(b, null, body, serializeBodyExpr, serializeBody); |
686 _parameterNames = oldParameterNames; | 687 _parameterNames = oldParameterNames; |
687 scopes.removeLast(); | 688 scopes.removeLast(); |
688 assert(scopes.length == oldScopesLength); | 689 assert(scopes.length == oldScopesLength); |
689 return b; | 690 return b; |
690 } | 691 } |
691 | 692 |
692 /** | 693 /** |
693 * Record local functions and variables into the given executable. The given | 694 * Record local functions and variables into the given executable. The given |
694 * [body] is usually an actual [FunctionBody], but may be an [Expression] | 695 * [body] is usually an actual [FunctionBody], but may be an [Expression] |
695 * when we process a synthetic variable initializer function. | 696 * when we process a synthetic variable initializer function. |
696 * | 697 * |
697 * If [initializers] is non-`null`, closures occurring inside the initializers | 698 * If [initializers] is non-`null`, closures occurring inside the initializers |
698 * are serialized first. | 699 * are serialized first. |
699 * | 700 * |
700 * If [serializeBodyExpr] is `true`, then the function definition is stored | 701 * If [serializeBodyExpr] is `true`, then the function definition is stored |
701 * in [UnlinkedExecutableBuilder.bodyExpr], and closures occurring inside | 702 * in [UnlinkedExecutableBuilder.bodyExpr], and closures occurring inside |
702 * [initializers] and [body] have their function bodies serialized as well. | 703 * [initializers] and [body] have their function bodies serialized as well. |
703 * | 704 * |
704 * The return value is a map whose keys are the offsets of local function | 705 * The return value is a map whose keys are the offsets of local function |
705 * nodes representing closures inside [initializers] and [body], and whose | 706 * nodes representing closures inside [initializers] and [body], and whose |
706 * values are the indices of those local functions relative to their siblings. | 707 * values are the indices of those local functions relative to their siblings. |
707 */ | 708 */ |
708 Map<int, int> serializeFunctionBody( | 709 Map<int, int> serializeFunctionBody( |
709 UnlinkedExecutableBuilder b, | 710 UnlinkedExecutableBuilder b, |
710 List<ConstructorInitializer> initializers, | 711 List<ConstructorInitializer> initializers, |
711 AstNode body, | 712 AstNode body, |
712 bool serializeBodyExpr) { | 713 bool serializeBodyExpr, |
| 714 bool serializeBody) { |
713 if (body is BlockFunctionBody || body is ExpressionFunctionBody) { | 715 if (body is BlockFunctionBody || body is ExpressionFunctionBody) { |
714 for (UnlinkedParamBuilder parameter in b.parameters) { | 716 for (UnlinkedParamBuilder parameter in b.parameters) { |
715 parameter.visibleOffset = body.offset; | 717 parameter.visibleOffset = body.offset; |
716 parameter.visibleLength = body.length; | 718 parameter.visibleLength = body.length; |
717 } | 719 } |
718 } | 720 } |
719 List<UnlinkedExecutableBuilder> oldExecutables = executables; | 721 List<UnlinkedExecutableBuilder> oldExecutables = executables; |
720 List<UnlinkedLabelBuilder> oldLabels = labels; | 722 List<UnlinkedLabelBuilder> oldLabels = labels; |
721 List<UnlinkedVariableBuilder> oldVariables = variables; | 723 List<UnlinkedVariableBuilder> oldVariables = variables; |
722 Map<int, int> oldLocalClosureIndexMap = _localClosureIndexMap; | 724 Map<int, int> oldLocalClosureIndexMap = _localClosureIndexMap; |
723 bool oldSerializeClosureBodyExprs = _serializeClosureBodyExprs; | 725 bool oldSerializeClosureBodyExprs = _serializeClosureBodyExprs; |
724 executables = <UnlinkedExecutableBuilder>[]; | 726 executables = <UnlinkedExecutableBuilder>[]; |
725 labels = <UnlinkedLabelBuilder>[]; | 727 labels = <UnlinkedLabelBuilder>[]; |
726 variables = <UnlinkedVariableBuilder>[]; | 728 variables = <UnlinkedVariableBuilder>[]; |
727 _localClosureIndexMap = <int, int>{}; | 729 _localClosureIndexMap = <int, int>{}; |
728 _serializeClosureBodyExprs = serializeBodyExpr; | 730 _serializeClosureBodyExprs = serializeBodyExpr; |
729 if (initializers != null) { | 731 if (initializers != null) { |
730 for (ConstructorInitializer initializer in initializers) { | 732 for (ConstructorInitializer initializer in initializers) { |
731 initializer.accept(this); | 733 initializer.accept(this); |
732 } | 734 } |
733 } | 735 } |
734 body.accept(this); | 736 if (serializeBody) { |
| 737 body.accept(this); |
| 738 } |
735 if (serializeBodyExpr) { | 739 if (serializeBodyExpr) { |
736 if (body is Expression) { | 740 if (body is Expression) { |
737 b.bodyExpr = | 741 b.bodyExpr = |
738 serializeConstExpr(_localClosureIndexMap, body, _parameterNames); | 742 serializeConstExpr(_localClosureIndexMap, body, _parameterNames); |
739 } else if (body is ExpressionFunctionBody) { | 743 } else if (body is ExpressionFunctionBody) { |
740 b.bodyExpr = serializeConstExpr( | 744 b.bodyExpr = serializeConstExpr( |
741 _localClosureIndexMap, body.expression, _parameterNames); | 745 _localClosureIndexMap, body.expression, _parameterNames); |
742 } else { | 746 } else { |
743 // TODO(paulberry): serialize other types of function bodies. | 747 // TODO(paulberry): serialize other types of function bodies. |
744 } | 748 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
780 * If [serializeBodyExpr] is `true`, then the initializer expression is stored | 784 * If [serializeBodyExpr] is `true`, then the initializer expression is stored |
781 * in [UnlinkedExecutableBuilder.bodyExpr]. | 785 * in [UnlinkedExecutableBuilder.bodyExpr]. |
782 */ | 786 */ |
783 UnlinkedExecutableBuilder serializeInitializerFunction( | 787 UnlinkedExecutableBuilder serializeInitializerFunction( |
784 Expression expression, bool serializeBodyExpr) { | 788 Expression expression, bool serializeBodyExpr) { |
785 if (expression == null) { | 789 if (expression == null) { |
786 return null; | 790 return null; |
787 } | 791 } |
788 UnlinkedExecutableBuilder initializer = | 792 UnlinkedExecutableBuilder initializer = |
789 new UnlinkedExecutableBuilder(nameOffset: expression.offset); | 793 new UnlinkedExecutableBuilder(nameOffset: expression.offset); |
790 serializeFunctionBody(initializer, null, expression, serializeBodyExpr); | 794 serializeFunctionBody( |
| 795 initializer, null, expression, serializeBodyExpr, true); |
791 initializer.inferredReturnTypeSlot = assignSlot(); | 796 initializer.inferredReturnTypeSlot = assignSlot(); |
792 return initializer; | 797 return initializer; |
793 } | 798 } |
794 | 799 |
795 /** | 800 /** |
796 * Serialize a [FieldFormalParameter], [FunctionTypedFormalParameter], or | 801 * Serialize a [FieldFormalParameter], [FunctionTypedFormalParameter], or |
797 * [SimpleFormalParameter] into an [UnlinkedParam]. | 802 * [SimpleFormalParameter] into an [UnlinkedParam]. |
798 */ | 803 */ |
799 UnlinkedParamBuilder serializeParameter(NormalFormalParameter node) { | 804 UnlinkedParamBuilder serializeParameter(NormalFormalParameter node) { |
800 UnlinkedParamBuilder b = new UnlinkedParamBuilder(); | 805 UnlinkedParamBuilder b = new UnlinkedParamBuilder(); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1089 } | 1094 } |
1090 if (node.constKeyword != null) { | 1095 if (node.constKeyword != null) { |
1091 b.isConst = true; | 1096 b.isConst = true; |
1092 b.constCycleSlot = assignSlot(); | 1097 b.constCycleSlot = assignSlot(); |
1093 } | 1098 } |
1094 b.isExternal = node.externalKeyword != null; | 1099 b.isExternal = node.externalKeyword != null; |
1095 b.documentationComment = serializeDocumentation(node.documentationComment); | 1100 b.documentationComment = serializeDocumentation(node.documentationComment); |
1096 b.annotations = serializeAnnotations(node.metadata); | 1101 b.annotations = serializeAnnotations(node.metadata); |
1097 b.codeRange = serializeCodeRange(node); | 1102 b.codeRange = serializeCodeRange(node); |
1098 Map<int, int> localClosureIndexMap = serializeFunctionBody( | 1103 Map<int, int> localClosureIndexMap = serializeFunctionBody( |
1099 b, node.initializers, node.body, node.constKeyword != null); | 1104 b, node.initializers, node.body, node.constKeyword != null, false); |
1100 if (node.constKeyword != null) { | 1105 if (node.constKeyword != null) { |
1101 Set<String> constructorParameterNames = | 1106 Set<String> constructorParameterNames = |
1102 node.parameters.parameters.map((p) => p.identifier.name).toSet(); | 1107 node.parameters.parameters.map((p) => p.identifier.name).toSet(); |
1103 b.constantInitializers = node.initializers | 1108 b.constantInitializers = node.initializers |
1104 .map((ConstructorInitializer initializer) => | 1109 .map((ConstructorInitializer initializer) => |
1105 serializeConstructorInitializer(initializer, (Expression expr) { | 1110 serializeConstructorInitializer(initializer, (Expression expr) { |
1106 return serializeConstExpr( | 1111 return serializeConstExpr( |
1107 localClosureIndexMap, expr, constructorParameterNames); | 1112 localClosureIndexMap, expr, constructorParameterNames); |
1108 })) | 1113 })) |
1109 .toList(); | 1114 .toList(); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1207 node.isSetter, | 1212 node.isSetter, |
1208 node.returnType, | 1213 node.returnType, |
1209 node.functionExpression.parameters, | 1214 node.functionExpression.parameters, |
1210 node.functionExpression.body, | 1215 node.functionExpression.body, |
1211 true, | 1216 true, |
1212 false, | 1217 false, |
1213 node.documentationComment, | 1218 node.documentationComment, |
1214 node.metadata, | 1219 node.metadata, |
1215 node.functionExpression.typeParameters, | 1220 node.functionExpression.typeParameters, |
1216 node.externalKeyword != null, | 1221 node.externalKeyword != null, |
1217 false)); | 1222 false, |
| 1223 node.parent is FunctionDeclarationStatement)); |
1218 } | 1224 } |
1219 | 1225 |
1220 @override | 1226 @override |
1221 void visitFunctionExpression(FunctionExpression node) { | 1227 void visitFunctionExpression(FunctionExpression node) { |
1222 if (node.parent is! FunctionDeclaration) { | 1228 if (node.parent is! FunctionDeclaration) { |
1223 if (_localClosureIndexMap != null) { | 1229 if (_localClosureIndexMap != null) { |
1224 _localClosureIndexMap[node.offset] = executables.length; | 1230 _localClosureIndexMap[node.offset] = executables.length; |
1225 } | 1231 } |
1226 executables.add(serializeExecutable( | 1232 executables.add(serializeExecutable( |
1227 node, | 1233 node, |
1228 null, | 1234 null, |
1229 node.offset, | 1235 node.offset, |
1230 false, | 1236 false, |
1231 false, | 1237 false, |
1232 null, | 1238 null, |
1233 node.parameters, | 1239 node.parameters, |
1234 node.body, | 1240 node.body, |
1235 false, | 1241 false, |
1236 false, | 1242 false, |
1237 null, | 1243 null, |
1238 null, | 1244 null, |
1239 node.typeParameters, | 1245 node.typeParameters, |
1240 false, | 1246 false, |
1241 _serializeClosureBodyExprs)); | 1247 _serializeClosureBodyExprs, |
| 1248 true)); |
1242 } | 1249 } |
1243 } | 1250 } |
1244 | 1251 |
1245 @override | 1252 @override |
1246 void visitFunctionTypeAlias(FunctionTypeAlias node) { | 1253 void visitFunctionTypeAlias(FunctionTypeAlias node) { |
1247 int oldScopesLength = scopes.length; | 1254 int oldScopesLength = scopes.length; |
1248 _TypeParameterScope typeParameterScope = new _TypeParameterScope(); | 1255 _TypeParameterScope typeParameterScope = new _TypeParameterScope(); |
1249 scopes.add(typeParameterScope); | 1256 scopes.add(typeParameterScope); |
1250 UnlinkedTypedefBuilder b = new UnlinkedTypedefBuilder(); | 1257 UnlinkedTypedefBuilder b = new UnlinkedTypedefBuilder(); |
1251 b.name = node.name.name; | 1258 b.name = node.name.name; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1332 node.isSetter, | 1339 node.isSetter, |
1333 node.returnType, | 1340 node.returnType, |
1334 node.parameters, | 1341 node.parameters, |
1335 node.body, | 1342 node.body, |
1336 false, | 1343 false, |
1337 node.isStatic, | 1344 node.isStatic, |
1338 node.documentationComment, | 1345 node.documentationComment, |
1339 node.metadata, | 1346 node.metadata, |
1340 node.typeParameters, | 1347 node.typeParameters, |
1341 node.externalKeyword != null, | 1348 node.externalKeyword != null, |
| 1349 false, |
1342 false)); | 1350 false)); |
1343 } | 1351 } |
1344 | 1352 |
1345 @override | 1353 @override |
1346 void visitPartDirective(PartDirective node) { | 1354 void visitPartDirective(PartDirective node) { |
1347 parts.add(new UnlinkedPartBuilder( | 1355 parts.add(new UnlinkedPartBuilder( |
1348 uriOffset: node.uri.offset, | 1356 uriOffset: node.uri.offset, |
1349 uriEnd: node.uri.end, | 1357 uriEnd: node.uri.end, |
1350 annotations: serializeAnnotations(node.metadata))); | 1358 annotations: serializeAnnotations(node.metadata))); |
1351 } | 1359 } |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1409 /** | 1417 /** |
1410 * A [_TypeParameterScope] is a [_Scope] which defines [_ScopedTypeParameter]s. | 1418 * A [_TypeParameterScope] is a [_Scope] which defines [_ScopedTypeParameter]s. |
1411 */ | 1419 */ |
1412 class _TypeParameterScope extends _Scope { | 1420 class _TypeParameterScope extends _Scope { |
1413 /** | 1421 /** |
1414 * Get the number of [_ScopedTypeParameter]s defined in this | 1422 * Get the number of [_ScopedTypeParameter]s defined in this |
1415 * [_TypeParameterScope]. | 1423 * [_TypeParameterScope]. |
1416 */ | 1424 */ |
1417 int get length => _definedNames.length; | 1425 int get length => _definedNames.length; |
1418 } | 1426 } |
OLD | NEW |