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

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

Issue 2655463004: Fix summary type inference of async closures. (Closed)
Patch Set: Remove bogusly added test Created 3 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 | « no previous file | pkg/analyzer/test/src/summary/resynthesize_ast_test.dart » ('j') | 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) 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 /** 5 /**
6 * This library is capable of producing linked summaries from unlinked 6 * This library is capable of producing linked summaries from unlinked
7 * ones (or prelinked ones). It functions by building a miniature 7 * ones (or prelinked ones). It functions by building a miniature
8 * element model to represent the contents of the summaries, and then 8 * element model to represent the contents of the summaries, and then
9 * scanning the element model to gather linked information and adding 9 * scanning the element model to gather linked information and adding
10 * it to the summary data structures. 10 * it to the summary data structures.
(...skipping 2844 matching lines...) Expand 10 before | Expand all | Expand 10 after
2855 _functions ??= _variable.unlinkedVariable.initializer.localFunctions 2855 _functions ??= _variable.unlinkedVariable.initializer.localFunctions
2856 .map((UnlinkedExecutable ex) => 2856 .map((UnlinkedExecutable ex) =>
2857 new FunctionElementForLink_Local_NonSynthetic( 2857 new FunctionElementForLink_Local_NonSynthetic(
2858 _variable.compilationUnit, this, ex)) 2858 _variable.compilationUnit, this, ex))
2859 .toList(); 2859 .toList();
2860 2860
2861 @override 2861 @override
2862 String get identifier => ''; 2862 String get identifier => '';
2863 2863
2864 @override 2864 @override
2865 bool get isAsynchronous => _unlinkedExecutable.isAsynchronous;
2866
2867 @override
2865 DartType get returnType { 2868 DartType get returnType {
2866 // If this is a variable whose type needs inferring, infer it. 2869 // If this is a variable whose type needs inferring, infer it.
2867 if (_variable.hasImplicitType) { 2870 if (_variable.hasImplicitType) {
2868 return _variable.inferredType; 2871 return _variable.inferredType;
2869 } else { 2872 } else {
2870 // There's no reason linking should need to access the type of 2873 // There's no reason linking should need to access the type of
2871 // this FunctionElement, since the variable doesn't need its 2874 // this FunctionElement, since the variable doesn't need its
2872 // type inferred. 2875 // type inferred.
2873 assert(false); 2876 assert(false);
2874 // But for robustness, return the dynamic type. 2877 // But for robustness, return the dynamic type.
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
2990 Element enclosing = this.enclosingElement; 2993 Element enclosing = this.enclosingElement;
2991 if (enclosing is ExecutableElement) { 2994 if (enclosing is ExecutableElement) {
2992 int id = 2995 int id =
2993 ElementImpl.findElementIndexUsingIdentical(enclosing.functions, this); 2996 ElementImpl.findElementIndexUsingIdentical(enclosing.functions, this);
2994 identifier += "@$id"; 2997 identifier += "@$id";
2995 } 2998 }
2996 return identifier; 2999 return identifier;
2997 } 3000 }
2998 3001
2999 @override 3002 @override
3003 bool get isAsynchronous => _unlinkedExecutable.isAsynchronous;
3004
3005 @override
3000 bool get _hasTypeBeenInferred => _inferredReturnType != null; 3006 bool get _hasTypeBeenInferred => _inferredReturnType != null;
3001 3007
3002 @override 3008 @override
3003 DartType buildType( 3009 DartType buildType(
3004 DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) { 3010 DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
3005 assert(implicitFunctionTypeIndices.isEmpty); 3011 assert(implicitFunctionTypeIndices.isEmpty);
3006 return type; 3012 return type;
3007 } 3013 }
3008 3014
3009 @override 3015 @override
(...skipping 1632 matching lines...) Expand 10 before | Expand all | Expand 10 after
4642 List<TypeInferenceNode> dependencies = <TypeInferenceNode>[]; 4648 List<TypeInferenceNode> dependencies = <TypeInferenceNode>[];
4643 collectDependencies(dependencies, functionElement._unlinkedExecutable, 4649 collectDependencies(dependencies, functionElement._unlinkedExecutable,
4644 functionElement.compilationUnit); 4650 functionElement.compilationUnit);
4645 return dependencies; 4651 return dependencies;
4646 } 4652 }
4647 4653
4648 void evaluate(bool inCycle) { 4654 void evaluate(bool inCycle) {
4649 if (inCycle) { 4655 if (inCycle) {
4650 functionElement._setInferredType(DynamicTypeImpl.instance); 4656 functionElement._setInferredType(DynamicTypeImpl.instance);
4651 } else { 4657 } else {
4652 functionElement 4658 var bodyType = new ExprTypeComputer(functionElement).compute();
4653 ._setInferredType(new ExprTypeComputer(functionElement).compute()); 4659 if (functionElement.isAsynchronous) {
4660 var linker = functionElement.compilationUnit.library._linker;
4661 var typeProvider = linker.typeProvider;
4662 var typeSystem = linker.typeSystem;
4663 bodyType = typeProvider.futureType
4664 .instantiate([bodyType.flattenFutures(typeSystem)]);
4665 }
4666 functionElement._setInferredType(bodyType);
4654 } 4667 }
4655 } 4668 }
4656 4669
4657 @override 4670 @override
4658 String toString() => 'TypeInferenceNode($functionElement)'; 4671 String toString() => 'TypeInferenceNode($functionElement)';
4659 } 4672 }
4660 4673
4661 class TypeProviderForLink extends TypeProviderBase { 4674 class TypeProviderForLink extends TypeProviderBase {
4662 final Linker _linker; 4675 final Linker _linker;
4663 4676
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
4970 * there are no type parameters in scope. 4983 * there are no type parameters in scope.
4971 */ 4984 */
4972 TypeParameterizedElementMixin get _typeParameterContext; 4985 TypeParameterizedElementMixin get _typeParameterContext;
4973 4986
4974 @override 4987 @override
4975 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); 4988 noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
4976 4989
4977 @override 4990 @override
4978 String toString() => '$enclosingElement.$name'; 4991 String toString() => '$enclosingElement.$name';
4979 } 4992 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/src/summary/resynthesize_ast_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698