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

Side by Side Diff: pkg/analyzer/lib/src/summary/summarize_ast.dart

Issue 2013093002: Summarize references to closure parameters properly. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 6 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
OLDNEW
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 19 matching lines...) Expand all
30 30
31 /** 31 /**
32 * If the expression being serialized can contain closures, map whose 32 * If the expression being serialized can contain closures, map whose
33 * keys are the offsets of local function nodes representing those closures, 33 * keys are the offsets of local function nodes representing those closures,
34 * and whose values are indices of those local functions relative to their 34 * and whose values are indices of those local functions relative to their
35 * siblings. 35 * siblings.
36 */ 36 */
37 final Map<int, int> localClosureIndexMap; 37 final Map<int, int> localClosureIndexMap;
38 38
39 /** 39 /**
40 * If a constructor initializer expression is being serialized, the names of 40 * If the expression being serialize appears inside a function body, the names
scheglov 2016/05/26 16:59:33 "being serialized"?
Paul Berry 2016/05/26 17:04:23 Fixed, thanks.
41 * the constructor parameters. Otherwise `null`. 41 * of parameters that are in scope. Otherwise `null`.
42 */ 42 */
43 final Set<String> constructorParameterNames; 43 final Set<String> parameterNames;
44 44
45 _ConstExprSerializer( 45 _ConstExprSerializer(
46 this.visitor, this.localClosureIndexMap, this.constructorParameterNames); 46 this.visitor, this.localClosureIndexMap, this.parameterNames);
47 47
48 @override 48 @override
49 bool isConstructorParameterName(String name) { 49 bool isParameterName(String name) {
50 return constructorParameterNames?.contains(name) ?? false; 50 return parameterNames?.contains(name) ?? false;
51 } 51 }
52 52
53 @override 53 @override
54 void serializeAnnotation(Annotation annotation) { 54 void serializeAnnotation(Annotation annotation) {
55 if (annotation.arguments == null) { 55 if (annotation.arguments == null) {
56 assert(annotation.constructorName == null); 56 assert(annotation.constructorName == null);
57 serialize(annotation.name); 57 serialize(annotation.name);
58 } else { 58 } else {
59 Identifier name = annotation.name; 59 Identifier name = annotation.name;
60 EntityRefBuilder constructor; 60 EntityRefBuilder constructor;
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 Map<int, int> _localClosureIndexMap; 346 Map<int, int> _localClosureIndexMap;
347 347
348 /** 348 /**
349 * Indicates whether closure function bodies should be serialized. This flag 349 * Indicates whether closure function bodies should be serialized. This flag
350 * is set while visiting the bodies of initializer expressions that will be 350 * is set while visiting the bodies of initializer expressions that will be
351 * needed by type inference. 351 * needed by type inference.
352 */ 352 */
353 bool _serializeClosureBodyExprs = false; 353 bool _serializeClosureBodyExprs = false;
354 354
355 /** 355 /**
356 * If a closure function body is being serialized, the set of closure
357 * parameter names which are currently in scope. Otherwise `null`.
358 */
359 Set<String> _parameterNames;
360
361 /**
356 * Create a slot id for storing a propagated or inferred type or const cycle 362 * Create a slot id for storing a propagated or inferred type or const cycle
357 * info. 363 * info.
358 */ 364 */
359 int assignSlot() => ++numSlots; 365 int assignSlot() => ++numSlots;
360 366
361 /** 367 /**
362 * Build a [_Scope] object containing the names defined within the body of a 368 * Build a [_Scope] object containing the names defined within the body of a
363 * class declaration. 369 * class declaration.
364 */ 370 */
365 _Scope buildClassMemberScope( 371 _Scope buildClassMemberScope(
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
522 b.variables = variables; 528 b.variables = variables;
523 b.publicNamespace = computePublicNamespace(compilationUnit); 529 b.publicNamespace = computePublicNamespace(compilationUnit);
524 return b; 530 return b;
525 } 531 }
526 532
527 /** 533 /**
528 * Serialize the given [expression], creating an [UnlinkedConstBuilder]. 534 * Serialize the given [expression], creating an [UnlinkedConstBuilder].
529 */ 535 */
530 UnlinkedConstBuilder serializeConstExpr( 536 UnlinkedConstBuilder serializeConstExpr(
531 Map<int, int> localClosureIndexMap, Expression expression, 537 Map<int, int> localClosureIndexMap, Expression expression,
532 [Set<String> constructorParameterNames]) { 538 [Set<String> parameterNames]) {
533 _ConstExprSerializer serializer = new _ConstExprSerializer( 539 _ConstExprSerializer serializer =
534 this, localClosureIndexMap, constructorParameterNames); 540 new _ConstExprSerializer(this, localClosureIndexMap, parameterNames);
535 serializer.serialize(expression); 541 serializer.serialize(expression);
536 return serializer.toBuilder(); 542 return serializer.toBuilder();
537 } 543 }
538 544
539 /** 545 /**
540 * Serialize the given [declaredIdentifier] into [UnlinkedVariable], and 546 * Serialize the given [declaredIdentifier] into [UnlinkedVariable], and
541 * store it in [variables]. 547 * store it in [variables].
542 */ 548 */
543 void serializeDeclaredIdentifier( 549 void serializeDeclaredIdentifier(
544 AstNode scopeNode, 550 AstNode scopeNode,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 } 653 }
648 } 654 }
649 b.documentationComment = serializeDocumentation(documentationComment); 655 b.documentationComment = serializeDocumentation(documentationComment);
650 b.annotations = serializeAnnotations(annotations); 656 b.annotations = serializeAnnotations(annotations);
651 b.codeRange = serializeCodeRange(node); 657 b.codeRange = serializeCodeRange(node);
652 if (returnType == null && !isSemanticallyStatic) { 658 if (returnType == null && !isSemanticallyStatic) {
653 b.inferredReturnTypeSlot = assignSlot(); 659 b.inferredReturnTypeSlot = assignSlot();
654 } 660 }
655 b.visibleOffset = enclosingBlock?.offset; 661 b.visibleOffset = enclosingBlock?.offset;
656 b.visibleLength = enclosingBlock?.length; 662 b.visibleLength = enclosingBlock?.length;
663 Set<String> oldParameterNames = _parameterNames;
664 if (formalParameters != null && formalParameters.parameters.isNotEmpty) {
665 _parameterNames =
666 _parameterNames == null ? new Set<String>() : _parameterNames.toSet();
667 _parameterNames.addAll(formalParameters.parameters
668 .map((FormalParameter p) => p.identifier.name));
669 }
657 serializeFunctionBody(b, null, body, serializeBodyExpr); 670 serializeFunctionBody(b, null, body, serializeBodyExpr);
671 _parameterNames = oldParameterNames;
658 scopes.removeLast(); 672 scopes.removeLast();
659 assert(scopes.length == oldScopesLength); 673 assert(scopes.length == oldScopesLength);
660 return b; 674 return b;
661 } 675 }
662 676
663 /** 677 /**
664 * Record local functions and variables into the given executable. The given 678 * Record local functions and variables into the given executable. The given
665 * [body] is usually an actual [FunctionBody], but may be an [Expression] 679 * [body] is usually an actual [FunctionBody], but may be an [Expression]
666 * when we process a synthetic variable initializer function. 680 * when we process a synthetic variable initializer function.
667 * 681 *
(...skipping 30 matching lines...) Expand all
698 _localClosureIndexMap = <int, int>{}; 712 _localClosureIndexMap = <int, int>{};
699 _serializeClosureBodyExprs = serializeBodyExpr; 713 _serializeClosureBodyExprs = serializeBodyExpr;
700 if (initializers != null) { 714 if (initializers != null) {
701 for (ConstructorInitializer initializer in initializers) { 715 for (ConstructorInitializer initializer in initializers) {
702 initializer.accept(this); 716 initializer.accept(this);
703 } 717 }
704 } 718 }
705 body.accept(this); 719 body.accept(this);
706 if (serializeBodyExpr) { 720 if (serializeBodyExpr) {
707 if (body is Expression) { 721 if (body is Expression) {
708 b.bodyExpr = serializeConstExpr(_localClosureIndexMap, body); 722 b.bodyExpr =
723 serializeConstExpr(_localClosureIndexMap, body, _parameterNames);
709 } else if (body is ExpressionFunctionBody) { 724 } else if (body is ExpressionFunctionBody) {
710 b.bodyExpr = serializeConstExpr(_localClosureIndexMap, body.expression); 725 b.bodyExpr = serializeConstExpr(
726 _localClosureIndexMap, body.expression, _parameterNames);
711 } else { 727 } else {
712 // TODO(paulberry): serialize other types of function bodies. 728 // TODO(paulberry): serialize other types of function bodies.
713 } 729 }
714 } 730 }
715 b.localFunctions = executables; 731 b.localFunctions = executables;
716 b.localLabels = labels; 732 b.localLabels = labels;
717 b.localVariables = variables; 733 b.localVariables = variables;
718 Map<int, int> localClosureIndexMap = _localClosureIndexMap; 734 Map<int, int> localClosureIndexMap = _localClosureIndexMap;
719 executables = oldExecutables; 735 executables = oldExecutables;
720 labels = oldLabels; 736 labels = oldLabels;
(...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 /** 1376 /**
1361 * A [_TypeParameterScope] is a [_Scope] which defines [_ScopedTypeParameter]s. 1377 * A [_TypeParameterScope] is a [_Scope] which defines [_ScopedTypeParameter]s.
1362 */ 1378 */
1363 class _TypeParameterScope extends _Scope { 1379 class _TypeParameterScope extends _Scope {
1364 /** 1380 /**
1365 * Get the number of [_ScopedTypeParameter]s defined in this 1381 * Get the number of [_ScopedTypeParameter]s defined in this
1366 * [_TypeParameterScope]. 1382 * [_TypeParameterScope].
1367 */ 1383 */
1368 int get length => _definedNames.length; 1384 int get length => _definedNames.length;
1369 } 1385 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/summary/resynthesize.dart ('k') | pkg/analyzer/lib/src/summary/summarize_const_expr.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698